リサンプリング/シミュレーション方法:モンテカルロ、ブートストラップ、ジャックナイフ、交差検証、ランダム化テスト、および順列テスト


74

さまざまなリサンプリング方法(モンテカルロシミュレーション、パラメトリックブートストラップ、ノンパラメトリックブートストラップ、ジャックナイフ、交差検証、ランダム化テスト、置換テスト)とRを使用した独自のコンテキストでの実装の違いを理解しようとしています。

次のような状況があるとしましょう。Y変数(Yvar)とX変数(Xvar)を使用してANOVAを実行します。Xvarカテゴリーです。次のことに興味があります。

(1)p値の重要性–偽発見率

(2)Xvarレベルの 効果サイズ

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
Xvar <- c(rep("A", 5),  rep("B", 5),    rep("C", 5))
mydf <- data.frame (Yvar, Xvar)

これらのリサンプリング方法がどのように機能するかを明示した実例で、サンプリングの違いを説明してください。

編集: 私の試みは次のとおりです。

ブートストラップ 10ブートストラップサンプル、サンプルのサンプル番号、交換、サンプルを繰り返すことができることを意味します

boot.samples <- list()
for(i in 1:10) {
   t.xvar <- Xvar[ sample(length(Xvar), length(Xvar), replace=TRUE) ]
   t.yvar <- Yvar[ sample(length(Yvar), length(Yvar), replace=TRUE) ]
   b.df <- data.frame (t.xvar, t.yvar) 
   boot.samples[[i]] <- b.df 
}
str(boot.samples)
 boot.samples[1]

順列: 10個の順列サンプル、置換なしのサンプル数

 permt.samples <- list()
    for(i in 1:10) {
       t.xvar <- Xvar[ sample(length(Xvar), length(Xvar), replace=FALSE) ]
       t.yvar <- Yvar[ sample(length(Yvar), length(Yvar), replace=FALSE) ]
       b.df <- data.frame (t.xvar, t.yvar) 
       permt.samples[[i]] <- b.df 
    }
    str(permt.samples)
    permt.samples[1]

モンテカロシミュレーション

「リサンプリング」という用語は、繰り返されるランダムまたは擬似ランダムサンプリングシミュレーションを指すためによく使用されますが、既知の理論分布から「リサンプリング」を行う場合、正しい用語は「モンテカルロ」シミュレーションです。

上記のすべての用語と、上記の編集が正しいかどうかはわかりません。ジャックナイフに関するいくつかの情報を見つけましたが、それを自分の状況に合わせることができませんでした。


3
ジャックナイフは、ブートストラップの前身です。 en.wikipedia.org/wiki/Jackknife_(statistics)
EngrStudent

4
より正確には:ジャックナイフは、1回限りのリサンプリングです(ただし、相互検証には使用されません)
cbeleites 14年

回答:


122

サンプルのリサンプリングまたはシャッフルに依存するさまざまなリサンプリングメソッド、または大まかに「シミュレーション」メソッドと呼ばれるものを見つけることができます。適切な用語に関して意見には違いがあるかもしれませんが、以下の議論では、適切な文献で利用できるものを一般化し、簡素化しようとします。

リサンプリング方法は、(1)データのサブセットを使用してサンプル統計の精度/精度を推定する(Jackknifingなど)、またはデータポイントのセットから置き換えてランダムに描画する(ブートストラップなど)(2)有意性を実行するときにデータポイントのラベルを交換するテスト(置換テスト、正確テスト、ランダム化テスト、または再ランダム化テストとも呼ばれます)(3)ランダムサブセットを使用したモデルの検証(ブートストラップ、クロス検証)(wikipedia:リサンプリングメソッドを参照)

ブートストラップ

ブートストラップは、元のサンプルから置換してサンプリングすることにより、推定器のサンプリング分布を推定するための統計的手法です」。この方法では、精度の測定値(バイアス分散信頼区間予測誤差などの測定値で定義)をサンプル推定値に割り当てます

