【问题标题】:Avoiding intermediate dlply step when starting with a dataframe and ending with a dataframe从数据帧开始并以数据帧结束时避免中间 dlply 步骤
【发布时间】:2017-07-25 21:48:20
【问题描述】:

我正在使用 plyr 对数据集的子集执行引导功能。

因为 boot 函数会创建一个列表对象,所以我目前使用 dlply 来存储函数的输出,然后使用 ddply 来获取我想要的 bootfunction 部分

我的示例数据集如下:

dat = data.frame(x = rnorm(10, sd = 1),y = rnorm(10, sd = 1),z = rep(c("SppA", "SppB", "SppC", "SppD", "SppE"), 2),u = rep(c("SiteA", "SiteB"), 5))

确切的功能不是很重要,但为了重现性,这里是我正在使用的功能:

boot_fun = function(x,i) {
  i = sample(1:24, 24, replace = TRUE)
  ts1 = mean(x[i,"x"])
  ts2 = sample(x[i,"y"])
  mean(ts1) - mean(ts2)
}

我的 plyr 函数如下:

temp = dlply(dat, c("z", "u"), summarise, boot_object = boot(dat, boot_fun, R = 1000))

由于我想从引导对象中得到平均值和 CI,然后我执行以下 plyr 函数:

temp2 = ldply(temp, summarise, mean = mean(boot$t), lowCI = quantile(boot$t, 0.025), highCI = quantile(boot$t, 0.975))

这可以正常工作并完成我想要的(尽管有一个关于子集的错误似乎不会影响我关心的任何事情),但我觉得应该有一种方法可以跳过中间 dlply 步骤。

-edit-澄清如果我不需要拆分组,我正在尝试做什么

如果我是手动拆分而不是使用 plyr,它将如下所示:

temp = boot(dat[dat$z == "SppA" & dat$u == "SiteA",], boot_fun, R = 1000)
temp2$mean = mean(temp$t)
temp2$lowCI = quantile(temp$t, 0.025)
temp2$highCI = quantile(temp$t, 0.975)

如果我根本不关心小组,只是想对整个小组这样做,那就是

temp = boot(dat, boot_fun, R = 1000)
temp2$mean = mean(temp$t)
temp2$lowCI = quantile(temp$t, 0.025)
temp2$highCI = quantile(temp$t, 0.975)

【问题讨论】:

  • 您能否将您的dlply 声明分解为可理解的步骤?例如,您创建boot_object,然后对其进行总结?
  • @Chi Pak 是的,基本上。引导对象存储了很多信息,包括创建它时使用的一些数据(如种子、迭代次数、起始数据等)。第一个 plyr 函数只是创建和存储引导对象。第二个 plyr 函数仅使用作为生成数据的引导对象部分(1000 个采样重复,在引导对象中存储为“t”)并生成这些数据的平均值和 95% 置信区间。
  • 抱歉,我还是不明白...当我尝试重现您的示例时出现错误...您将如何使用第一行 @987654330 执行第一个 plyr 语句@? temp <- summarise(boot..[dat,1]) 之类的东西?
  • @Chi Pak 你问如果我手动拆分而不是使用 plyr 拆分组我会怎么做?基本上是temp = boot(dat[dat$z == "SppA" & dat$u == "SiteA", c("x", "y")], boot_fun, R = 1000) 第二步是temp2$mean = mean(temp$t) temp2$lowCI = quantile(temp$t, 0.025) temp2$HighCI = quantile(temp$t, 0.975)

标签: r plyr statistics-bootstrap


【解决方案1】:

我无法复制您的示例。

当我执行temp = boot(dat, boot_fun, R = 1000) 时,我得到一个WARNING

ORDINARY NONPARAMETRIC BOOTSTRAP
Call:
boot(data = dat, statistic = boot_fun, R = 1000)
Bootstrap Statistics :
WARNING: All values of t1* are NA

我认为您当前的代码非常高效,但如果您正在寻找其他可能性,您可以尝试 tidyverse1) group_by 相关列,2) nest 用于引导的相关数据,3) 使用嵌套数据运行引导,4) 隔离所需的统计信息,然后 5 ) 返回一个正常数据框

library(boot)
library(tidyverse)
dat1 <- dat %>%
          group_by(z,u) %>%
          nest() %>%
          mutate(data=map(data,~boot(.x, boot_fun, R=1000))) %>%
          mutate(data=map(data,~data.frame(mean=mean(.x$t), lowCI=quantile(.x$t, 0.025), highCI=quantile(.x$t,0.975)))) %>%
          unnest(data)

【讨论】:

    猜你喜欢
    • 2021-01-07
    • 2017-10-07
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多