2016-05-14 17 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