ブートストラップの基本的な考え方は、サンプルデータ(サンプル→母集団)からの母集団に関する推論は、サンプルデータをリサンプリングし、推論を実行する(リサンプル→サンプル)ことでモデル化できるということです。母集団が不明であるため、母集団の値に対するサンプル統計の真の誤差は不明です。bootstrap-resamplesでは、「人口」が実際にサンプルであり、これは既知です。したがって、リサンプルデータからの推論の品質→「true」サンプルが測定可能です。」ウィキペディアを参照

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)

#To generate a single bootstrap sample
sample(Yvar, replace = TRUE) 

 #generate 1000 bootstrap samples
boot <-list()
for (i in 1:1000) 
   boot[[i]] <- sample(Yvar,replace=TRUE)

単変量問題では、通常、個々の観測値を置換(「ケースリサンプリング」)でリサンプリングすることは許容されます。ここで、置換を使用してデータをリサンプリングします。リサンプルのサイズは、元のデータセットのサイズと等しくなければなりません。

回帰問題では、 ケースのリサンプリングとは、個々のケースをリサンプリングする単純なスキームを指します-多くの場合、回帰問題のデータセットの行、説明変数は固定されているか、少なくとも応答変数よりも制御されて観察されます。また、説明変数の範囲は、それらから利用可能な情報を定義します。したがって、ケースをリサンプルするとは、各ブートストラップサンプルが一部の情報を失うことを意味します(Wikipediaを参照)。したがって、単にデータの行をサンプリングするのは論理的Yvarです。

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
Xvar <- c(rep("A", 5),  rep("B", 5),    rep("C", 5))
mydf <- data.frame (Yvar, Xvar)    

boot.samples <- list()
for(i in 1:10) {
   b.samples.cases <- sample(length(Xvar), length(Xvar), replace=TRUE) 
   b.mydf <- mydf[b.samples.cases,] 
   boot.samples[[i]] <- b.mydf
}
str(boot.samples)
 boot.samples[1]

交換でサンプリングしているため、いくつかのケースが繰り返されていることがわかります。

" パラメトリックブートストラップ -パラメトリックモデルは、多くの場合最尤法によってデータに適合され、乱数のサンプルはこの適合モデルから引き出されます。通常、引き出されたサンプルは元のデータと同じサンプルサイズを持ちます。ブートストラップ方法論のサンプリング段階でのパラメトリックモデルの使用は、基本的な統計理論を適用することによって得られる手順とは異なる手順につながります。同じモデルの推論へ。」(ウィキペディアを参照)。以下は、平均および標準偏差パラメーターを使用した正規分布の仮定を使用したパラメーターブートストラップです。

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)

# parameters for Yvar 
mean.y <- mean(Yvar)
sd.y <- sd(Yvar)

#To generate a single bootstrap sample with assumed normal distribution (mean, sd)
rnorm(length(Yvar), mean.y, sd.y)

 #generate 1000 bootstrap samples
boot <-list()
for (i in 1:1000) 
   boot[[i]] <- rnorm(length(Yvar), mean.y, sd.y)

ブートストラップには他にも変形があります。ウィキペディアのページまたはリサンプリングに関する静的な本を参照してください。

ジャックナイフ

「パラメータのジャックナイフ推定を体系によって求められる各観測を除外データセットからと推定値を計算し、次にこれらの計算の平均を求める。サイズNのサンプルが与えられると、ジャックナイフ推定値は、それぞれの推定集約することにより発見されたN − 1推定値をサンプルで。」参照:ウィキペディア以下は、をジャックナイフする方法を示していますYvar

jackdf <- list()
jack <- numeric(length(Yvar)-1)

for (i in 1:length (Yvar)){

for (j in 1:length(Yvar)){
     if(j < i){ 
            jack[j] <- Yvar[j]
}  else if(j > i) { 
             jack[j-1] <- Yvar[j]
}
}
jackdf[[i]] <- jack
}
jackdf

「通常のブートストラップとジャックナイフ、パラメータの仮定からではなく、サブサンプル間の統計値の変動性から統計値の変動性を推定します。どちらも近似の数値結果をもたらします。そのため、それぞれが他方の近似と見なすことができます。」Bootstrap対Jacknifeに関するこの質問を参照してください。

ランダム化検定

