1

我目前正在写一篇关于在R. 我选择bootboot包中的功能。我得到了 Efron/Tibshirani (1993) 的《Bootstrap 简介》一书,并且只是复制了他们的一些示例。

在这些示例中,他们经常根据不同的样本计算统计数据。例如,他们有一个例子,他们有 16 只老鼠的样本。其中7只小鼠接受了旨在延长试验手术后存活时间的治疗。其余9只小鼠未接受治疗。对于每只老鼠,收集它存活的天数(数值如下)。

现在,我想使用引导方法来确定均值的差异是否显着。但是,如果我正确理解了帮助页面boot,我就不能只将两个样本大小不相等的不同样本传递给函数。我的解决方法如下:

#Load package boot
library(boot)
#Read in the survival time in days for each mouse
treatment <- c(94, 197, 16, 38, 99, 141, 23)
control   <- c(52, 104, 146, 10, 51, 30, 40, 27, 46)
#Call boot twice(!)
b1 <- boot(data = treatment,
           statistic = function(x, i) {mean(x[i])},
           R = 10000)
b2 <- boot(data = control,
           statistic = function(x, i) {mean(x[i])},
           R = 10000)
#Compute difference of mean manually
mean_diff <- b1$t -b2$t

在我看来,这个解决方案有点骇人听闻。我感兴趣的统计数据现在保存在 vectormean_diff中,但我不再获得该boot包的所有强大功能。我不能打电话boot.ci等等mean_diff

boot所以我的问题基本上是,如果我的 hack 是使用包R和比较两个不同样本的统计数据进行引导的唯一方法。还是有其他方法?

我考虑过传递一个带有 16 行的 data.frame 和一个附加列“Group”:

df <- data.frame(survival=c(treatment, control), 
                 group=c(rep(1, length(treatment)), rep(2, length(control))))
head(df)
  survival group
1       94     1
2      197     1
3       16     1
4       38     1
5       99     1
6      141     1

但是,现在我必须告诉boot它,它必须始终从前 7 行中抽取 7 个观测值,从最后 9 行中抽取 9 个观测值,并将它们视为单独的样本。我不知道该怎么做。

4

3 回答 3

1

我从来没有真正弄清楚引导的最大优势是什么,因为手动编写引导程序非常容易。例如,您可以尝试以下使用replicate

myboot1 <- function(){
    booty <- tapply(df$survival,df$group,FUN=function(x) sample(x,length(x),TRUE))
    sapply(booty,mean)
}
out1 <- replicate(1000,myboot1())

从这里你可以很容易地得到一堆有用的统计数据:

rowMeans(out1) # group means
diff(rowMeans(out1)) # difference
mean(out1[1,]-out1[2,]) # another way of getting difference
apply(out1,1,quantile,c(0.025,0.975)) # treatment-group CIs
quantile(out1[1,]-out1[2,],c(0.025,0.975)) # CI for the difference
于 2013-08-15T15:31:36.767 回答
1

这是一个例子?boot.return

diff.means <- function(d, f)
{    n <- nrow(d)
     gp1 <- 1:table(as.numeric(d$series))[1]
     m1 <- sum(d[gp1,1] * f[gp1])/sum(f[gp1])
     m2 <- sum(d[-gp1,1] * f[-gp1])/sum(f[-gp1])
     ss1 <- sum(d[gp1,1]^2 * f[gp1]) - (m1 *  m1 * sum(f[gp1]))
     ss2 <- sum(d[-gp1,1]^2 * f[-gp1]) - (m2 *  m2 * sum(f[-gp1]))
     c(m1 - m2, (ss1 + ss2)/(sum(f) - 2))
}
grav1 <- gravity[as.numeric(gravity[,2]) >= 7,]
boot(grav1, diff.means, R = 999, stype = "f", strata = grav1[,2])

可以参考戴维森和欣克利的第 3.2 节。

于 2013-08-15T19:43:17.367 回答
0

再想一想,我意识到我实际上可以将 Thomas 的答案与boot. 这是一个解决方案:

b <- boot(data=df, 
           statistic = function(x, i) {
             booty <- tapply(x$survival,x$group,FUN=function(x) sample(x,length(x),TRUE))
             diff(sapply(booty,mean))*-1
           },
           R=10000)

诀窍是你提供给参数的函数statistic必须接受一个参数 i 作为索引,但是你在你的函数中完全忽略了这个参数。相反,您自己进行采样。当然,这不是最有效的(因为boot也必须进行采样),但我想在大多数情况下这应该不是一个大问题。

于 2013-08-15T17:28:31.170 回答