2012-11-16 78 views
2

我正在嘗試對〜400k個預測變量中的每一個運行多個邏輯迴歸分析。我想將每次運行的輸出捕獲到輸出表的行/列中。R中的高效循環邏輯迴歸

我的數據分爲兩部分。我有一個400000 x 189的雙矩陣(mydatamatrix),其中包含我在189個人(P1)中測量的每個400000個預測變量的每個觀察值/數據。我還有第二個189 x 20數據幀(mydataframe),其中包含結果變量和另一個預測變量(O1P2)以及另外18個未在此特定分析中使用的變量。

我的迴歸模型是O1~ P1+P2,其中O1是二元的。

我得到了下面的循環工作:

創建結果

output<-data.frame(matrix(nrow=400000, ncol=4)) 
names(output)=c("Estimate", " Std. Error", " z value", " Pr(>|z|)") 

運行迴歸環路i預測和存儲輸出輸出文件輸出文件

for (i in c(1:400000)){ 
    result<-(glm(mydataframe$O1 ~ mydatamatrix[,i] + as.factor(mydataframe$P2), 
       family=binomial)) 
    row.names(output)<-row.names(mydatamatrix) 
    output[i,1]<-coef(summary(result))[2,1] 
    output[i,2]<-coef(summary(result))[2,2] 
    output[i,3]<-coef(summary(result))[2,3] 
    output[i,4]<-coef(summary(result))[2,4] 
} 

然而,運行時間很長(輸出第一個20k測試花了一個多小時)。是否有更有效的方法來運行此分析?

+1

我實際的建議很可能是一個有點失望:不這樣做的。對每個變量運行400k迴歸不太可能產生太多有用的信息。至少,我會研究一些處罰變量選擇的迴歸方法,如套索或LARS。 – joran

回答

1

這將是更快,如果你使用apply代替for循環:

t(apply(mydatamatrix, 2, 
     function(x) 
      coef(summary(glm(mydataframe$O1 ~ x + as.factor(mydataframe$P2), 
          family=binomial)))[2, 1:4])) 
+0

只要他們預先分配了結果對象,'apply'就不太可能會產生顯着的速度增益,而不是(寫得很好的)for循環。 – joran

+0

@joran同意,但我認爲速度增益僅與四次使用「coef」和「summary」有關。 –

+0

沒錯,我只是懷疑(但願意被證明是另外的),考慮到這裏的總時間尺度(幾小時,似乎),即使那個速度增益會很小。 – joran