我正在尝试引导一些模型拟合,然后计算统计数据,而不必每次都重新运行模型。如果我在第一个内部计算 r2 ,我可以做到这一点,do()
但我想知道如何访问数据。
library(dplyr)
library(tidyr)
library(modelr)
library(purrr)
allmdls <-
mtcars %>%
group_by(cyl) %>%
do({
datsplit=crossv_mc(.,10)
mdls=list(map(datsplit$train, ~glm(hp~disp,data=.,family=gaussian(link='identity'))))
data_frame(datsplit=list(datsplit),mdls)
})
现在是这样的:
allmdls %>%
by_slice(dmap,.f=map2_dbl(.$mdls,.$datsplit$test,rsquare))
但我明白了
错误:
.y
不是向量(NULL)
或者
allmdls %>%
group_by(cyl) %>%
do({
map2_df(.x=.$mdls, .y=.$datsplit, .f=map2_dbl(.x=.x,.y=.y$test,.f=rsquare))
})
map2_dbl 中的错误(.x = .x,.y = .y$test,.f = rsquare):找不到对象“.x”
我似乎无法正确使用语法。
帮助?谢谢
编辑:感谢@aosmith 的评论,我创建了一个更简单的解决方案:
mtcars %>%
group_by(cyl) %>%
do({
datplit=crossv_mc(.,10) %>%
mutate(mdls=map(train, ~glm(hp~disp,data=.)),
r2=map2_dbl(mdls,test,rsquare)
pctmae=map2_dbl(mdls,test,function(model,data) {mae(model,data)/mean(model$model$hp,na.rm=T)*100})
)
})