循环进行多元线性回归

时间:2020-04-06 22:21:27

标签: r loops linear-regression

嗨,我开始使用r,并且一直坚持分析我的数据。我有一个具有80列的数据框。第1列是因变量,从2到80列是自变量。我要执行78个多元线性回归,使模型的第一个自变量固定不变(第2列),并创建一个列表,我可以在其中保存所有回归,以便以后可以使用AIC得分比较模型。我该怎么办?

这是我的循环

data.frame

for(i in 2:80)

{
Regressions <- lm(data.frame$column1 ~ data.frame$column2 + data.frame [,i])  
}

2 个答案:

答案 0 :(得分:0)

iris数据集为例,您可以这样做:

lapply(seq_along(iris)[-c(1:2)], function(x) lm(data = iris[,c(1:2, x)]))

[[1]]

Call:
lm(data = iris[, c(1:2, x)])

Coefficients:
 (Intercept)   Sepal.Width  Petal.Length  
      2.2491        0.5955        0.4719  


[[2]]

Call:
lm(data = iris[, c(1:2, x)])

Coefficients:
(Intercept)  Sepal.Width  Petal.Width  
     3.4573       0.3991       0.9721  


[[3]]

Call:
lm(data = iris[, c(1:2, x)])

Coefficients:
      (Intercept)        Sepal.Width  Speciesversicolor   Speciesvirginica  
           2.2514             0.8036             1.4587             1.9468  

之所以行之有效,是因为当您将数据帧传递给lm()而不使用公式时,它会在幕后应用函数DF2formula(),该函数将第一列视为响应,将所有其他列视为预测变量。

答案 1 :(得分:0)

通过for循环,我们可以初始化list来存储输出

nm1 <- names(df1)[2:80]
Regressions <- vector('list', length(nm1))
for(i in seq_along(Regressions)) {
   Regressions[[i]] <- lm(reformulate(c("column2", nm1[i]), "column1"), data = df1)
  }

或者使用paste代替reformulate

for(i in seq_along(Regressions)) {
   Regressions[[i]] <- lm(as.formula(paste0("column1 ~ column2 + ", 
                                nm1[i])), data = df1)
  }

使用可复制的示例

nm2 <- names(iris)[3:5]
Regressions2 <- vector('list', length(nm2))
for(i in seq_along(Regressions2)) {
    Regressions2[[i]] <- lm(reformulate(c("Sepal.Width", nm2[i]), "Sepal.Length"), data = iris)
 }



Regressions2[[1]]

#Call:
#lm(formula = reformulate(c("Sepal.Width", nm2[i]), "Sepal.Length"), 
#    data = iris)

#Coefficients:
# (Intercept)   Sepal.Width  Petal.Length  
#      2.2491        0.5955        0.4719