「パラメトリックテストでは、1つまたは複数の母集団からランダムにサンプリングします。これらの母集団について一定の仮定を行います。最も一般的には、それらは等分散で正規分布します。多くの場合、m1 -m2 = 0。対応する母集団パラメーターの推定値としてサンプル統計を使用し、検定統計量(検定時など)を計算します(例:スチューデントのt-分散が不明であるが考慮される場合の平均の差の検定)関心のある H0: m1 = m2仮説は次のとおりです。対立仮説の1つは次のように述べられます。HA: m1 < m2。母集団1および2から抽出された2つのサンプルが与えられ、これらが等分散の正規分布母集団であり、サンプルが各母集団から独立してランダムに抽出されたと仮定すると、分布が既知の統計を詳しく調べて検定できますH0

これらの分布の仮定を回避する1つの方法は、非パラメトリック、ランク-順序、ランク-のような、および分布-無料の統計と呼ばれるアプローチです。これらの分布-無料統計は、通常、母集団が正規分布していると仮定した場合の類似のテストよりも「効率が悪い」と批判されます。

別の代替アプローチは、ランダム化アプローチです。「観測がメンバーであるサンプルに関する知識とは無関係に、観測にランダムにランクを割り当てるプロセス。ランダム化テストでは、このような手順を使用しますが、ジョイントではなく、観測に対して操作を行います観察のランキング。この理由のため、類似の統計量(一つのサンプルの観測値の和)の分布を容易にそのような分布を列挙することは理論的に可能であるが、表にすることができません」(参照

ランダム化テストは、ほぼすべての点でパラメトリックテストと異なります。(1)1つまたは複数の母集団からランダムサンプルを取得する必要はありません。実際、通常はランダムにサンプリングしていません。(2)データの由来となる母集団に関して考えることはめったになく、正規性や同分散性について何も仮定する必要はありません(3)帰無仮説はパラメーターとは関係ありませんが、たとえば、治療が参加者のパフォーマンスに影響を与えないという仮説。(4)集団に関心がないため、集団の特性の推定(またはテスト)に関心がありません(5)一種の検定統計量ですが、その統計量をテーブル分布と比較しません。代わりに、グループ間でデータを繰り返しランダム化したときに得られた結果と比較し、各ランダム化に対応する統計を計算します。(6)ランダム化テストは、パラメトリックテストよりもさらに、参加者を治療にランダムに割り当てることの重要性を強調しています。」をご覧ください

非常に人気のあるランダム化テストのタイプは、順列テストです。サンプルサイズが12と5の場合、可能な置換の合計はC(12,5) = 792です。サンプルサイズが10と15であれば、320万以上のアレンジが可能になります。これがコンピューティングの課題です:それでは何ですか? サンプル。可能な配置の宇宙が大きすぎて、この宇宙からの配置を独立してランダムにサンプリングしないのはなぜですか?次に、この一連のサンプルにわたる検定統計量の分布を集計し、その平均と分散を計算し、仮説検定に関連するエラー率を推定します。

授精テスト

ウィキペディアによると、「順列検定(ランダム化検定再ランダム化検定、または正確検定とも呼ばれます)は、すべての可能な値を計算することにより帰無仮説の下での検定統計量の分布が得られる統計的有意性検定の一種です観測されたデータポイントのラベルの再配置の下での検定統計量の分布。分布が既知であるかどうかに関係なく、あらゆる検定統計量に対して置換検定が存在します。したがって、仮説と代替案を区別する統計量を常に自由に選択できます。損失を最小限に抑えます。」

順列とブートストラップの違いは、ブートストラップが置換ありのサンプルと置換なしの置換サンプルがあることです。いずれの場合も、観測の時間順序が失われるため、ボラティリティクラスタリングが失われます。したがって、サンプルはボラティリティクラスタリングなしという帰無仮説の下にあることが保証されます。

順列は常にすべて同じ観測値を持っているため、ブートストラップサンプルよりも元のデータに似ています。期待されるのは、順列テストがブートストラップテストよりも敏感であるべきだということです。順列は、ボラティリティクラスタリングを破壊しますが、その他の変動性は追加しません

順列vsブートストラップに関する質問を参照してください-「順列テストは仮説のテストに最適であり、ブートストラップは信頼区間の推定に最適です」。

したがって、この場合に順列を実行するにreplace = FALSEは、上記のブートストラップの例を変更するだけです。

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
     #generate 1000 bootstrap samples
       permutes <-list()
    for (i in 1:1000) 
       permutes[[i]] <- sample(Yvar,replace=FALSE)

複数の変数の場合、行を選択して順序を入れ替えるだけでは、データは変わらないため、違いは生じません。そのため、y変数をシャッフルします。あなたがやったことの何かですが、両方を二重にシャッフルする必要はないと思います(あなたがやったように)。 xy variables

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
Xvar <- c(rep("A", 5),  rep("B", 5),    rep("C", 5))
mydf <- data.frame (Yvar, Xvar)

 permt.samples <- list()
    for(i in 1:10) {
       t.yvar <- Yvar[ sample(length(Yvar), length(Yvar), replace=FALSE) ]
       b.df <- data.frame (Xvar, t.yvar) 
       permt.samples[[i]] <- b.df 
    }
    str(permt.samples)
    permt.samples[1]

モンテカルロ法

「モンテカルロ法(またはモンテカルロ実験)は、数値結果を得るために繰り返しランダムサンプリングに依存する計算アルゴリズムの幅広いクラスです。通常、未知の確率論的エンティティの分布を得るために何度もシミュレーションを実行します。技術の類似性から、実際のギャンブルカジノでの結果の再生と記録の行為まで。」ウィキペディアを参照

「応用統計では、モンテカルロ法は通常2つの目的に使用されます。

(1)現実的なデータ条件の下で小さなサンプルの競合する統計を比較する。統計のタイプIの誤差と検出力の特性は、漸近的条件(つまり、無限のサンプルサイズと無限に小さな処理効果)の古典的な理論分布(例:正規曲線、コーシー分布)から得られたデータに対して計算できますが、実際のデータはそのような分布はありません。

(2)漸近分布の臨界値よりも正確でありながら、置換テスト(多くの場合計算が不可能な場合が多い)などの正確なテストよりも効率的な仮説テストの実装を提供すること。

モンテカルロ法は、近似ランダム化と置換テストの間妥協でもありますおおよそのランダム化試験が(順列が考慮されている潜在的に膨大なハウスキーピングを伴う)全ての順列の特定のサブセットに基づいています。モンテカルロアプローチは、指定された数のランダムに描画された順列に基づいています(順列が2回以上、またはより頻繁に描画される場合、どの順列が既に選択されているかを追跡する必要がないため、精度のわずかな損失を交換します)。

MCとPermutationテストの両方は、ランダム化テストと呼ばれることもあります。違いはMCの順列サンプルをサンプリングすることです。すべての可能な組み合わせ使用してください

相互検証

相互検証を超えたアイデアは、モデルの適合に使用されなかったデータを使用してモデルをテストする必要があるということです。相互検証は、おそらく予測のコンテキストで最も頻繁に使用されます。

「クロスバリデーションは、予測モデルを検証するための統計的手法です。データのサブセットは検証セットとして使用するために保持されます。モデルは残りのデータ(トレーニングセット)に適合し、検証セットの予測に使用されます。検証セット全体の予測の品質により、予測精度の全体的な尺度が得られます。

相互検証の1つの形式では、一度に1つの観測が除外されます。これはジャックナイフに似ています。別のK分割交差検証では、データをK個のサブセットに分割します。Wikipediaを参照してください。通常、クロス検証は定量的データを使用して行われます。何らかの方法で定性的(因子データ)を定量的に変換して、線形モデルに適合し、このモデルをテストできます。データの50%がモデルの予測に使用され、残りがテストに使用されるホールドアウト戦略Xvar

    Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
    Xvar <- c(rep(1, 5),  rep(2, 5),    rep(3, 5))
    mydf <- data.frame (Yvar, Xvar)
    training.id <- sample(1:nrow(mydf), round(nrow(mydf)/2,0), replace = FALSE)
    test.id <- setdiff(1:nrow(mydf), training.id)
   # training dataset 
    mydf.train <- mydf[training.id]

    #testing dataset 
    mydf.test <- mydf[test.id]

ブートストラップおよび置換テストとは異なり、トレーニングおよびテスト用の相互検証データセットは異なります。次の図は、さまざまな方法でのリサンプリングの概要を示しています。

ここに画像の説明を入力してください

これが少し役立つことを願っています。


23
これは印象的です。そして、特にそうです。最初の答えだからです!あなたがここに参加し続けることを望み、私たちのサイトへのあなたの将来の貢献を楽しみにしています。
whuber

この答えは、全体像のような素晴らしい答えです。ただし、一部のリンクは放棄されているようです。誰がリンクがどこにあるかについての手がかりを持っていますか?
-tintinthong

7

これが私の貢献です。

データ

Yvar <- c(8,9,10,13,12,
          14,18,12,8,9,
          1,3,2,3,4)
Xvar <- rep(LETTERS[1:3], each=5)
mydf <- data.frame(Yvar, Xvar)

モンテカルロ

モンテカルロは、(結果)確率変数の分布を取得する方法と考えています。これは、他の(入力)確率変数の自明ではない関数の結果です。現在のANOVA分析との重複はすぐには見当たりません。おそらく他のフォーラムメンバーがここで意見を述べることができます。

ブートストラップ

目的は、観測されたサンプルから計算された統計の不確実性を把握することです。例えば:私たちはそれを計算することができますサンプル Yvarの平均は8.4ですが、どのように特定の我々している人口は Yvarのために意味ですか?トリックは、サンプルが母集団であるかのように行い、その偽の母集団から何度もサンプリングすることです。

n <- 1000
bootstrap_means <- numeric(length=n)
for(i in 1:n){
   bootstrap_sample <- sample(x=Yvar, size=length(Yvar), replace=TRUE)
   bootstrap_means[i] <- mean(bootstrap_sample)
}
hist(bootstrap_means)

サンプルを取得しただけで、パラメトリック分布は想定していません。これはノンパラメトリックブートストラップです。たとえば、Xvarが正規分布していると仮定した場合rnorm(...)、推定平均と標準偏差を使用して正規分布()からサンプリングすることもできます。これはパラメトリックブートストラップになります。

他のユーザーは、おそらくXvarレベルの効果サイズに関してブートストラップのアプリケーションを提供するでしょうか?

ジャックナイフ

ジャックナイフは少し時代遅れのようです。完全を期すために、ブートストラップと多少比較することもできますが、1つの観測値を省略した場合(および観測値ごとにこれを繰り返す)に何が起こるかを確認するための戦略がここにあります。

交差検証

交差検証では、(通常は大きな)データセットをトレーニングセットと検証セットに分割し、推定モデルが検証セットの値をどれだけうまく予測できるかを確認します。個人的には、ANOVAへの相互検証の適用はまだ見ていません。そのため、この部分は他の人に任せたいと思います。

ランダム化/置換テスト

注意してください、用語は合意されていません。ランダム化テストと置換テストの違いを参照してください。

帰無仮説は、グループA、B、およびCの母集団間に差がないということなので、Xvarの15個の値のラベルをランダムに交換してもかまいません。最初に観測されたF値(または別の統計)が、ラベルをランダムに交換した後に得られた値と一致しない場合、おそらく問題であり、帰無仮説は棄却できます。

observed_F_value <- anova(lm(Yvar ~ Xvar))$"F value"[1]

n <- 10000
permutation_F_values <- numeric(length=n)

for(i in 1:n){
   # note: the sample function without extra parameters defaults to a permutation
   temp_fit <- anova(lm(Yvar ~ sample(Xvar)))
   permutation_F_values[i] <- temp_fit$"F value"[1]
}

hist(permutation_F_values, xlim=range(c(observed_F_value, permutation_F_values)))
abline(v=observed_F_value, lwd=3, col="red")
cat("P value: ", sum(permutation_F_values >= observed_F_value), "/", n, "\n", sep="")

ヒストグラム

ただし、複雑なデザインの場合はラベルを再割り当てする方法に注意してください。また、不等分散の場合、交換可能性の帰無仮説はそもそも真ではないため、この置換テストは正しくないことに注意してください。

ここでは、ラベルの可能なすべての順列を明示的に調べたわけではありません。これは、P値のモンテカルロ推定です。小さいデータセットを使用すると、考えられるすべての順列を実行できますが、上記のRコードは少し理解しやすいです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.