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)
这是一种相对直接的方法,它将中间结果(例如,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)