使用lm
参数在lapply
内调用weights
时,我遇到了一种奇怪的行为。
我的代码由一个公式列表组成,我在其中运行一个我在lapply
中调用的线性模型。到目前为止,它正在运作:
dd <- data.frame(y = rnorm(100),
x1 = rnorm(100),
x2 = rnorm(100),
x3 = rnorm(100),
x4 = rnorm(100),
wg = runif(100,1,100))
ls.form <- list(
formula(y~x1+x2),
formula(y~x3+x4),
formula(y~x1|x2|x3),
formula(y~x1+x2+x3+x4)
)
res.no.wg <- lapply(ls.form, lm, data = dd)
但是,当我添加weights
参数时,我得到一个奇怪的错误:
res.with.wg <- lapply(ls.form, lm, data = dd, weights = dd[,"wg"])
Error in eval(extras, data, env) :
..2 used in an incorrect context, no ... to look in
如果来自...
的{{1}}与lapply
调用的...
发生冲突,只是因为lm
参数。
任何想法是这个问题的原因以及如何解决它?
注意:使用不weights
的呼叫可以按预期工作:
lapply
编辑最终通话是lm(ls.form[[1]], data = dd, weights = dd[,"wg"] )
Call:
lm(formula = ls.form[[1]], data = dd, weights = dd[, "wg"])
Coefficients:
(Intercept) x1 x2
-0.12020 0.06049 -0.01937
类型中的lapply
:
function
答案 0 :(得分:11)
我不确定为什么它不起作用,但我认为我有一个解决方法:
res.with.wg2 <- lapply(ls.form,
function(x) {lm(formula = x, data=dd, weights=dd[,"wg"])})
希望这有帮助!
答案 1 :(得分:5)
lapply
的帮助文件中有一条注释:
由于历史原因,lapply创建的调用未被评估, 并且代码已经被写入(例如,bquote),依赖于此。这个 表示录制的呼叫始终为FUN(X [[i]],...)形式, 用i替换当前(整数或双精度)索引。这不是 通常是一个问题,但如果FUN使用sys.call或match.call 或者如果它是使用该调用的原始函数。这个 意味着用a调用原始函数通常更安全 包装,所以例如lapply(ll,function(x)is.numeric(x))是 需要确保发生is.numeric的方法分派 正确。
lm
在其开头行中使用match.call
两次:
cl <- match.call()
mf <- match.call(expand.dots = FALSE)
帮助文件和@Florian中提到的解决方案是使用匿名函数包装器。
更新
对于此更改模型公式的具体问题,您可以重写以避免使用lm
在lapply
内调用update
:
# create base model (the formula here doesn't really matter, but we can specify the weights safely here)
baselm <- lm(y+x1,data=dd,weights=dd[,"wg"])
# update with lapply
lapply(ls.form,update,object=baselm)
[[1]]
Call:
lm(formula = y ~ x1 + x2, data = dd, weights = dd[, "wg"])
Coefficients:
(Intercept) x1 x2
0.07561 0.16111 0.15014
...