2016-05-14 20 views
1

我有一個數據幀和一個因變量的向量。例如像這樣:R - 從多個lms列表中提取t值

a <- rnorm(100,1,1) 
b <- rnorm(100,2,2) 
c <- rnorm(100,3,3) 
x <- rbind(a,b,c) 

y <- rnorm(100,5,10) 

現在我需要爲每一行運行線性迴歸。我這樣做是這樣的:

lm.list <- apply(x,1, function(x) lm(x ~ y)) 

我設法通過添加「$係數」這樣的提取係數:

lm.list <- apply(x,1, function(x) lm(x ~ y)$coefficients) 

然後我得到的係數的每一行。現在我想知道這些係數的重要性。所以我需要提取t值,標準誤差或p值。我不知道該怎麼做,我不想爲每行1乘1運行lm函數並複製粘貼t值。有沒有辦法做到這一點?

作爲一個額外的問題:是否有可能使用Newey-West標準誤差來計算每行的係數?我知道它是如何工作的單個lms,但無法找到一種方法來將它用於許多行的apply函數。

在此先感謝!

回答

2

對於這些類型的操作,使用列表和lapply系列更容易。 首先要注意:你的A,B,C的變量,而不是記錄 - >這是一個奇怪的想法來rbind他們的cbind或事實上不是創建一個數據集來保存它們,如:

data=data.frame(a,b,c) 

注意一個data.frame是一個列表 - >我們可以lapply調用:

lm.list=lapply(data,FUN=function(x) lm(x~y)) 

(順便說一句,通常是一個具有Y〜X,而不是相反)

那麼,我們有這麼遠嗎?每個元件保持lm類的對象列表 - 基本上是一個組件列表,看看例如在:

> names(lm.list[["a"]]) 
[1] "coefficients" "residuals"  "effects"  "rank"   "fitted.values" "assign"  "qr"   "df.residual" 
[9] "xlevels"  "call"   "terms"   "model" 

您可以提取值超出此:

> (coeffs=sapply(lm.list, FUN=function(item){item$coefficients})) 
        a   b   c 

(攔截)1.36869810 1.759809965 3.16491826 Ÿ-0.01885792 0.002648734 -0.02690408

如果你想有t值和lm對象關聯,你要求它summary。讓我們做這整個名單上lapply

lm.list.summary = lapply(lm.list,summary) 

不要忘記str功能檢查對象的結構/內容:

str(lm.list.summary[[1]]) 

然後,它只是一個路徑正確地將設置你事想要提取的,如:

y.tval = sapply(lm.list.summary, FUN=function(item){item$coefficients["y","t value"]}) 
y.tval 
     a   b   c 
-1.7599765 0.1366731 -0.7998487 
+0

非常感謝您的好解釋!那就是我想要的!謝謝! – Zwaffel