提取模型摘要并将它们存储为新列
Extract model summaries and store them as a new column
我是 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"))
我认为对于您想实现的目标,您最好使用 broom
包中的 glance()
函数:
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
一定有更好的方法,这是我对管道的尝试:
mtcars %>%
split(.$cyl) %>%
map(~ lm(mpg ~ wt, data = .x)) %>%
map(summary) %>%
map_dbl("r.squared") %>%
list() %>%
as.data.frame(col.names = "r.squared") %>%
add_rownames(var = "cyl")
# # A tibble: 3 × 2
# cyl r.squared
# <chr> <dbl>
# 1 4 0.5086326
# 2 6 0.4645102
# 3 8 0.4229655
注意:您可能会低于警告。
Warning message: Deprecated, use tibble::rownames_to_column() instead.
为了适应您当前的管道,您需要使用 unnest
以及 broom
包中的 map
和 glance
。
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"))
我是 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"))
我认为对于您想实现的目标,您最好使用 broom
包中的 glance()
函数:
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
一定有更好的方法,这是我对管道的尝试:
mtcars %>%
split(.$cyl) %>%
map(~ lm(mpg ~ wt, data = .x)) %>%
map(summary) %>%
map_dbl("r.squared") %>%
list() %>%
as.data.frame(col.names = "r.squared") %>%
add_rownames(var = "cyl")
# # A tibble: 3 × 2
# cyl r.squared
# <chr> <dbl>
# 1 4 0.5086326
# 2 6 0.4645102
# 3 8 0.4229655
注意:您可能会低于警告。
Warning message: Deprecated, use tibble::rownames_to_column() instead.
为了适应您当前的管道,您需要使用 unnest
以及 broom
包中的 map
和 glance
。
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"))