多个线性回归模型使用data.table和模式与grep

时间:2017-05-23 10:27:11

标签: r data.table regression

我正在尝试使用单个data.table使用模式grep()运行多个线性回归模型,并使用by=将模型应用于表的每个部分

这是我到目前为止所得到的。

 d <- data.table(label=rep(c('a','b','c'),
c(10,10,10)),resp1=rnorm(30),resp2=rnorm(30),x1=runif(30),x2=runif(30))

    for (i in grep('resp',names(d),value = TRUE)) {

    models[i] <- d[,as.list(coef(lm(i ~ x1 + x2 ))),by=label]} 

然后我收到以下错误:

  

model.frame.default中的错误(公式= eval(i)~x1 + x2,   drop.unused.levels = TRUE):变量长度不同(找到   'X1')

我确定我错过了一些非常明显的东西..我可以看到by参数在使用循环时不起作用?

1 个答案:

答案 0 :(得分:1)

您应该进行以下更改,以使其在data.table内有效。您的设置问题是i在for循环中转换为"resp1"(带引号的resp1),这对于公式来说是不可取的,对于data.table也是如此 lm尝试在提供的公式的环境中使用的变量。由于lm参数中没有“data”元素,因此R无法确定这些变量将来自哪个地方/环境,您需要提供.SD(data.table中的数据子集),这可以在data.table中的第二个表达式元素中找到(我们通常将其称为j表达式),因此您必须使用$或{{1}明确地在这里。

假设“d”是您的data.table,请执行以下操作:

[[

要调用他们的值,您需要这样做:

models <- list()  ###Initialize the list where you want to save your outcome.
for (i in grep('resp',names(d),value = TRUE)) { 
  models[[i]] <- d[,as.list(coef(lm(.SD[[i]] ~ .SD$x1 + .SD$x2 ))),by=label]
} 

<强>输出:

models[["resp1"]]  and/or  models[["resp2"]]