【问题标题】:Extract r.squared from multiple models with purrr::map()使用 purrr::map() 从多个模型中提取 r.squared
【发布时间】:2021-01-17 05:57:07
【问题描述】:

我有以下三个线性模型:

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

现在我想用purrr::map() 从所有三个模型中提取r.squared。 我尝试了以下两种方法,但它们都产生错误(即“错误:无法将 summaryDefault/table 对象转换为函数”):

models %>% 
  map(summary) %>% 
  map_dbl(~.$r.squared)

models %>% 
  map(summary) %>% 
  map_dbl("r.squared")

问题是什么,如何解决?

【问题讨论】:

    标签: r purrr lm


    【解决方案1】:
    library(tidyverse)
    
    models <- mtcars %>% 
      split(.$cyl) %>% 
      map(~lm(mpg ~ wt, data = .))
    

    手动操作即可:

    summary(models[[1]])$r.squared
    

    然后使用map:

    #and in map loop map_dfr
    map_dfr(models, ~summary(.)$r.squared)
    # # A tibble: 1 x 3
    #     `4`   `6`   `8`
    #   <dbl> <dbl> <dbl>
    # 1 0.509 0.465 0.423
    

    或者

     map_dfr(models, ~ glance(.x) %>%
                       dplyr::select(r.squared))
    
    # A tibble: 3 x 1
    #  r.squared
    #      <dbl>
    #1     0.509
    #2     0.465
    #3     0.423
    

    【讨论】:

    • 确实,这行得通。但是,我仍然想知道为什么我上面概述的方法对我不起作用,因为其他人建议这样做(所以它必须对他们有用)。
    • 我刚看到你的代码,它对我有用,所以不知道为什么它对你不起作用:(models %&gt;% map(summary) %&gt;% map_dbl(~.$r.squared))。尝试重新启动 R
    • 我重新启动了 R,当我只运行这个代码块时它确实有效。这一定是我的降价文档中的一个问题。我会接受你的回答,谢谢!
    【解决方案2】:
    by_cyl <- split(mtcars, mtcars$cyl)
    
    by_cyl %>% 
      map(~ lm(mpg ~ wt, data = .x)) %>%
      map(summary) %>%
      map_dbl('r.squared')
    

    https://adv-r.hadley.nz/functionals.html

    【讨论】:

    • 这为您提供了 r2,但 OP 正在使用模型列表并希望从那里提取 r2...您能确定答案吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多