我有一个数据帧,一个带有因变量的向量。例如:
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))
我设法通过添加“$ coefficients”来提取系数,如下所示:
lm.list <- apply(x,1, function(x) lm(x ~ y)$coefficients)
然后我得到每行的系数。现在我想知道这些系数的重要性。所以我需要提取t值,标准误差或p值。我不知道该怎么做,我不想为每一行1运行lm函数并复制粘贴t值。有没有办法做到这一点?
作为一个额外的问题:是否有可能将Newey-West标准误差用于每行的系数计算?我知道它对于单个lms是如何工作的,但是无法找到一种方法来将它与许多行的apply函数一起使用。
提前致谢!
答案 0 :(得分:2)
对于那些类型的操作,使用列表更容易,因此lapply
族。
首先注意:你的a,b,c是变量,而不是记录 - &gt;这是一个奇怪的想法来反对它们而不是cbind或实际上创建一个数据集来保存它们,如:
data=data.frame(a,b,c)
请注意,data.frame是一个列表 - &gt;我们可以调用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 y -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