gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:16:27 24 4
gpt4 key购买 nike

我是新来的 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))

这是我提取失败的 r.squared 的尝试:
mtcars %>%
nest(-cyl) %>%
mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
sum = map(fit, ~summary),
rsq = map_dbl(sum, "r.squared"))

Error in eval(substitute(expr), envir, enclos) : 
`x` must be a vector (not a closure)


这表面上类似于 RStudio 站点上给出的示例:
mtcars %>%
split(.$cyl) %>%
map(~ lm(mpg ~ wt, data = .x)) %>%
map(summary) %>%
map_dbl("r.squared")

这有效,但是我希望 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"))

编辑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"))

最佳答案

为了适应您当前的管道,您需要使用 unnest连同 mapglance来自 broom包裹。

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

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

您将获得的不仅仅是 r 平方,然后您可以使用 select放弃你不需要的东西。

如果您想将模型摘要嵌套在列表列中:
mtcars %>%
nest(-cyl) %>%
mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
summary = map(fit, glance))

如果您只想从嵌套框架中提取单个值,您只需要使用 map到实际值(而不是我最初建议的 [[extract2,非常感谢您发现这一点)。
mtcars %>%
nest(-cyl) %>%
mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
summary = map(fit, glance),
r_sq = map_dbl(summary, "r.squared"))

关于r - 提取模型摘要并将其存储为新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40930281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com