R 多元回归循环和提取系数
R Multiple Regression Loop and Extract Coefficients
我必须对同一自变量矩阵上的许多因变量向量执行多元线性回归。
例如,我想创建 3 个模型:
lm( d ~ a + b + c )
lm( e ~ a + b + c )
lm( f ~ a + b + c )
来自以下矩阵(a,b,c是自变量,d,e,f是因变量)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] a1 b1 c1 d1 e1 f1
[2,] a2 b2 c2 d2 e2 f2
[3,] a3 b3 c3 d3 e3 f3
然后我想将回归的系数存储在另一个矩阵中(为了便于解释,我减少了示例中的列数和向量数)。
这里有一个方法不是很通用,但是如果你在 depvar
中替换你自己的因变量名称,当然还有内部所有模型通用的自变量 lm()
调用,当然还有数据集名称。在这里,我在 mtcars
上演示了 R 提供的内置数据集。
depvar <- c("mpg", "disp", "qsec")
regresults <- lapply(depvar, function(dv) {
tmplm <- lm(get(dv) ~ cyl + hp + wt, data = mtcars)
coef(tmplm)
})
# returns a list, where each element is a vector of coefficients
# do.call(rbind, ) will paste them together
allresults <- data.frame(depvar = depvar,
do.call(rbind, regresults))
# tidy up name of intercept variable
names(allresults)[2] <- "intercept"
allresults
## depvar intercept cyl hp wt
## 1 mpg 38.75179 -0.9416168 -0.01803810 -3.166973
## 2 disp -179.04186 30.3212049 0.21555502 59.222023
## 3 qsec 19.76879 -0.5825700 -0.01881199 1.381334
根据@Mike Wise 的建议编辑:
如果您只需要一个数字数据集但想保留标识符,您可以将其添加为 row.name,如下所示:
allresults <- data.frame(do.call(rbind, regresults),
row.names = depvar)
# tidy up name of intercept variable
names(allresults)[1] <- "intercept"
allresults
## intercept cyl hp wt
## mpg 38.75179 -0.9416168 -0.01803810 -3.166973
## disp -179.04186 30.3212049 0.21555502 59.222023
## qsec 19.76879 -0.5825700 -0.01881199 1.381334
实际上我最近遇到了同样的问题,一个快速简便的解决方法是简单地手动将所有结果添加到具有系数函数的数据框中。
coeffdf <- data.frame(coefficients(lm1),coefficients(lm2))
如果您对每个回归使用相同的变量,效果会很好。
我必须对同一自变量矩阵上的许多因变量向量执行多元线性回归。
例如,我想创建 3 个模型:
lm( d ~ a + b + c )
lm( e ~ a + b + c )
lm( f ~ a + b + c )
来自以下矩阵(a,b,c是自变量,d,e,f是因变量)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] a1 b1 c1 d1 e1 f1
[2,] a2 b2 c2 d2 e2 f2
[3,] a3 b3 c3 d3 e3 f3
然后我想将回归的系数存储在另一个矩阵中(为了便于解释,我减少了示例中的列数和向量数)。
这里有一个方法不是很通用,但是如果你在 depvar
中替换你自己的因变量名称,当然还有内部所有模型通用的自变量 lm()
调用,当然还有数据集名称。在这里,我在 mtcars
上演示了 R 提供的内置数据集。
depvar <- c("mpg", "disp", "qsec")
regresults <- lapply(depvar, function(dv) {
tmplm <- lm(get(dv) ~ cyl + hp + wt, data = mtcars)
coef(tmplm)
})
# returns a list, where each element is a vector of coefficients
# do.call(rbind, ) will paste them together
allresults <- data.frame(depvar = depvar,
do.call(rbind, regresults))
# tidy up name of intercept variable
names(allresults)[2] <- "intercept"
allresults
## depvar intercept cyl hp wt
## 1 mpg 38.75179 -0.9416168 -0.01803810 -3.166973
## 2 disp -179.04186 30.3212049 0.21555502 59.222023
## 3 qsec 19.76879 -0.5825700 -0.01881199 1.381334
根据@Mike Wise 的建议编辑:
如果您只需要一个数字数据集但想保留标识符,您可以将其添加为 row.name,如下所示:
allresults <- data.frame(do.call(rbind, regresults),
row.names = depvar)
# tidy up name of intercept variable
names(allresults)[1] <- "intercept"
allresults
## intercept cyl hp wt
## mpg 38.75179 -0.9416168 -0.01803810 -3.166973
## disp -179.04186 30.3212049 0.21555502 59.222023
## qsec 19.76879 -0.5825700 -0.01881199 1.381334
实际上我最近遇到了同样的问题,一个快速简便的解决方法是简单地手动将所有结果添加到具有系数函数的数据框中。
coeffdf <- data.frame(coefficients(lm1),coefficients(lm2))
如果您对每个回归使用相同的变量,效果会很好。