循环回归模型术语的组合

Bet*_*eta 1 r apply lm

我在表单中运行回归

reg=lm(y ~ x1+x2+x3+z1,data=mydata)
Run Code Online (Sandbox Code Playgroud)

在最后一个术语的位置z1,我想循环遍历一组不同的变量,z1通过z10为每个变量运行一个回归作为最后一个术语.例如,在第二次运行中我想使用

reg=lm(y ~ x1+x2+x3+z2,data=mydata)
Run Code Online (Sandbox Code Playgroud)

在第三轮:

reg=lm(y ~ x1+x2+x3+z3,data=mydata)
Run Code Online (Sandbox Code Playgroud)

如何通过循环遍历z变量列表来自动执行此操作?

Ale*_* A. 6

虽然Sam所提供的是有效的并且是一个很好的解决方案,但我个人更愿意稍微改变一下.他的答案已被接受,所以我只是为了完整而发布这个.

dat1 <- data.frame(y = rpois(100, 5),
                   x1 = runif(100),
                   x2 = runif(100),
                   x3 = runif(100),
                   z1 = runif(100),
                   z2 = runif(100))

lapply(colnames(dat1)[5:6],
       function(x, d) lm(as.formula(paste("y ~ x1 + x2 + x3", x, sep = " + ")), data = d),
       d = dat1)
Run Code Online (Sandbox Code Playgroud)

它不是循环遍历数据框的实际列,而是仅循环遍历名称字符串.这提供了一些速度改进,因为在迭代之间复制的东西更少.

library(microbenchmark)

microbenchmark({ lapply(<what I wrote above>) })
# Unit: milliseconds
# expr
# {lapply(colnames(dat1)[5:6], function(x, d) lm(as.formula(paste("y ~ x1 + x2 + x3", x, sep = "+")), data = d), d = dat1)}
#       min       lq     mean   median       uq      max neval
#  4.014237 4.148117 4.323387 4.220189 4.281995 5.898811   100

microbenchmark({ lapply(<other answer>) })
# Unit: milliseconds
# expr
# {lapply(dat1[, 5:6], function(x) lm(dat1$y ~ dat1$x1 + dat1$x2 + dat1$x3 + x))}
#       min       lq     mean   median       uq    max neval
#  4.391494 4.505056 5.186972 4.598301 4.698818 51.573   100
Run Code Online (Sandbox Code Playgroud)

这个玩具示例的差异相当小,但随着观察和预测变量的增加,差异可能会变得更加明显.