順列検定で0に等しいP値


15

2つのデータセットがあり、それらが大幅に異なるかどうかを知りたい(これは、「2つのグループは大幅に異なる?使用するテストから得られます)。

私は置換テストを使用して、Rで次のことを行うことにしました。

permutation.test <- function(coding, lncrna) {
    coding <- coding[,1] # dataset1
    lncrna <- lncrna[,1] # dataset2

    ### Under null hyphotesis, both datasets would be the same. So:
    d <- c(coding, lncrna)

    # Observed difference
    diff.observed = mean(coding) - mean(lncrna)
    number_of_permutations = 5000
    diff.random = NULL

    for (i in 1:number_of_permutations) {
        # Sample from the combined dataset
        a.random = sample (d, length(coding), TRUE)
        b.random = sample (d, length(lncrna), TRUE)
        # Null (permuated) difference
        diff.random[i] = mean(b.random) - mean(a.random)
    }

    # P-value is the fraction of how many times the permuted difference is equal or more extreme than the observed difference
    pvalue = sum(abs(diff.random) >= abs(diff.observed)) / number_of_permutations
    pvalue
}

それにもかかわらず、このペーパーによると、p値は0であってはなりません:http : //www.statsci.org/smyth/pubs/permp.pdf

何をすすめますか?p値を計算するのはこの方法ですか?

pvalue = sum(abs(diff.random) >= abs(diff.observed)) / number_of_permutations

良い方法?または、次のことを行う方が良いですか?

pvalue = sum(abs(diff.random) >= abs(diff.observed)) + 1 / number_of_permutations + 1

(1)目的の計算を実行するために必要な括弧が含まれていないため、質問の最後の行に誤りがあります。(より大きな生産の結果が保証されている二つのサンプル:あなたが実際に並べ替え検定を行っていない(2)。任意のp値は不可能である)、およびまれデータのランダムなパーティションを含まないであろうが、典型的に重複します実質的に。代わりに、との和集合内のの補数として計算します。1a.randomb.randomb.randoma.randomcodinglncrna
whuber

p値は少なくとも観測値と同じくらい極端な値のセットであるため、順列分布を評価すると、観測された統計はカウントされた「順列」に含まれます。ランダム化を行う場合、観察された統計を考慮された順列統計の間でカウントするのが一般的です(同様の理由で)。
グレン_b-モニカの復帰14

回答:


15

討論

順列検定は、データセットのすべての関連する順列を生成、そのような順列ごとに指定された検定統計量を計算し、統計の結果の順列分布のコンテキストで実際の検定統計量を評価します。それを評価する一般的な方法は、実際の統計よりも(ある意味では)「極端に」または「より極端な」統計の割合を報告することです。これはしばしば「p値」と呼ばれます。

実際のデータセットはこれらの順列の1つであるため、その統計は必然的に順列分布内にあるものの1つになります。したがって、p値がゼロになることはありません。

データセットが非常に小さい場合(通常、合計数が約20〜30未満)、または検定統計量が特に優れた数学的形式である場合を除き、すべての順列を生成することは実用的ではありません。(すべての順列が生成される例は、Rの順列テストにあります。)したがって、順列テストのコンピューター実装は、通常、順列分布からサンプリングします。彼らは、いくつかの独立したランダムな順列を生成することにより、結果がすべての順列の代表的なサンプルであることを望んでいます。

したがって、このようなサンプルから導出された数値(「p値」など)は、順列分布の特性の推定量にすぎません。推定 p値がゼロになることは非常に可能です(そして、効果が大きい場合にしばしば起こります)。それには何の問題もありませんが、推定されたp値が正しい値とどれだけ異なる可能性があるかという、これまで無視されてきた問題がすぐに生じます。 割合のサンプリング分布(推定p値など)は二項分布であるため、この不確実性は二項信頼区間で対処できます


建築

よく構築された実装は、あらゆる点で議論に密接に従います。 これは、2つのグループの平均を比較するために、検定統計量を計算するルーチンから始まります。

diff.means <- function(control, treatment) mean(treatment) - mean(control)

