我想知道我是否可以使用for循环或应用函数在R中进行线性回归 . 我有一个包含变量的数据框,如crim,rm,ad,wd . 我想对每个其他变量进行简单的crim线性回归 .
谢谢!
如果你真的想这样做,那对于 lapply() 来说是非常微不足道的,我们在 df 的其他列上使用"loop" . 自定义函数依次将每个变量视为 x ,并且适合该协变量的模型 .
lapply()
df
x
df <- data.frame(crim = rnorm(20), rm = rnorm(20), ad = rnorm(20), wd = rnorm(20)) mods <- lapply(df[, -1], function(x, dat) lm(crim ~ x, data = dat))
mods 现在是 lm 对象的列表 . mods 的 mods 包含用于拟合模型的协变量的名称 . 这主要的负面影响是所有模型都使用变量 x 拟合 . 更多的努力可能会解决这个问题,但我怀疑这种努力值得花时间 .
mods
lm
如果您只是选择可能不确定的模型,还有其他方法可以实现这一目标 . 例如,通过 leaps 包及其 regsubsets 函数:
regsubsets
library("leapls") a <- regsubsets(crim ~ ., data = df, nvmax = 1, nbest = ncol(df) - 1) summa <- summary(a)
然后 plot(a) 将显示哪些模型是"best",例如 .
plot(a)
如果我理解你想要的东西( crim 是协变量,其他变量是你想要使用 crim 预测/建模的响应),那么你不需要循环 . 您可以使用标准 lm() 中的矩阵响应来执行此操作 .
crim
lm()
使用一些虚拟数据:
df <- data.frame(crim = rnorm(20), rm = rnorm(20), ad = rnorm(20), wd = rnorm(20))
我们通过 cbind() 创建矩阵或多变量响应,并将它们传递给我们感兴趣的三个响应变量 . 对 lm 的调用的其余部分与单变量响应完全相同:
cbind()
mods <- lm(cbind(rm, ad, wd) ~ crim, data = df) mods > mods Call: lm(formula = cbind(rm, ad, wd) ~ crim, data = df) Coefficients: rm ad wd (Intercept) -0.12026 -0.47653 -0.26419 crim -0.26548 0.07145 0.68426
summary() 方法为每个响应生成标准 summary.lm 输出 .
summary()
summary.lm
假设您希望将响应变量修复作为数据框的第一列,并且您希望单独使用其他变量多次运行简单线性回归,并将第一个变量修复保留为响应变量 .
H =虹膜[, - 5]
for (j in 2:ncol(h)){ assign(paste("a", j, sep = ""),lm(h[,1]~h[,j])) }
上面是代码,它将创建多个回归输出列表并将其存储在a2,a3,....
2 回答
如果你真的想这样做,那对于
lapply()
来说是非常微不足道的,我们在df
的其他列上使用"loop" . 自定义函数依次将每个变量视为x
,并且适合该协变量的模型 .mods
现在是lm
对象的列表 .mods
的mods
包含用于拟合模型的协变量的名称 . 这主要的负面影响是所有模型都使用变量x
拟合 . 更多的努力可能会解决这个问题,但我怀疑这种努力值得花时间 .如果您只是选择可能不确定的模型,还有其他方法可以实现这一目标 . 例如,通过 leaps 包及其
regsubsets
函数:然后
plot(a)
将显示哪些模型是"best",例如 .原创
如果我理解你想要的东西(
crim
是协变量,其他变量是你想要使用crim
预测/建模的响应),那么你不需要循环 . 您可以使用标准lm()
中的矩阵响应来执行此操作 .使用一些虚拟数据:
我们通过
cbind()
创建矩阵或多变量响应,并将它们传递给我们感兴趣的三个响应变量 . 对lm
的调用的其余部分与单变量响应完全相同:summary()
方法为每个响应生成标准summary.lm
输出 .假设您希望将响应变量修复作为数据框的第一列,并且您希望单独使用其他变量多次运行简单线性回归,并将第一个变量修复保留为响应变量 .
H =虹膜[, - 5]
上面是代码,它将创建多个回归输出列表并将其存储在a2,a3,....