1

現在、.NET でのブートストラップに関するチュートリアルを書いていRます。パッケージの機能bootに落ち着きました。bootEfron/Tibshirani (1993) による「An Introduction to the Bootstrap」という本を入手し、それらの例のいくつかを複製しました。

これらの例では、さまざまなサンプルに基づいて統計を計算することがよくあります。たとえば、彼らは 16 匹のマウスのサンプルを持っているこの 1 つの例を持っています。これらのマウスのうち 7 匹は、試験手術後に生存期間を延長することを意図した治療を受けました。残りの 9 匹のマウスは治療を受けませんでした。各マウスについて、生存した日数を収集しました (値は以下に示します)。

ここで、ブートストラップ アプローチを使用して、平均値の差が大きいかどうかを調べたいと思います。ただし、ヘルプ ページをboot正しく理解していれば、サンプル サイズが等しくない 2 つの異なるサンプルを関数に渡すことはできません。私の回避策は次のとおりです。

#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

私の意見では、このソリューションはちょっとしたハックです。私が興味を持っている統計は現在 vector に保存されていますが、パッケージmean_diffの優れた機能をすべて利用することはできません。boot通話できboot.ciないmean_diffなど

したがって、私の質問は基本的に、私のハックがbootパッケージを使用してブートストラップを実行し、 R2 つの異なるサンプルを比較する統計を行う唯一の方法であるかどうかです。それとも別の方法がありますか?

16行と追加の列「グループ」で1つのdata.frameを渡すことを考えました:

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

これは の例です?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])

Davison と Hinkley のセクション 3.2 を参照できます。

于 2013-08-15T19:43:17.367 に答える
0

もう一度考えてみると、トーマスの答えを実際に組み合わせることができることに気付きました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 に答える