【问题标题】:bootstrap by group and calculate statistics按组引导并计算统计信息
【发布时间】:2016-09-14 20:40:19
【问题描述】:

我正在尝试引导一些模型拟合,然后计算统计数据,而不必每次都重新运行模型。如果我在第一个 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) 中的错误:对象 '.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})
      )
  })

【问题讨论】:

  • 这些列表似乎真的很难使用。您可以使用嵌套的map2s 执行mutate(allmdls, rsq = map2(mdls, map(datsplit, "test"), ~map2(.x, .y, rsquare))),这样您就可以处理最里面的列表。也许您也可以使用 at_depth 做一些事情,但不确定何时使用这样的多个列表。
  • @aosmith 我发现了你的解决方案的一个变体,它更简单,而且大部分都有效,所以感谢你的灵感。我同意列表中的列表并不理想。你怎么知道引号中的“测试”发生了什么?
  • 酷,你应该把它作为一个解决方案。 map(datsplit, "test") 它从 datsplit 提取测试列作为美元符号表示法和提取括号不起作用。 map 的文档对 .f 有很好的解释。
  • 啊,我明白了。我正在考虑将 .f 作为一个函数,但它也可以是一个字符或整数向量来提取列@aosmith 如果您发表评论,我会接受它。我也会添加我的解决方案

标签: r dplyr statistics-bootstrap purrr


【解决方案1】:

一种选择是在mutate 中使用map2。因为您使用的是列表列表,所以我最终使用嵌套的 map2s 来访问最里面的列表。我通过map(datsplit, "test") 提取了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))

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-29
      • 2021-11-12
      • 2016-06-17
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      相关资源
      最近更新 更多