Rのどの置換テストの実装をt検定(ペアおよび非ペア)の代わりに使用しますか?


56

t検定を使用して分析した実験のデータがあります。従属変数は間隔スケーリングされ、データはペア化されていない(つまり、2つのグループ)か、ペアリングされています(つまり、被験者内)。例(被験者内):

x1 <- c(99, 99.5, 65, 100, 99, 99.5, 99, 99.5, 99.5, 57, 100, 99.5, 
        99.5, 99, 99, 99.5, 89.5, 99.5, 100, 99.5)
y1 <- c(99, 99.5, 99.5, 0, 50, 100, 99.5, 99.5, 0, 99.5, 99.5, 90, 
        80, 0, 99, 0, 74.5, 0, 100, 49.5)

ただし、データは正常ではないため、あるレビューアがt検定以外の何かを使用するように依頼しました。ただし、簡単にわかるように、データは正規分布しているだけでなく、条件間で分布が等しくありません。 代替テキスト

したがって、通常のノンパラメトリック検定であるMann-Whitney-U-Test(unpaired)およびWilcoxon Test(paired)は、条件間で均等に分布する必要があるため使用できません。したがって、いくつかのリサンプリングまたは置換テストが最適であると判断しました。

今、私はt検定の置換ベースの同等物のR実装、またはデータをどうするかについての他のアドバイスを探しています。

私にこれを行うことができるいくつかのRパッケージ(コイン、パーマ、exactRankTestなど)があることは知っていますが、どれを選ぶべきかわかりません。したがって、これらのテストを使用した経験のある人がキックスタートを提供できれば、それは非常にクールです。

更新:このテストの結果を報告する方法の例を提供できれば理想的です。

回答:


43

検定統計量は常に平均値の差(または同等の値)になるため、それほど重要ではありません。わずかな違いは、モンテカルロ法の実装に起因します。2つの独立変数の片側テストでデータを使用して3つのパッケージを試してください。

DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
library(coin)                    # for oneway_test(), pvalue()
pvalue(oneway_test(DV ~ IV, alternative="greater", 
                   distribution=approximate(B=9999)))
[1] 0.00330033

library(perm)                    # for permTS()
permTS(DV ~ IV, alternative="greater", method="exact.mc", 
       control=permControl(nmc=10^4-1))$p.value
[1] 0.003

library(exactRankTests)          # for perm.test()
perm.test(DV ~ IV, paired=FALSE, alternative="greater", exact=TRUE)$p.value
[1] 0.003171822

すべての順列を手動で計算して正確なp値を確認するために、データを最初の9個の値に制限します。

x1 <- x1[1:9]
y1 <- y1[1:9]
DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
pvalue(oneway_test(DV ~ IV, alternative="greater", distribution="exact"))
[1] 0.0945907

permTS(DV ~ IV, alternative="greater", exact=TRUE)$p.value
[1] 0.0945907

# perm.test() gives different result due to rounding of input values
perm.test(DV ~ IV, paired=FALSE, alternative="greater", exact=TRUE)$p.value
[1] 0.1029412

# manual exact permutation test
idx  <- seq(along=DV)                 # indices to permute
idxA <- combn(idx, length(x1))        # all possibilities for different groups

# function to calculate difference in group means given index vector for group A
getDiffM <- function(x) { mean(DV[x]) - mean(DV[!(idx %in% x)]) }
resDM    <- apply(idxA, 2, getDiffM)  # difference in means for all permutations
diffM    <- mean(x1) - mean(y1)       # empirical differencen in group means

# p-value: proportion of group means at least as extreme as observed one
(pVal <- sum(resDM >= diffM) / length(resDM))
[1] 0.0945907

coinそして、exactRankTests同じ著者からの両方であるが、coinより一般的かつ広範であるように思わ-また、ドキュメントの面で。exactRankTestsもう積極的に開発されていません。したがって、S4オブジェクトを扱いたくない場合を除き、coin(同様に有益な機能があるため)を選択しsupport()ます。

編集:2つの従属変数の場合、構文は

