在 R 中使用引导包的两种方法的差异的置信区间

机器算法验证 r 置信区间 引导程序
2022-04-06 20:51:22

我有两个样本,一个是 52 号,一个是 31 号,它们是在不同时间获得的。我想为这些样本所代表的总体平均值之间的差异获得 95% 的自举置信区间。我一直在尝试使用 R 中的“引导”包,但我遇到了一个我无法弄清楚的错误。我希望这里有人可以帮助我。

这就是我的数据的样子(在名为“totalData”的数据框中):

      X              samplingTime
1  -0.29              initial
2   0.3               initial 
           ....
52  -1.2              initial
53   0.7              final
54  -1.2              final
           ....
83   1.52             final 

这就是我为获得引导 CI 所做的工作:

meanDiff = function(dataFrame, indexVector) { 
    m1 = mean(subset(dataFrame[, 1], dataFrame$samplingTime == "initial"))
    m2 = mean(subset(dataFrame[, 1], dataFrame$samplingTime == "final"))
    m = m1 - m2
    return(m)
}

totalBoot = boot(totalData, meanDiff, R = 10000, strata = totalData[,2])
totalBootCI = boot.ci(totalBoot)

在最后一行我得到错误:

Error in bca.ci(boot.out, conf, index[1L], L = L, t = t.o, t0 = t.o, : estimated 
adjustment 'w' is infinite. 

我非常感谢任何评论。

谢谢!

1个回答

如果您查看您的,totalBoot$t您会发现所有返回的值都是相同的。秘密是您没有定义统计函数(meanDiff)来实际重新采样数据。引导的帮助页面说

当 sim = "parametric" 时,statistic 的第一个参数必须是数据。...在所有其他情况下,statistic 必须至少有两个参数。传递的第一个参数将始终是原始数据。第二个将是定义引导样本的索引、频率或权重的向量。

如果您将 meanDiff 重新定义为

meanDiff = function(dataFrame, indexVector) { 
    m1 = mean(subset(dataFrame[indexVector, 1], dataFrame[indexVector, 2] == "initial"))
    m2 = mean(subset(dataFrame[indexVector, 1], dataFrame[indexVector, 2] == "final"))
    m = m1 - m2
    return(m)
}

它应该工作。或者(没关系)我更喜欢:

meanDiff =function(x, w){
    y <- tapply(x[w,1], x[w,2], mean)
    y[1]-y[2]}