我有一个数据框,看起来像这样,但显然有更多的行等:
df <- data.frame(id=c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2),
cond=c('A', 'A', 'B', 'B', 'A', 'A', 'B', 'B', 'A', 'A', 'B', 'B', 'A', 'A', 'B', 'B'),
comm=c('X', 'Y', 'X', 'Y', 'X', 'Y', 'X', 'Y','X', 'Y', 'X', 'Y', 'X', 'Y', 'X', 'Y'),
measure=c(0.8, 1.1, 0.7, 1.2, 0.9, 2.3, 0.6, 1.1, 0.7, 1.3, 0.6, 1.5, 1.0, 2.1, 0.7, 1.2))
所以我们有两个因素(每个因素都有两个水平,因此有4种组合)和一个连续的测量指标。我们还有重复测量设计,因为我们在每个单元格内有多个与相同id对应的测量。我已经尝试先解决groupby问题,然后是bootstrap问题,最后将两者结合起来,但基本上卡住了...
按照两个因素分组的统计数据
我可以通过以下方式获取每个4个单元格的多个摘要统计数据:
summary_stats <- aggregate(df$measure,
by = list(df$cond, df$comm),
function(x) c(mean = mean(x), median = median(x), sd = sd(x)))
print(summary_stats)
导致结果为:
Group.1 Group.2 x.mean x.median x.sd
1 A X 0.85000000 0.85000000 0.12909944
2 B X 0.65000000 0.65000000 0.05773503
3 A Y 1.70000000 1.70000000 0.58878406
4 B Y 1.25000000 1.20000000 0.17320508
这很棒,因为我们可以获得每个4个单元格的多个统计数据。
但是我真正想要的是95%的bootstrap置信区间,对于每个统计数据和每个4个单元格。如果必须运行最终解决方案以获取统计数据(例如均值、中位数等),那也没关系,但一次性完成会更好。
重复测量的Bootstrap 我无法完全理解这个问题,但我想要的是95%的bootstrap置信区间,以适应此重复测量设计。除非我弄错了,否则我希望根据id选择bootstrap样本(而不是基于数据框的行),然后计算每个4个单元格的摘要统计量(例如平均值)。
library(boot)
myfunc <- function(data, indices) {
# select bootstrap sample to index into `id`
d <- data[data$id==indicies,]
return(c(mean=mean(d), median=median(d), sd = sd(d)))
}
bresults <- boot(data = CO2$uptake, statistic = myfunc, R = 1000)
问题1:我在选择Bootstrap样本时遇到了错误,即行d <- data[ data$id==indicies, ]
结合Bootstrap和groupby
2个因素
问题2:我不知道如何将这两种方法结合起来实现最终的期望结果。我的唯一想法是将aggregate
调用放在myfunc
中,以便在每个Bootstrap复制下重复计算单元格统计信息,但是对于R来说,我已经超出了自己的舒适区。
id``cond``comm
组合进行选择。这比在原始df
中按行选择要好,但与仅按id
选择略有不同。您的答案是否可以修改,以便在列表中包括cond
和comm
以及measure
,使得修改后的df
中的每一行现在都对应一个单独的id
? - Ben Vincentid
重复的测量进行总结,但保留cond
和comm
的单独行。然后,它按cond
和comm
对数据进行分组,有效地为两个因素的每种组合创建一个新的数据框架。然后,它针对这四个数据框架中的每一个进行自助法,并根据行进行重新采样(一旦它们被分组,每个子组只有2行,一个用于每个id
)。 - janfreybergdplyr
管道可能有点棘手,但检查分组是否有效的一个好方法是检查每个组有多少行:df %>% group_by(cond, comm) %>% count()
。这使我得到每个组2行,这些行将是boot
在do(tidy(...))
调用内部重新采样的行。实际上,当您通过group_by(...) %>% do(tidy(...))
进行操作时,do(tidy())
调用内部的函数只会看到数据框的每个组,而不是整个数据框。 - janfreybergtidy
中发现了一个 bug,并且已经 开了一个 issue 来尝试修复它。使用这种方法,现在有点难以得到正确的置信区间,但肯定是可能的。稍后我会再看一下! - janfreyberg