按组引导并计算统计数据

时间:2016-09-14 20:40:19

标签: r dplyr statistics-bootstrap purrr

我正在尝试引导一些模型拟合,然后计算统计数据而不必每次都重新运行模型。如果我在第一个do()内计算r2,我可以做得很好,但我想知道如何访问数据。

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):object   找不到'.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})
      )
  })

2 个答案:

答案 0 :(得分:2)

一种选择是在map2中使用mutate。因为您正在使用列表列表,所以我最终使用嵌套的map2来访问最里面的列表。我通过test提取map(datsplit, "test")数据,因为美元符号运算符和提取括号都不适用于我。

mutate(allmdls, rsq = map2(mdls, map(datsplit, "test"), ~map2_dbl(.x, .y, rsquare)))

这是另一个避免嵌套列表的选项:

mtcars %>%
    split(.$cyl) %>%
    map_df(crossv_mc, 10, .id = "cyl") %>%
    mutate(models = map(train, ~glm(hp ~ disp, data = .x)),
          rsq = map2_dbl(models, test, rsquare))

答案 1 :(得分:1)

@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})
      )
  })