我是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"))
好吧,这似乎是我想要做的,我只是困惑,为什么代码是这样构造的。我不明白你为什么解开数据?你能解释一下吗? 感谢您的回答! – niklz
使用'unnest'将数据框从列表列中取出,并将所有可用的列扩展到父数据框。你可以让它嵌套,但是r平方的列不能直接访问。我会更新答案,让代码没有“unnest”。 –
因此,对于map(fit,〜glance)声明的结果是不公平的,我认为它是对嵌套的tibble(这是我感到困惑的地方)取消嵌套。 这种方法也规避了总结列与总结的要求,对吗?如果我明白了;第二个版本中的coeffs列将包含相同的信息(虽然格式不同)。 难道我没有办法从sum列中提取“r.squared”?只是我看到自己再次碰到这堵墙,在那里我有一个嵌套列表,我只想从中抓出一个元素。 – niklz