数据表中回归模型作为列,R

3

我在尝试在运行一些回归模型时,找到如何使用数据表的能力。

这是一个简化的工作案例:

# given a data table containing desired variables
MyVarb <- data.table(Y=rnorm(100),
                 V1=rnorm(100),
                 V2=rnorm(100))

# given a new data table containing a series of formulas/equations in a column
DT <- data.table(eq=c("Y ~ V1", "Y ~ V2", "Y ~ V1 + V2"))

# I store the linear regression models in a second column
DT[, "models" := lapply(eq, function(i) lm(i, data=MyVarb))]

# Now, I can access the coefficients of a model (e.g. the 3rd one) like:
DT[3, models][[1]]$coefficients
(Intercept)          V1          V2 
-0.01583034  0.08284029  0.01630247 

然而,我想知道是否有其他的方法。 这种方式并不能达到预期效果:

DT[, "trial" := lm(eq, data=MyVarb)]
# ***sorry for my bad understanding of data tables and objects***

我很好奇,想运行数千个模型,但变量很多,因此在数据表“DT”内使用lapply太费时间(在我的电脑上要几个小时,然后我就没有了8GB的RAM...)。有没有更快的编码方法?

我将非常感激您的帮助。


你需要存储整个模型对象吗?如果是的话,为什么?通常只需要存储系数和一些统计数据就足够了。无论如何,你限制速度的部分实际上是lm和在lm中解析公式的过程。寻找替代方案(有一些)。如果你能自己创建设计矩阵并使用lm.fit,那将会非常快速。 - Roland
1
是的,lapply 是将它们存储在每一行中的方法。"trial" := lm(eq, data=MyVarb) 不起作用,因为 lm 不接受方程向量。为避免内存问题,您可以使用循环(因此一次只处理一个模型);但我想成千上万个回归模型总是会带来麻烦... - Frank
@Roland,我实际上对系数、p值和AIC很感兴趣。无论如何,我正在考虑将模型存储为这样...以防未来查询或其他情况。 - Valentin_Ștefan
使用str检查lm对象,您会发现它是一个相当大的对象。存储成千上万个这样的对象“以防万一”并不是一个好主意。 - Roland
@Frank,你是指像这样的循环吗?:for (i in 1:nrow(DT)) set(DT, j="trial", value = list(model=list(lm(DT[,eq][i], data=MyVarb)))) - Valentin_Ștefan
是的,这正是我所想的。 - Frank
1个回答

3
如果您只需要系数、p值和AIC,那么这个方法可以正常工作,而不会使用大量内存来存储lm对象的不必要的部分。
MyVarb <- data.table(Y=rnorm(100),
                     V1=rnorm(100),
                     V2=rnorm(100))
eq=c("Y ~ V1", "Y ~ V2", "Y ~ V1 + V2")
DT<-rbindlist(lapply(eq, function(mod) {
  reg<-lm(mod, data=MyVarb)
  dt<-data.table(summary(reg)$coefficients)
  dt[,coef:=row.names(summary(reg)$coefficients)]
  dt[,aic:=AIC(reg)]
  dt[,model:=mod]


})) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接