我在尝试在运行一些回归模型时,找到如何使用数据表的能力。
这是一个简化的工作案例:
# 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
,那将会非常快速。 - Rolandlapply
是将它们存储在每一行中的方法。"trial" := lm(eq, data=MyVarb)
不起作用,因为lm
不接受方程向量。为避免内存问题,您可以使用循环(因此一次只处理一个模型);但我想成千上万个回归模型总是会带来麻烦... - Frankstr
检查lm
对象,您会发现它是一个相当大的对象。存储成千上万个这样的对象“以防万一”并不是一个好主意。 - Rolandfor (i in 1:nrow(DT)) set(DT, j="trial", value = list(model=list(lm(DT[,eq][i], data=MyVarb))))
- Valentin_Ștefan