我在R中编写一个函数来评估模型的拟合,但每个模型都采用相同的参数。如何避免对模型的每次调用重复相同的参数?
这里可能更清楚,参数
data=data,
na.action = na.exclude,
subset = block == site)
重复。
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)
}
有关更好地解决这个问题的其他建议总是受到赞赏。
答案 0 :(得分:5)
您可以使用...
成语来执行此操作。您在函数的参数定义中包含...
,然后在lm()
调用包括...
作为额外参数。 ...
实际上是您希望传递的所有额外参数的占位符。以下是使用此方法的函数修改(未经测试):
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)
}
然后调用此函数并提供重复的参数来代替...
:
with(myData, modelfit(2, myResponse, myPredictor, mySite, data = myData,
na.action = na.exclude, subset = block == mySite))
其中myResponse
,myPredictor
和mySite
是您要在myData
数据框中使用存在的变量。
答案 1 :(得分:2)
我想用一个简单的例子澄清加文答案中的一点:
以下是数据框d
:
d <- data.frame(x1 = c(1, 1, 1, 1, 2, 2, 2, 2),
x2 = c(1, 1, 1, 2, 1, 1, 1, 2),
y = c(1, 1, 3, 4, 5, 6, 7, 8))
这是一个功能:
mf <- function(response, predictor, ...) {
lm(response~predictor, ...)
}
请注意
mf(d$y, d$x1, subset = d$x2 == 1, data = d)
有效,但
mf(y, x1, subset = x2 == 1, data = d)
没有。