id <- factor(rep(1:length(x1), 2))    # factor for participant
pvalue(oneway_test(DV ~ IV | id, alternative="greater",
                   distribution=approximate(B=9999)))
[1] 0.00810081

すばらしい回答をありがとう!さらに2つの質問:2番目の例は、コインが実際にすべての可能な順列を提供し、正確なテストであることを意味しますか?私の場合、正確なテストを提供しないことの利点はありますか?
ヘンリック

10
(+1)(対になっていない)t検定が本質的に同じp値0.000349をもたらすことは驚くことではありません。校閲者が言ったことにもかかわらず、t検定これらのデータに適用できます。その理由は、データの分布がそうでなくても、平均のサンプリング分布がほぼ正常だからです。さらに、結果からわかるように、実際にはt検定は置換検定よりも保守的です。(これは、t検定での重要な結果が、置換検定も重要である可能性が高いことを意味します。)
whuber

2
@Henrik特定の状況(選択されたテストと数値の複雑さ)で、coin実際に正確な順列分布を計算できます(実際にすべての順列を通過することなく、それよりも洗練されたアルゴリズムがあります)。選択を考えると、正確な分布が望ましいように見えますが、反復回数が多いモンテカルロ近似との差は小さいはずです。
カラカル

1
@Caracal説明をありがとう。1つの疑問が残ります。提示したデータはペアになっています。したがって、ペアのt検定に相当するものが必要です。あるoneway_test正確な機能は?もしそうなら、ペアになっていないデータに対して正しいのはどれですか?
ヘンリック

2
@Henrik coin著者はoneway_test()、依存するケースの正確な分布を計算できないと書いています。MC近似を使用する必要があります(wilcoxsign_test()正確なテストにのみ適しています)。私はこれを知りませんでしたし、その場合はエラーを好むでしょうが、MCは多数の複製で十分正確でなければなりません。
カラカル

29

いくつかのコメントは、順番にあると思います。

1)データの複数の視覚表示を試してみることをお勧めします。ヒストグラムによって失われるものをキャプチャできるためです。また、横軸にプロットすることを強くお勧めします。この場合、ヒストグラムがデータの顕著な特徴を伝える上で非常に良い仕事をしているとは思いません。たとえば、横並びの箱ひげ図を見てください。

boxplot(x1, y1, names = c("x1", "y1"))

代替テキスト

または並列ストリップチャート:

stripchart(c(x1,y1) ~ rep(1:2, each = 20), method = "jitter", group.names = c("x1","y1"), xlab = "")

代替テキスト

これらのセンター、スプレッド、および形状を見てください!データの約4分の3 は、データの中央値を大きく上回っています。の広がりは小さく、の広がりは大きいです。とはどちらも非常に左に歪んでいますが、方法が異なります。たとえば、は5つの(!)ゼロの繰り返し値があります。y 1 x 1 y 1 x 1 y 1 y 1x1y1x1y1x1y1y1

2)データがどこから来たのか、どのように測定されたのかについては詳しく説明しませんでしたが、この手順は統計手順を選択するときに非常に重要です。上記の2つのサンプルは独立していますか?2つのサンプルの周辺分布が同じであると信じる理由はありますか(たとえば、場所の違いを除く)。2つのグループの違いの証拠を探すことになった研究の考慮事項は何でしたか?

3)周辺分布は著しく非正規であり、両方のサンプルに極値があるため、t検定はこれらのデータには適していません。あなたが好きなら、あなたは使用する(これはあなたの適度なサイズのサンプルに)CLTにアピールすることができ(大型サンプルに対するz検定のようになります)検定を、しかし、の(両方の変数で)歪度与えられましたあなたのデータは、私はそのような魅力を非常に説得力があると判断しません。もちろん、それを使用して値を計算できますが、それはあなたにとって何をしますか?仮定が満たされない場合、値は単なる統計です。何を(おそらく)知りたいかはわかりません。2つのサンプルが異なる分布からのものであるという証拠があるかどうかです。p pzpp