データセットのランダム置換を生成する別のルーチンを作成し、検定統計量を適用します。これへのインターフェースにより、呼び出し側はテスト統計を引数として提供できます。m配列の最初の要素(参照グループと推定される)を残りの要素(「治療」グループ)と比較します。

f <- function(..., sample, m, statistic) {
  s <- sample(sample)
  statistic(s[1:m], s[-(1:m)])
}

順列検定は、最初に実際のデータ(ここでは2つの配列controlとに格納されると仮定treatment)の統計値を見つけ、次にその多くの独立したランダムな順列の統計値を見つけることによって実行されます。

z <- stat(control, treatment) # Test statistic for the observed data
sim<- sapply(1:1e4, f, sample=c(control,treatment), m=length(control), statistic=diff.means)

次に、p値の二項推定値とその信頼区間を計算します。1つの方法ではbinconfHMiscパッケージの組み込みプロシージャを使用します。

require(Hmisc)                                    # Exports `binconf`
k <- sum(abs(sim) >= abs(z))                      # Two-tailed test
zapsmall(binconf(k, length(sim), method='exact')) # 95% CI by default

結果を別のテストと比較することは悪い考えではありません。たとえそれがまったく当てはまらないことがわかっているとしても、少なくとも結果がどこにあるべきかについて一桁の感覚を得るかもしれません。(平均を比較する)この例では、スチューデントのt検定は通常とにかく良い結果を与えます:

t.test(treatment, control)

このアーキテクチャーはR変数が同じ分布に従うかどうかのテストで、より複雑な状況で、動作するコードで説明されています。


100201.5

set.seed(17)
control <- rnorm(10)
treatment <- rnorm(20, 1.5)

上記のコードを使用して置換テストを実行した後、実際の統計をマークするために、置換分布のサンプルと赤い垂直線をプロットしました。

h <- hist(c(z, sim), plot=FALSE)
hist(sim, breaks=h$breaks)
abline(v = stat(control, treatment), col="Red")

図

二項信頼限界の計算の結果

 PointEst Lower        Upper
        0     0 0.0003688199

00.000373.16e-050.000370.000370.050.010.001


コメント

kN k/N(k+1)/(N+1)N

10102=1000.0000051.611.7100万分の1:報告されているスチューデントのt検定よりも少し小さい。データはスチューデントt検定を使用して正当化される通常の乱数ジェネレーターで生成されましたが、順列テストの結果は、観測の各グループ内の分布が完全に正規ではないため、スチューデントt検定の結果とは異なります。


上記で引用したSmyth&Phipsonの論文は、k / Nがp値推定器の選択として不適切である理由を明確に示しています。一言で言えば、alpha = 0.05などの関連する有意水準では、P((k / N)<alpha | H0)はアルファよりも驚くほど大きくなる可能性があります。これは、p値推定器としてk / Nを使用し、拒否しきい値として0.05を使用するランダム置換テストが、5%を超える帰無仮説を拒否することを意味します!ゼロp値はこの問題の極端な場合です。alpha= 0の基準では、nullを拒否しないことが期待されますが、n / nの下でb / mはゼロに等しくなり、誤拒否につながります。
Trisoloriansunscreen

1
@Tal 特定の目的のための「悪い選択」 統計学者としての私たちと他者との違いは、データ分析と意思決定における変動性の役割を理解し、その変動性を適切に定量化できることです。それが、ここでの私の答えで例示されている(そして暗黙のうちに支持されている)アプローチです。置換手順のユーザーはその制限と長所を理解するように導かれ、目的に応じて行動する自由があるので、それが実行されるとき、あなたが説明するような問題はありません。
whuber

13

BMB+1M+1)は有効な(しかし控えめな)p値推定量です。nullが過剰に拒否されることはありません。

(Bは、観測された統計値以上の統計が得られるランダムな順列の数であり、Mはサンプリングされたランダムな順列の総数です)。

BM


1
+1これは、論文の主要なポイントの良い要約です。推定されたp値と真の順列p値の違いに特に注意してください。
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.