R内のペアのベクトルのランダム化/置換テスト


9

私は専門家ではないので、用語が少し不器用な場合はご容赦ください。必要に応じて詳細情報を提供させていただきます。

Rに50のペア数値の2つのベクトルがあります。両側のランダム化または置換テストを実行して、それらの違いが偶然によるものかどうかを判断します。

順列検定(ランダム化検定、再ランダム化検定、正確検定とも呼ばれます)は、帰無仮説のもとでの検定統計量の分布が検定統計量のすべての可能な値を計算することによって得られる一種の統計的有意性検定です観測されたデータポイントのラベルの再配置の下。

ベクトルの値の分布がt検定などの他の検定(たとえば、ベクトルの数値の多くが0である)の仮定に違反していると思うので、このタイプの検定を実行します。

BHH2ライブラリpermtest関数は、ほとんど私がやりたいことを実行しますが、2 50のすべての順列に対して機能します。代わりに、多数の可能な順列をサンプリングして、p値を推定します。私はcoinパッケージを調べましたが、ペアになっている数値ベクトルからのサンプリングを使用した置換テストを実行しているようには見えません。250

一部のグーグルでこのメールが表示されます。これは、パッケージを見つけることができない理由は、それがRのワンライナーであることを示唆しています。残念ながら、Rでこれを作成するのに十分な経験がありません-ライナー。

置換空間のサンプルのみを使用して両側ペア置換テストを実行するパッケージまたはメソッドはありますか?

そうでない場合、誰かがそれを行うための短いRコードを共有できるでしょうか?


3
coin(他のいくつかのパッケージの中で)パッケージがランダム化テストを行うように見えます。例えば、この質問への答えを見てください(全部を読んでください)。私が正しく理解している場合、例はおおよそのケースと正確なケースの両方をカバーし、独立サンプルと依存サンプルの両方をカバーしています。
Glen_b-2013

1
申し訳ありませんが、明確にするために-「全体を読む」とは、「一番上の答えを最後まで読む」ことを意味します。ただし、一番下の答えを確認することもできます。
Glen_b-2013

対になった順列に対するその答えからの唯一の興味深いビットはoneway_test(y ~ x | pairs, distribution=approximate(B=9999))library(coin)です。
Nakx

回答:


12

coinパッケージの使用についてコメントで指摘しましたが、置換/ランダム化テストが本当に非常に単純であることを説明する価値があると思います。

ここでは、ロケーションの1つのサンプルテストのランダム化テストを実行するためのRコードをいくつか記述しています。このテストでは、ランダムに差の符号を反転させ、平均を計算します。これは、値の各ペアをxグループとyグループにランダムに割り当てることと同じです。以下のコードは大幅に短くすることができます(2行で十分簡単に​​できますが、遅いコードを気にしていなければ1行でもかまいません)。

このコードは私のマシンで数秒かかります:

# assumes the two samples are in 'x' and 'y' and x[i] and y[i] are paired
# set up:
B <- 99999
d <- x-y
m0 <- mean(d)

# perform a one-sample randomization test on d
# for the null hypothesis H0: mu_d = 0   vs H1 mu_d != 0  (i.e. two tailed)
# here the test statistic is the mean
rndmdist <- replicate(B,mean((rbinom(length(d),1,.5)*2-1)*d))

# two tailed p-value:
sum( abs(rndmdist) >= abs(m0))/length(rndmdist)

それがすべてです。

rbinom(length(d),1,.5)*2-1)ランダム-1または1...、つまりランダムな符号を与えることに注意してください。そのため、任意のsignedのセットを乗算すると、絶対差dにランダムに割り当て+または-符号を付けることと同じになります。[最初の標識の分布は何でもかまいませんがd、今dはランダムな標識があります。]

ここでは、いくつかの構成データのt検定と比較します。

 set.seed(seed=438978)
 z=rnorm(50,10,2)
 x=z-rnorm(50,0,.5)
 y=z+.4+rnorm(50,0,.5)
 t.test(y-x) # gives p = 0.003156

 B <- 99999
 d <- x-y
 m0 <- mean(d)
 rndmdist <- replicate(B,mean((rbinom(length(d),1,.5)*2-1)*d))
 sum( abs(rndmdist) >= abs(m0))/length(rndmdist) 

t検定が有効な場合、通常、完全に列挙された順列検定と非常に類似したp値が得られ、上記のシミュレーションされたp値(シミュレーションの数が十分に多い場合)はその2番目のp値に収束します。

上記で使用した複製の数で、0.05の真の順列p値(つまり、完全な列挙から)は、約85%の時間で0.001以内(つまり、0.049と0.051の間のランダム化p値を与える)と推定されます。そして、時間の99.5%以上で0.002以内に。


大変感謝しております。どのようにしてp値の精度を計算しましたか?
ティモシージョーンズ

1
s.e.(p^)=p(1p)/n

なぜrbinom関数に2-1を掛けるのですか?そして、d?

これはd、ペアのデータの平均差の順列検定が機能するためです。そのコードの断片の後に新しい追加のコメントを表示します。
Glen_b-モニカを復活させる14

1
@Joeは、観測されたサンプルを追加すると、ラウンド数になります
Glen_b -Reinstate Monica

0

置換テストを実行するコードは次のとおりです。たとえば、そこにデータがあります。xは2つのベクトルの差です。

x <- c(5.1, 9.4, 7.2, 8.1, 8.8, 2.5, 4.2, 6.9, 5.5, 5.3)
m = 5
n = 5
xsum = sum(x)
asum = sum(x[1:m])
bsum = xsum - asum
truediff = asum/m - bsum/n
truediff
abstruediff = abs(truediff)
iter = 100000
difflist <- 1:iter
for(i in 1:iter) {
  s <- sample(x,m) # select a sample of size m
  pasum = sum(s)
  pbsum = sum(x) - sum(s)
  diff  = pasum/m - pbsum/n
  difflist[i] <- diff # add permutation difference to list
}
difflist  <- sort(difflist)
xquantile <- quantile(difflist,probs=c(.005, .01, .025, .05, .95, .975, .99, .995))
xquantile
pdist  <- quantile(difflist, probs=seq(0,1,1/iter))
ntail1 <- length(pdist[difflist <= -abstruediff])
tail1  <- ntail1/iter
tail1  # left-tail probability
ntail2 <- length(pdist[difflist >= abstruediff])
tail2  <- ntail2/iter
tail2  # right-tail probability
twotail = tail1 + tail2
twotail 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.