【发布时间】:2021-10-04 08:00:23
【问题描述】:
我在 tidyverse.org 的 link 在线找到了这段代码:
mtcars %>%
split(.$cyl) %>%
map(~ lm(mpg ~ wt, data = .)) %>%
map(summary) %>%
map_dbl("r.squared")
代码按预期工作。我现在正在使用相同的结构进行练习,但使用的是长数据框。可以看代码;大部分是一样的。首先,我转换为 tibble,为汽车添加行名,选择数值变量,并使数据框成为长数据框。
mtcars <- as_tibble(mtcars, rownames = 'car')
mtcars_numeric <- mtcars %>%
select(car, mpg, disp, hp, drat, wt, qsec)
mtcars_long_numeric <- pivot_longer(mtcars_numeric, names_to = 'names', values_to = 'values', 3:7)
mtcars_long_numeric %>%
split(.$names) %>%
map(~ lm(mpg ~ values, data = .)) %>%
map(summary) %>%
map_df("r.squared") %>%
pivot_longer(., names_to = 'explanatory_variable_to_mpg', values_to = 'r_squared', 1:5) %>%
arrange(desc(r_squared))
但是其他模型统计数据(例如 p 值)呢?我该如何提取它?如果我只是将“r.squared”更改为“p.value”,它就不起作用。我尝试了其他变体,例如“p_value”和“pvalue”,但它不起作用。我也不知道如何为这些对象找到正确的名称。
我可以创建一个线性模型对象并查看摘要中的 r.squared 并获得正确的值。
mtcars_linear_model <- lm(mpg ~ wt, mtcars)
summary(mtcars_linear_model)$r.squared
...但是在这个小插曲之外,我不知道我怎么会知道 r.squared 存在于线性模型的摘要中。如果我只是在 summary(lm) 之后输入美元符号,我会得到不存在的值。 (这是一个错误吗?)
然后我尝试了不同的策略。我可以看到,如果我使用扫帚并整理线性模型对象,我还有其他统计信息:
broom::tidy(mtcars_linear_model)
有什么方法可以将 broom::tidy 函数添加到这些涉及 purrr:map 的数据帧中?目的是弄清楚如何提取其他模型统计数据,如 p 值。另外,我如何找到可以从线性模型对象摘要(lm)$''的摘要中提取的项目的综合列表?'
以下代码不起作用。我尝试了一些变体,例如 %>% tidy() 或者像这样将 tidy 包裹在 map(summary) 周围:tidy(map(summary)) 但它不起作用。
mtcars_long_numeric %>%
split(.$names) %>%
map(~ lm(mpg ~ values, data = .)) %>%
map(summary) %>%
tidy() %>% #### ????????
map_df("r.squared") %>%
pivot_longer(., names_to = 'explanatory_variable_to_mpg', values_to = 'r_squared', 1:5) %>%
arrange(desc(r_squared))
【问题讨论】:
-
关于什么是 lm 对象的汇总输出的问题:lm 对象的汇总方法文档的“值”部分 (
?summary.lm) 是一个有用的起点。因为我总是忘记我可以手动从摘要中提取什么,所以我还使用names(summary(model))和str(summary(model))之类的东西来确定输出中的内容和名称。 -
顺便说一句,在我知道我可能需要从我喜欢的模型中提取不同的东西的情况下,将模型列表保存为输出。这样,如果我想提取新的东西,我就不必重新调整所有模型。这有多大用处取决于,例如,模型需要多长时间才能适应/您拥有多少组。 (看起来我在blog post 中有一个这样做的例子,我在其中列出了模型,检查假设,然后提取输出。)
-
@aosmith 我一定会阅读你的博文——感谢分享。考虑到我遇到的 R 问题,这看起来很不错。另外,我知道我自己的问题/工作流程,从科学的角度来看,可能有点可疑 - 并排排列所有组的所有模型统计数据 - 因为它看起来像我寻找 p 值而不是创建研究问题并进行假设检验。我在这里所做的部分工作是试图了解 tidyverse 包中简洁的编程工作流程和功能。
标签: r linear-regression purrr tidy broom