4)順列検定もこれらのデータには不適切です。順列検定についてしばしば見過ごされがちな単一の仮定は、2つのサンプルが帰無仮説の下で交換可能であるということです。これは、それらが同一の周辺分布を持っていることを意味します(ヌルの下)。しかし、グラフは分布が場所とスケール(および形状)の両方で異なることを示唆しているため、問題があります。そのため、スケールが異なるため、位置の違いを(有効に)テストすることはできません。また、位置が異なるため、スケールの違いを(有効に)テストすることもできません。おっと。繰り返しますが、とにかくテストを実行して値を取得できますが、それではどうでしょうか。あなたは本当に何を達成しましたか?p

5)私の意見では、これらのデータは、適切に選択された画像が1000の仮説検定の価値があるという完璧な(?)例です。鉛筆と納屋の違いを知るための統計は必要ありません。これらのデータに関する私の見解では、「これらのデータは、場所、規模、および形状に関して著しい違いを示しています」と述べています。それらのそれぞれについて(堅牢な)記述統計でフォローアップして、違いを定量化し、元の研究のコンテキストで違いが何を意味するかを説明できます。

6)あなたのレビュアーはおそらく(そして悲しいことに)出版の前提条件として何らかの値を主張するでしょう。はぁ!それが私なら、すべてについての違いを考えると、おそらく分布が異なることを示す値を吐き出すためにノンパラメトリックコルモゴロフ-スミルノフ検定を使用し、上記のように記述統計を続行します。タイを取り除くには、2つのサンプルにノイズを追加する必要があります。(そしてもちろん、これはあなたが明示的に述べなかったサンプルが独立していると仮定しています。)Ppp

この答えは、当初意図していたよりもはるかに長くなります。ごめんなさい


次の適切な準視覚化アプローチを検討する場合、私は興味があります:2つのグループのモーメント(平均、分散、および必要に応じてより高いモーメント)のブートストラップ推定、これらの推定とその信頼区間をプロットして、各瞬間のグループ間のオーバーラップの程度。これにより、さまざまな分布特性の潜在的な違いについて話すことができます。データがペアになっている場合、差分スコアを計算し、この単一の分布の瞬間をブートストラップします。考え?
マイクローレンス

2
(+1)良い分析。結果が明らかであり、ポイントをp値で押す必要がないことは完全に正しいです。t検定は正規分布データを必要としないため、(3)のステートメントは少し極端かもしれません。懸念がある場合は、歪度の調整(たとえば、チェンのバリアント)が存在します。調整されたテストのp値が回答を変更するかどうかを確認できます。そうでなければ、おそらく大丈夫です。これらの(非常に歪んだ)データを使用するこの特定の状況では、t検定は正常に機能します。
whuber

(+1)すてきなキャッチ!そして非常に良いコメント。
chl

基礎となる分布はランダムなインスタンス化と「類似」しているという考えを受け入れているようです。だから、問題を提起することはできませんでした:これらは両方ともベータ(0.25、0.25)からのものであり、テストはそれらが同じ(非)中心性パラメータを持っているかどうかです。そして、順列検定またはウィルコクソンを使用することを正当化しないでしょうか?
-DWin

4
ここにはたくさんの良い情報がありますが、私にはあまり意味のないものがいくつかあり、非常に強く表現されています。たとえば、#3、zテストとtテストの関係についての私の理解は、それらは本質的に同じであるということですが、SDが事前に知られている場合はzが使用され、 SDはデータから推定されます。CLTがサンプリングの正常性を保証するかどうかはわかりませんが、t検定を無効のままにしながら、この検定でz検定を無効にします。また、調整(Welch–Satterthwaiteなど)が使用されている限り、CLTでカバーされている場合、 SDがtを無効にするとは思わない。
GUNG -モニカ元に戻し

5

私のコメントは、置換テストの実装に関するものではなく、これらのデータによって提起されたより一般的な問題と、それに関する議論、特にG. Jay Kernsによる投稿に関するものです。

Y1の0のグループを除き、2つの分布は実際に非常によく似ていますが、これはそのサンプルの他の観測値(次に小さいものは0-100スケールで約50)とX1のすべての観測値とは大きく異なります。最初に、これらの観察結果に何か違いがあるかどうかを調べます。

