【问题标题】:Error in Grouped regression using map function使用映射函数的分组回归错误
【发布时间】:2020-08-02 15:34:42
【问题描述】:

分组回归在“do”的模型1 中运行良好。但是最近,被告知 do 已被取代并建议使用“跨”,但帮助文件中没有给出示例。 Model2 在“do”帮助中给出,并且在没有“map”或“cross”的情况下运行良好。我不明白回归是如何在没有地图的情况下循环遍历这些组的。当我尝试在 model3 中使用 map 时,我遇到了错误。 Model4 在 Hadley 的书 R for data science using split 中给出并且运行良好。如何告诉地图功能考虑列表“数据”。有什么建议吗?

library(purrr)
#> Warning: package 'purrr' was built under R version 3.6.3
library(tidyverse)
#> Warning: package 'tidyverse' was built under R version 3.6.3
#> Warning: package 'ggplot2' was built under R version 3.6.3
#> Warning: package 'tidyr' was built under R version 3.6.3
#> Warning: package 'dplyr' was built under R version 3.6.3
#> Warning: package 'stringr' was built under R version 3.6.3
#> Warning: package 'forcats' was built under R version 3.6.3
model1 = mtcars %>%
  group_by(cyl) %>%
  do(mod = lm(mpg ~ disp, data = .))
model1
#> # A tibble: 3 x 2
#> # Rowwise: 
#>     cyl mod   
#>   <dbl> <list>
#> 1     4 <lm>  
#> 2     6 <lm>  
#> 3     8 <lm>

## from "do" help file 
model2 = mtcars %>%
  nest_by(cyl) %>%
  mutate(mod = list(lm(mpg ~ disp, data = data)))
model2
#> # A tibble: 3 x 3
#> # Rowwise:  cyl
#>     cyl                data mod   
#>   <dbl> <list<tbl_df[,10]>> <list>
#> 1     4           [11 x 10] <lm>  
#> 2     6            [7 x 10] <lm>  
#> 3     8           [14 x 10] <lm>

## using map
model3 = mtcars %>% nest_by(cyl) %>% 
  mutate(fit = map(data, ~lm(mpg ~ disp, data = .)))
#> Error: Problem with `mutate()` input `fit`.
#> x numeric 'envir' arg not of length one
#> i Input `fit` is `map(data, ~lm(mpg ~ disp, data = .))`.
#> i The error occured in row 1.

##model4
model4 = mtcars %>% 
  split(.$cyl) %>% 
  map(~lm(mpg ~ disp, data = .))
model4
#> $`4`
#> 
#> Call:
#> lm(formula = mpg ~ disp, data = .)
#> 
#> Coefficients:
#> (Intercept)         disp  
#>     40.8720      -0.1351  
#> 
#> 
#> $`6`
#> 
#> Call:
#> lm(formula = mpg ~ disp, data = .)
#> 
#> Coefficients:
#> (Intercept)         disp  
#>   19.081987     0.003605  
#> 
#> 
#> $`8`
#> 
#> Call:
#> lm(formula = mpg ~ disp, data = .)
#> 
#> Coefficients:
#> (Intercept)         disp  
#>    22.03280     -0.01963

reprex package (v0.3.0) 于 2020 年 8 月 2 日创建

【问题讨论】:

    标签: r regression


    【解决方案1】:

    这可能是rowwise 属性的问题,我们可以ungroup

    library(dplyr)
    library(purrr)
    mtcars %>% 
         nest_by(cyl) %>% # // creates the rowwise attribute
         ungroup %>% # // remove the rowwise
         mutate(fit = map(data, ~lm(mpg ~ disp, data = .)))
    # A tibble: 3 x 3
    #    cyl                data fit   
    #  <dbl> <list<tbl_df[,10]>> <list>
    #1     4           [11 × 10] <lm>  
    #2     6            [7 × 10] <lm>  
    #3     8           [14 × 10] <lm>  
    

    【讨论】:

    • 感谢您的回答。但是您能否提供更多解释为什么模型 2 工作而模型 4 不工作。我们怎么知道应该使用 ungroup 呢?它不直观。另外,model2 在没有循环的情况下是如何工作的?
    • @RamakrishnaS model4 正在拆分为 list 并且没有分组属性。如果你做同样的mtcars %&gt;% group_split(cyl) %&gt;% map(~ lm(mpg ~ disp, data = .)) 我猜你的意思是model3 而不是model4
    • 是的,我的意思是model3。请解释一下,为什么要使用ungroup。我没有做对。另外,在模型 2 中,为什么 lm 应该包含在 list() 中。
    • @RamakrishnaS 在model2 中,您将lm 包含在list 中,因为模型对象不是常规对象。它是许多组件的列表(请查看str),如果您不将其包装在列表中,则它不能自包含。原因是nest_by 添加了一个额外的属性rowwise,而group_by nest 没有,即mtcars %&gt;% group_by(cyl) %&gt;% nest %&gt;% mutate(fit = map(data, ~lm(mpg ~ disp, data = .))) 有效
    • @RamakrishnaS 关于为什么它在 nest_by 中的行为不同,添加的属性可能是一个错误,它可能会在下一个版本中得到纠正。
    猜你喜欢
    • 2012-10-09
    • 2021-08-13
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2022-01-13
    • 2010-10-31
    相关资源
    最近更新 更多