提取模型摘要并将其存储为新列

nik*_*klz 5 r summary lm dplyr purrr

我是这个purrr范例的新手,正在努力解决这个问题.

根据几个来源,我已经设法嵌套数据框,在嵌套数据上运行线性模型,从每个lm中提取一些系数,并为每个lm生成摘要.我要做的最后一件事是从摘要中提取"r.squared"(我原本认为这将是我想要实现的最简单的部分),但无论出于何种原因我都无法获得语法对.

这是我所拥有的MWE的工作原理:

library(purrr)
library(dplyr)
library(tidyr)

mtcars %>%
  nest(-cyl) %>%
  mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
         sum = map(fit, ~summary))
Run Code Online (Sandbox Code Playgroud)

这是我尝试提取失败的r.squared:

mtcars %>%
  nest(-cyl) %>%
  mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
         sum = map(fit, ~summary),
         rsq = map_dbl(sum, "r.squared"))
Run Code Online (Sandbox Code Playgroud)
Error in eval(substitute(expr), envir, enclos) : 
  `x` must be a vector (not a closure)
Run Code Online (Sandbox Code Playgroud)

这表面上类似于RStudio网站上给出的示例:

mtcars %>%
  split(.$cyl) %>%
  map(~ lm(mpg ~ wt, data = .x)) %>%
  map(summary) %>%
  map_dbl("r.squared")
Run Code Online (Sandbox Code Playgroud)

这有效,但我希望r.squared值位于一个新列(因此mutate语句),我想了解为什么我的代码不工作而不是解决问题.

编辑:

这是我使用以下解决方案的工作解决方案:

mtcars %>%
      nest(-cyl) %>% 
      mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
             summary = map(fit, glance),
             r_sq = map_dbl(summary, "r.squared"))
Run Code Online (Sandbox Code Playgroud)

编辑2:

因此,事实证明该错误来自于summary = map(fit,〜summary)行中包含波形符号键.我的猜测是,使对象成为嵌套的函数,而不是摘要本身返回的对象.如果有人想加入,我会喜欢这方面的权威答案.

要清楚,这个版本的原始代码工作正常:

mtcars %>%
  nest(-cyl) %>%
  mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
         summary = map(fit, summary),
         r_sq = map_dbl(summary, "r.squared"))
Run Code Online (Sandbox Code Playgroud)

mto*_*oto 5

我认为对于你想要实现的目标,你最好使用包glance()中的函数broom

library(broom)
library(dplyr)
mtcars %>%
  group_by(cyl) %>%
  do(glance(lm(mpg ~ wt, data = .))) %>%
  select(cyl, r.squared)
#    cyl r.squared
#  <dbl>     <dbl>
#1     4 0.5086326
#2     6 0.4645102
#3     8 0.4229655
Run Code Online (Sandbox Code Playgroud)


Jak*_*upp 5

为了适应当前的管道,你想使用unnest沿着mapglancebroom包.

library(tidyr)
library(dplyr)
library(broom)

mtcars %>%
  nest(-cyl) %>%
  mutate(fit = map(data, ~lm(mpg ~ wt, data = .))) %>% 
  unnest(map(fit, glance))
Run Code Online (Sandbox Code Playgroud)

你将获得的不仅仅是r平方,从那里你可以select用来放弃你不需要的东西.

如果要保持嵌套在列表列中的模型摘要:

mtcars %>%
  nest(-cyl) %>% 
  mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
         summary = map(fit, glance)) 
Run Code Online (Sandbox Code Playgroud)

如果你只想从嵌套框架中提取单个值,你只需要使用map实际值(而不是[[或者extract2正如我最初建议的那样,非常感谢你找到它).

mtcars %>%
  nest(-cyl) %>% 
  mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
         summary = map(fit, glance),
         r_sq = map_dbl(summary, "r.squared"))
Run Code Online (Sandbox Code Playgroud)