【发布时间】: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