2015-11-13 56 views
2

我正在努力尋找一種方法,在運行某些迴歸模型時如何使用數據表的強大功能。迴歸模型作爲數據表中的列,R

這裏是一個簡化的工作情況:

# 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*** 

我很好奇,我想運行數以千計的模型,還有更多的變量,因此它是使用lapply數據表DT內耗時(情侶幾小時在我的電腦上,然後我用完了8Gb的內存......)。有沒有辦法如何更快地編寫代碼?

我希望你的善意幫助。

+0

你需要存儲整個模型對象一堆內存只需要係數,p值和AIC那麼這是否行得通呢?如果是,爲什麼?通常存儲係數和一些統計數據就足夠了。無論如何,你的速度限制部分實際上是'lm'並且解析了'lm'中的公式。尋找替代品(有一些)。如果你可以自己創建設計矩陣並使用'lm.fit',那將是相當快的。 – Roland

+1

是的,'lapply'是存儲它們的方式,每行一個。 '「trial」:= lm(eq,data = MyVarb)'不起作用,因爲lm'不包含方程向量。爲了避免內存問題,你可以使用循環(所以一次只能處理一個模型);但我猜成千上萬的迴歸模型總是意味着麻煩... – Frank

+0

@Roland,我真的對係數,p值和AIC感興趣。無論如何,我正在考慮存儲這些模型......以防未來的查詢等等。 – Valentin

回答

0

如果您在不使用就存儲了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] 


}))