【问题标题】:Loop for multiple linear regression多元线性回归的循环
【发布时间】:2020-04-06 22:21:27
【问题描述】:

您好,我开始使用 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])  
}

【问题讨论】:

    标签: r loops linear-regression


    【解决方案1】:

    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(),它将第一列视为响应,将所有其他列视为预测变量。

    【讨论】:

      【解决方案2】:

      通过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  
      

      【讨论】:

      • 我运行代码并给我下一条消息Error in terms.formula(formula, data = data) : invalid model formula in ExtractVars。我的datafreme是2月,column1=PPNA,column2=Acum1 nm1 &lt;- names(February)[2:80] Regressions &lt;- vector('list', length(nm1)) for(i in seq_along(Regressions)) { Regressions[[i]] &lt;- lm(reformulate(c("Acum1", nm1[i]), "PPNA"), data=February) }我不知道我做错了什么
      • @Pablo 你能在循环中打印出reformulate 输出print(reformulate(c("Acum1", nm1[i]), "PPNA"))
      • @Pablo 对我来说 lm(reformulate(c("Sepal.Length", "Sepal.Width"), "Petal.Length"), data = iris) 工作
      • @Pablo 你能告诉我输出吗
      • 同样的事情Error in terms.formula(formula, data = data) : invalid model formula in ExtractVars
      猜你喜欢
      • 2020-12-28
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 2023-03-11
      • 2021-09-14
      • 2021-07-02
      • 1970-01-01
      相关资源
      最近更新 更多