使用`weights`参数

时间:2017-12-20 13:54:39

标签: r lapply lm

使用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

2 个答案:

答案 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中提到的解决方案是使用匿名函数包装器。

更新

对于更改模型公式的具体问题,您可以重写以避免使用lmlapply内调用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  

...