分割和运行线性回归 - 使用 data.table

Ken*_*Ken 3 regression r data.table

我问过之前的问题(分割数据和运行线性回归循环),并且使用 tidyverse 和管道提供了一个很好的解决方案。我保存了数据中 4,000 个“键”的参数 p 值,将它们放入单独的数据帧中,然后运行一些直方图和其他视觉效果来检查 4,000 个键中每个键的参数的重要性。这在我运行它的前几次是有效的,但是在不同的参数/预测器上运行完全相同的代码,我不断收到一条错误消息:

Error in summary(lm(y1 ~ x1 + x2 ))$coefficients['x1', : subscript out of bounds

如果我在该键上运行单个模型并查看摘要,p值肯定存在于位置[x1,4]或中[2,4],但它不会在模型中返回。[3,4]有时它会运行,但随后会在或[4,4]等 上崩溃。

有人认为 tidyverse 正在杀死记忆,从而将其炸毁。我知道这不是代码,因为它有时会起作用,或者有时会比其他时候进步得更多,但它看起来很奇怪。那么,data.table循环整个数据集是更好的解决方案吗?我不熟悉如何链接在一起data.table,因此如何重新创建以下代码,用于data.table在我拥有的 4,000 个键和 10 多个参数上运行模型。

df
Key y1 x1 x2
A   10 1  3
A   11 2  4 
A   12 3  5
B   13 4  6 
B   14 5  7
B   15 6  8
C   16 7  9 
C   17 8  1
C   18 9  2

df %>% group_by(Key) %>%
  summarise(Intercept = lm(y1 ~ x1 + x2)$coefficients[1],
            Coeff_x1 = lm(y1 ~ x1 + x2)$coefficients[2],
            Coeff_x2 = lm(y1 ~ x1 + x2)$coefficients[3],
            R2 = summary(lm(y1 ~ x1 + x2))$r.squared,
            pvalue = summary(lm(y1 ~ x1 + x2))$coefficients["x1",4])

# A tibble: 3 x 6
  Key   Intercept Coeff_x1  Coeff_x2    R2     pvalue
  <chr>     <dbl>    <dbl>     <dbl> <dbl>      <dbl>
1 A            9.     1.00 NA            1   8.00e-16
2 B            9.     1.00 NA            1   7.00e-16
3 C            9.     1.00  7.86e-16     1 NaN

Run Code Online (Sandbox Code Playgroud)

Col*_*ole 5

这是一种相对直接的方法,它将中间结果(例如,lm(...)和 )分配summary(lm(...))给临时变量:

dt[, {LM = lm(y1 ~ x1 + x2, data = .SD)
      LM.summary = summary(LM)
    list(Intercept = LM$coefficients[1],
         Coeff_x1 = LM$coefficients[2],
         Coeff_x2 = LM$coefficients[3],
         R2 = LM.summary$r.squared,
         pvalue.x1 = LM.summary$coefficients["x1", 4],
         pvalue.x2 = LM.summary$coefficients["x2", 4])
    },
   by = Key]
Run Code Online (Sandbox Code Playgroud)

允许{}创建中间对象。然后我们只返回我们真正想要的列表。

数据:

library(data.table)
dt = fread('Key y1 x1 x2
A   10 1  3
A   11 2  4 
A   12 3  5
A   13 4  5
B   13 4  6 
B   14 5  7
B   15 6  8
B   15 5  9
C   16 7  9 
C   17 8  1
C   18 9  2
C   18 9  2')
Run Code Online (Sandbox Code Playgroud)