我在R中编写一个函数来评估模型的拟合,但每个模型都采用相同的参数.如何避免对模型的每次调用重复相同的参数?
这里的论点可能更清楚
data=data,
na.action = na.exclude,
subset = block == site)
Run Code Online (Sandbox Code Playgroud)
重复.
modelfit <- function(order, response, predictor, site) {
if(order == 0) {
m <- lm(response ~ 1,
data=data,
na.action = na.exclude,
subset = block == site)
} else if (is.numeric(order)) {
m <- lm(response ~ poly(predictor, order),
data=data,
na.action = na.exclude,
subset = block == site)
} else if (order == 'monod') {
x<-predictor
m <- nls(response ~ a*x/(b+x),
start = list(a=1, b=1),
data=data,
na.action = na.exclude,
subset = block == site)
} else if (order == 'log') {
m <- lm(response ~ poly(log(predictor), 1),
data=data,
na.action = na.exclude,
subset = block == site)
}
AIC(m)
}
Run Code Online (Sandbox Code Playgroud)
关于更好地解决这个问题的其他建议总是受到赞赏
你可以用这个...成语来做到这一点.您...在函数的参数定义中包含,然后在lm()调用include中...作为额外参数.该...有效是所有你要传递额外的参数的占位符.以下是使用此方法的函数修改(未经测试):
modelfit <- function(order, response, predictor, site, ...) {
if(order == 0) {
m <- lm(response ~ 1, ...)
} else if (is.numeric(order)) {
m <- lm(response ~ poly(predictor, order), ...)
} else if (order == 'monod') {
x<-predictor
m <- nls(response ~ a*x/(b+x), start = list(a=1, b=1), ...)
} else if (order == 'log') {
m <- lm(response ~ poly(log(predictor), 1), ...)
}
AIC(m)
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以调用此函数并提供重复的参数来代替...:
with(myData, modelfit(2, myResponse, myPredictor, mySite, data = myData,
na.action = na.exclude, subset = block == mySite))
Run Code Online (Sandbox Code Playgroud)
在哪里myResponse,myPredictor以及mySite您要使用的变量是否存在于myData数据框中.