使用 broom (augment) 和 dplyr with loess fit 时出错
Error when using broom (augment) and dplyr with loess fit
我正在尝试对黄土拟合使用扩充,但收到以下错误:
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 32, 11
在报错信息中,11恰好等于一个片段中的观测数,而32是总观测数。代码如下。
require(broom)
require(dplyr)
# This example uses the lm method and it works
regressions <- mtcars %>% group_by(cyl) %>% do(fit = lm(wt ~ mpg, .))
regressions %>% augment(fit)
# This example uses the loess method and it generates the error
regressions2 <- mtcars %>% group_by(cyl) %>% do(fit = loess(wt ~ mpg, .))
regressions2 %>% augment(fit)
# The below code appropriately plots the loess fit using geom_smooth.
# My current # workaround is to do a global definition as an aes object in geom_smooth`
cylc = unique(mtcars$cyl) %>% sort()
for (i in 1:length(cyl)){
print(i)
print(cyl[i])
p<- ggplot(data=filter(mtcars,cyl==cylc[i]),aes(x=mpg,y=wt)) + geom_point() + geom_smooth(method="loess") + ggtitle(str_c("cyl = ",cyl[i]))
print(p)
}
这似乎是与 do()
运算符相关的问题:当我们检查 LOESS 模型对象之一的 model.frame()
时,我们得到所有 32 行而不是对应于那个型号。
解决方法是保留数据而不仅仅是模型,并将其作为第二个参数传递给 augment()
:
regressions2 <- mtcars %>%
group_by(cyl) %>%
do(fit = loess(wt ~ mpg, .),
data = (.)) %>%
augment(fit, data)
无论如何,这通常与 augment()
一起推荐,因为 model.frame()
无法获得所有原始列。
顺便说一下,我是 broom 的维护者,我通常不再推荐 do()
方法(因为 dplyr 大部分时间都在远离它)。
相反,我建议使用 tidyr 的 nest()
和 purrr 的 map()
,如 this chapter of R4DS 中所述。这使得保留数据并合并到 augment()
.
中变得更容易一些
library(tidyr)
library(purrr)
mtcars %>%
nest(-cyl) %>%
mutate(fit = map(data, ~ loess(wt ~ mpg, .))) %>%
unnest(map2(fit, data, augment))
我正在尝试对黄土拟合使用扩充,但收到以下错误:
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 32, 11
在报错信息中,11恰好等于一个片段中的观测数,而32是总观测数。代码如下。
require(broom)
require(dplyr)
# This example uses the lm method and it works
regressions <- mtcars %>% group_by(cyl) %>% do(fit = lm(wt ~ mpg, .))
regressions %>% augment(fit)
# This example uses the loess method and it generates the error
regressions2 <- mtcars %>% group_by(cyl) %>% do(fit = loess(wt ~ mpg, .))
regressions2 %>% augment(fit)
# The below code appropriately plots the loess fit using geom_smooth.
# My current # workaround is to do a global definition as an aes object in geom_smooth`
cylc = unique(mtcars$cyl) %>% sort()
for (i in 1:length(cyl)){
print(i)
print(cyl[i])
p<- ggplot(data=filter(mtcars,cyl==cylc[i]),aes(x=mpg,y=wt)) + geom_point() + geom_smooth(method="loess") + ggtitle(str_c("cyl = ",cyl[i]))
print(p)
}
这似乎是与 do()
运算符相关的问题:当我们检查 LOESS 模型对象之一的 model.frame()
时,我们得到所有 32 行而不是对应于那个型号。
解决方法是保留数据而不仅仅是模型,并将其作为第二个参数传递给 augment()
:
regressions2 <- mtcars %>%
group_by(cyl) %>%
do(fit = loess(wt ~ mpg, .),
data = (.)) %>%
augment(fit, data)
无论如何,这通常与 augment()
一起推荐,因为 model.frame()
无法获得所有原始列。
顺便说一下,我是 broom 的维护者,我通常不再推荐 do()
方法(因为 dplyr 大部分时间都在远离它)。
相反,我建议使用 tidyr 的 nest()
和 purrr 的 map()
,如 this chapter of R4DS 中所述。这使得保留数据并合并到 augment()
.
library(tidyr)
library(purrr)
mtcars %>%
nest(-cyl) %>%
mutate(fit = map(data, ~ loess(wt ~ mpg, .))) %>%
unnest(map2(fit, data, augment))