首页 文章

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

提问于
浏览
2

我正在尝试使用单个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中的错误(formula = eval(i)~x1 x2,drop.unused.levels = TRUE):变量长度不同(找到'x1')

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

1 回答

  • 1

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

    假设“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"]]
    

    Output:

    # label (Intercept)         x1         x2
    # 1:     a   1.0189543 -1.3744124 -1.8500784
    # 2:     b  -1.7325901  0.6330311  0.7848932
    # 3:     c   0.3497773 -0.9138042  0.7833840
    # > models[["resp2"]]
    # label (Intercept)         x1        x2
    # 1:     a -0.89177938  1.1053718 0.8886103
    # 2:     b -0.45480510 -0.5146982 1.5587663
    # 3:     c -0.04379456 -0.9792022 0.8691384
    

相关问题