简体   繁体   中英

Loop for multiple linear regression

Hi I'm starting to use r and am stuck on analyzing my data. I have a dataframe that has 80 columns. Column 1 is the dependent variable and from column 2 to 80 they are the independent variables. I want to perform 78 multiple linear regressions leaving the first independent variable of the model fixed (column 2) and create a list where I can to save all regressions to later be able to compare the models using AIC scores. how can i do it?

Here is my loop

data.frame

for(i in 2:80)

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

Using the iris dataset as an example you can do:

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  

This works because when you pass a dataframe to lm() without a formula it applies the function DF2formula() under the hood which treats the first column as the response and all other columns as predictors.

With the for loop we can initialize a list to store the output

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)
  }

Or use paste instead of reformulate

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

Using a reproducible example

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  

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM