我有一个数据框,一个带有因变量的向量。例如这样:
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 × 1 运行 lm 函数并复制粘贴 t 值。有没有办法做到这一点?
还有一个额外的问题:是否可以使用 Newey-West 标准误差来计算每行的系数?我知道它如何用于单个 lms,但找不到将其与多行的 apply 函数一起使用的方法。
提前致谢!
最佳答案
对于这些类型的操作,使用列表和 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 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
关于R - 从多个 lm 列表中提取 t 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37227146/