第二に、それらの0が分析に属すると仮定し、分布が異なるように見えるため置換テストは有効ではないと言って、質問をします。nullが真(分布が同一)の場合、(妥当な確率で)これら2つと同じように見える分布を取得できますか?それに答えることがテストの全体のポイントですね。この場合、テストを実行せずに答えを明白に考える人もいるかもしれませんが、これらの小さくて独特な分布では、そうは思わないでしょう。


これは回答ではなく、1つ以上のコメントであるように思われます。小さな灰色の[コメントを追加]をクリックすると、質問または特定の回答(それらが属する場所)の下の会話に自分の考えを置くことができます。ここでは実質的なポイントを挙げていますが、これが彼らにとって適切な場所でないことは明らかではありません。
GUNG -モニカ元に戻し

1
@gungコメントを投稿できるようになるには少し評判が必要です;-)。
whuber

4
これは、順列テストの適用性に関する良い点です。グループ間の違いの自明性に関しては、おそらく経験の問題でしょう:-)。直感のために、重要な違いは小さな値にあることが明らかなので、40個の値のセットの中で最小の7個が20個のランダムなサブセットに該当する可能性について問い合わせる場合があります。サブセットまたはその補数に含まれる可能性があるため、7つすべてが同じグループに属し、可能性は約です。この暗算は、迅速な初期ガイダンスを提供します。2(1/2)7.01
whuber

4

この質問が再び浮かび上がったので、パッケージを使用したQuick-RおよびR in Actionの作者であるRobert KabacoffのR-Bloggerを介した最近のブログ投稿に触発された別の回答を追加することができます。lmPerm

ただし、この方法はcoin、@ caracaklの回答でパッケージによって生成された結果と非常に対照的な(および非常に不安定な)結果を生成します(被験者内分析のp値は0.008)。分析では、@ caracalの回答からデータの準備も行います。

x1 <- c(99, 99.5, 65, 100, 99, 99.5, 99, 99.5, 99.5, 57, 100, 99.5, 
        99.5, 99, 99, 99.5, 89.5, 99.5, 100, 99.5)
y1 <- c(99, 99.5, 99.5, 0, 50, 100, 99.5, 99.5, 0, 99.5, 99.5, 90, 
        80, 0, 99, 0, 74.5, 0, 100, 49.5)

DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
id <- factor(rep(1:length(x1), 2)) 

library(lmPerm)

summary(aovp( DV ~ IV + Error(id)))

生成するもの:

> summary(aovp( DV ~ IV + Error(id)))
[1] "Settings:  unique SS "

Error: id
Component 1 :
          Df R Sum Sq R Mean Sq
Residuals 19    15946       839


Error: Within
Component 1 :
          Df R Sum Sq R Mean Sq Iter Pr(Prob)  
IV         1     7924      7924 1004    0.091 .
Residuals 19    21124      1112                
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

これを複数回実行すると、p値は〜.05と〜.1の間をジャンプします。

それは質問に対する答えですが、最後に質問を投げることができます(必要に応じてこれを新しい質問に移動できます):
この分析が非常に不安定であり、p値が非常に異なる理由コイン分析?私は何か間違ったことをしましたか?


2
それが本当にあなたが答えたい質問であるなら、これを別の質問として尋ねるほうがよいかもしれません。エラー層を指定していますが、@ caracalは指定していません。これは、この出力と彼の差b / tでの最初の推測です。また、シミュレートするとき、値は通常ジャンプします。再現性のために、シードを指定しますset.seed(1)。MC推定の精度を高めるには、反復回数を増やします。これらのいずれかがあなたの質問に対する「正しい」答えであるかどうかはわかりませんが、おそらく関連しています。
GUNG -モニカ元に戻し

2
繰り返しますが、完全な順列(再ランダム化)テストを使用して、MCの結果を手動計算に対してベンチマークすることをお勧めします。(常に正しい結果に近い)と(通常は正しい結果から遠い)の比較については、例コードを参照してください。なぜ非常にさまざまな結果が得られるのかはわかりませんが、少なくともこの場合、ここでは信じられません。私の元の答えの最後の呼び出しで@gungは、依存するケースのエラー層を指定しました(使用される構文とは異なる構文)。oneway_anova()aovp()aovp()oneway_test(DV ~ IV | id, ...)aov()
カラカル

