【问题标题】:Looping over different variables and datasets in R regression在 R 回归中循环不同的变量和数据集
【发布时间】:2020-12-09 21:01:15
【问题描述】:

我可以使用管道和循环使用不同的数据框运行相同的回归(见下文):

 mtcars %>%
        split(.$cyl) %>%
        map(~ lm(mpg ~ wt, data = .x))

但是,如果我有兴趣查看相同回归但针对一系列不同因变量的结果 - 例如“mpg”、“hp”、“drat”。有没有使用循环的快速方法?

我尝试过使用嵌套的 lapply 循环、group_by 等。但是,我似乎找不到解决方案。

任何帮助都会很棒。

【问题讨论】:

  • 因变量不同的相同回归是什么?
  • 嗨@r.user.05apr,我的意思是我想保留回归中的所有内容,但更改因变量(即每次使用不同的因变量运行回归) .

标签: r loops regression


【解决方案1】:

听起来您希望遍历每个数据框的列名。实际上,您需要双重地图或双重lapply。这样的事情会起作用:

mtcars %>%
        split(.$cyl) %>%
        lapply(function(x)
        {
          lapply(paste("mpg ~", names(x)[-1]), function(y) {
            lm(formula = as.formula(y), data = x)
        })})

#> $`4`
#> $`4`[[1]]
#> 
#> Call:
#> lm(formula = as.formula(y), data = x)
#> 
#> Coefficients:
#> (Intercept)          cyl  
#>       26.66           NA  
#> 
#> 
#> $`4`[[2]]
#> 
#> Call:
#> lm(formula = as.formula(y), data = x)
#> 
#> Coefficients:
#> (Intercept)         disp  
#>     40.8720      -0.1351  

# ... etc (very long list)

【讨论】:

    【解决方案2】:

    整洁的循环可能是:

    library(tidyverse)
    
    mtcars %>%
      select(-mpg) %>%
      map(~lm(mtcars$mpg ~ .x), data = mtcars)
    

    【讨论】:

      【解决方案3】:

      这可能看起来像:

      library(dplyr)
      
      
      label <- "mpg"
      features <- setdiff(names(mtcars), label)
      generate_formula <- function(feature) sprintf("%s ~ %s", label, feature) %>% as.formula
      
      features %>% 
        map(~ lm(generate_formula(.x), data = mtcars))
      

      输出:

      [[1]]
      
      Call:
      lm(formula = generate_formula(.x), data = mtcars)
      
      Coefficients:
      (Intercept)          cyl  
           37.885       -2.876  
      
      
      [[2]]
      
      Call:
      lm(formula = generate_formula(.x), data = mtcars)
      
      Coefficients:
      (Intercept)         disp  
         29.59985     -0.04122  
      
      
      [[3]]
      
      Call:
      lm(formula = generate_formula(.x), data = mtcars)
      
      Coefficients:
      (Intercept)           hp  
         30.09886     -0.06823
      

      【讨论】:

        【解决方案4】:

        我们可以使用nest_by

        library(dplyr)
        mtcars %>% 
           nest_by(cyl) %>% 
           mutate(model = list(lm(mpg~ ., data = data)))
        # A tibble: 3 x 3
        # Rowwise:  cyl
        #    cyl                data model 
        #  <dbl> <list<tbl_df[,10]>> <list>
        #1     4           [11 × 10] <lm>  
        #2     6            [7 × 10] <lm>  
        #3     8           [14 × 10] <lm>  
        

        【讨论】:

          猜你喜欢
          • 2021-08-24
          • 1970-01-01
          • 2017-04-01
          • 2021-08-21
          • 2020-11-04
          • 2017-11-09
          • 1970-01-01
          • 1970-01-01
          • 2012-10-29
          相关资源
          最近更新 更多