@カラカル、あなたは正しい。編集後の最後のコードブロックを見ていません。私は一番上のコードブロックを見ていました-私の側ではずさんです。
GUNG -モニカ元に戻し

答えは本当に必要ありません。ここで言及する価値がある別の可能性です。残念なことに、私も気づく価値がある他の結果とはほど遠いです。
ヘンリック

1
@Henrikは、maxExact = 1000でaovpを実行します。時間がかかりすぎる場合は、iter = 1000000およびCa = 0.001に設定します。pの推定標準誤差がCa * p未満になると、計算は終了します。(値を
小さく

1

これらのスコアは比例していますか?もしそうなら、ガウスパラメトリックテストを使用すべきではありません。置換テストや手段のブートストラップのようなノンパラメトリックアプローチを進めることはできますが、より統計的なパワーを得るように提案します。適切な非ガウスパラメトリックアプローチを採用する。具体的には、関心のある単位(実験の参加者など)内で比例尺度を計算できる場合はいつでも、二項分布誤差のある観測値を指定する混合効果モデルを使用できます。Dixon 2004を参照してください。


スコアは比率ではなく、参加者による0〜100スケールの推定値です(提示されたデータは、そのスケールのいくつかの項目の推定値の平均です)。
ヘンリック

そうすると、ノンパラメトリックが伝統的な方法のように思えます。そうは言っても、このようなスケールデータは、二項プロセスから導き出され、そのように分析されるのに役立つのではないかと考えました。つまり、各スコアは複数の項目の平均であり、各項目は10ポイントスケールであると言います。この場合、一連の試行として「8」、「8」これらは値1を持ち、2つは値0を持ち、すべて「item」変数の同じラベルでラベル付けされます。この拡張/二項化されたデータを使用して、二項混合効果モデルを計算できます。
マイクローレンス

前回のコメントに続いて、拡張/二項化されたデータでは、 "item"変数を固定効果またはランダム効果としてモデル化できることに注意する必要があります。おそらく、あなたは会計上の問題だけでなく、アイテムの違いやアイテムと他の予測変数の間の可能な相互作用を評価することに興味があるかもしれないので、固定効果としてモデル化することに傾いていると思います。
マイクローレンス

0

ちょうど別のアプローチ、追加ezPermezパッケージを:

> # preparing the data
> DV <- c(x1, y1)
> IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
> id <- factor(rep(1:length(x1), 2))
> df <- data.frame(id=id,DV=DV,IV=IV)
>
> library(ez)
> ezPerm( data = df, dv = DV, wid = id, within = IV, perms = 1000)
|=========================|100%              Completed after 17 s 
  Effect     p p<.05
1     IV 0.016     *

これoneway_testcoinパッケージと一致しているようです:

> library(coin)
> pvalue(oneway_test(DV ~ IV | id,  distribution=approximate(B=999999)))
[1] 0.01608002
99 percent confidence interval:
 0.01575782 0.01640682

ただし、これは@caracalで提供されるのと同じ例ではないことに注意してください。彼の例では、彼は含まれalternative="greater"、p値で、したがって差異~0.008対を~0.016

aovp答えの1で提案されているパッケージが怪しい小さいp値を生成し、私はのために高い値を試す場合でも怪しい速く走るIterCaおよびmaxIter引数を:

library(lmPerm)
summary(aovp(DV ~ IV + Error(id/IV), data=df,  maxIter = 1000000000))
summary(aovp(DV ~ IV + Error(id/IV), data=df,  Iter = 1000000000))
summary(aovp(DV ~ IV + Error(id/IV), data=df,  Ca = 0.00000000001))

それは言った、引数は少しからp値のばらつきを低減しているようだ~.03~.1(私は@Henrikによって報告されたより大きな範囲のウ・タントを得た)へ0.030.07

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