ボックスプロットのノンパラメトリック多重比較の重要な結果を強調表示


9

1つのプロットで表示する13グループのボックスプロットがあります。グループの人口は不均衡で、通常は分布していません。一致するボックスの上にa、b、cなどを配置して、どのペアが統計的に類似している(つまり、kruskal.testのp値が0.05未満である)かを示したいと思います。ここに私が持っているものを示すための疑似コードがあります:

A = c(1, 5, 8, 17, 16, 3, 24, 19, 6) 
B = c(2, 16, 5, 7, 4, 7, 3) 
C = c(1, 1, 3, 7, 9, 6, 10, 13) 
D = c(2, 15, 2, 9, 7) 
junk = list(g1=A, g2=B, g3=C, g4=D) 
boxplot(junk) 

私が見つけたプロットは次のとおりです(1つの行に13個のグループがあることを除いて)。

回答:


7

私の頭に浮かぶ最も単純なコードを以下に示します。CRANでそれを行うための既存の関数がいくつかあると確信していますが、R-seekでさえ、それらを検索するのが面倒です。

dd <- data.frame(y=as.vector(unlist(junk)), 
                 g=rep(paste("g", 1:4, sep=""), unlist(lapply(junk, length))))

aov.res <- kruskal.test(y ~ g, data=dd)
alpha.level <- .05/nlevels(dd$g)  # Bonferroni correction, but use 
                                  # whatever you want using p.adjust()

# generate all pairwise comparisons
idx <- combn(nlevels(dd$g), 2)

# compute p-values from Wilcoxon test for all comparisons
pval.res <- numeric(ncol(idx))
for (i in 1:ncol(idx))
  # test all group, pairwise
  pval.res[i] <- with(dd, wilcox.test(y[as.numeric(g)==idx[1,i]], 
                                      y[as.numeric(g)==idx[2,i]]))$p.value

# which groups are significantly different (arranged by column)
signif.pairs <- idx[,which(pval.res<alpha.level)]

boxplot(y ~ g, data=dd, ylim=c(min(dd$y)-1, max(dd$y)+1))
# use offset= to increment space between labels, thanks to vectorization
for (i in 1:ncol(signif.pairs))
    text(signif.pairs[,i], max(dd$y)+1, letters[i], pos=4, offset=i*.8-1)

上記のコードが生成する例を以下に示します(4つのグループ間に大きな違いがあります)。

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

ウィルコクソン検定の代わりに、pgirmessパッケージのkruskalmc()関数に実装されている手順に頼ることができます(ここで使用されている手順の説明を参照)。

また、RについてのルドルフカーディナルのRヒント:基本グラフ2(特に、注釈付きの別の棒グラフを参照)も必ず確認してください。


ありがとう、chl。私は統計学者ではないので、あなたの答えをもっと学ぶ必要がありますが、私が必要としているように見えます。
Ilik

不明な点がある場合は、遠慮なく質問してください。ここにはあまり統計的なものはありません。ペアワイズグループ比較にWilcoxon検定を使用し、個々のp値を修正して、偽陽性の全体的なリスクを5%に制限しました。NPMCパッケージには、ノンパラメトリック多重比較を扱うための追加機能が含まれていますが、もありますコインフレームワークは。残りは、ベースRグラフィックを使用した純粋なRコードです。これは、latticeまたはggplot2でも実行できます。
chl

統計がわからないことをお詫びします。だから私はあなたのコードを試してみましたが、最初にkruskal.testを計算しましたが、結果(aov.res)を使用しないことに気づきました。wilcox.testが2つのサンプルのクラスカルの特殊なケースであることを理解しました。しかし、私はグループの値を変更して(直感的に)異なるものにし、何が現れるかを確認しようとしました。A = c(10、50、18、17、16、31、24、19、6)B = c(10、50、18、17、16、30、25、18、7)C = c(1、 1、3、7、9、6、10、13)D = c(200、158、206、119、77)。g1&g2は大幅に異なりますか?そしてg3とg4はそうではありませんか?理由がわかりません。
Ilik

@Ilikコードでwith(dd,問題が発生しました(命令が間違った場所にあり、奇妙なテストが発生しました!)。それをキャッチしてくれてありがとう!はい、KWテストの結果は使用しませんが、常に最初に確認することをお勧めします。そうでない場合、複数の事後テストは意味がありません(または少なくとも、データのスヌーピングを示唆します)。なお、私は、コードと何が重要であることが判明修正しましたが、私は重大な結果を明瞭にするために、元の画像を残しました。
11

興味のある方のために、結果をボックスプロットに書き込むようにコードを少し変更しました:MyText = rep( ''、nlevels(dd g))、rep(max(dd G))のMyText)g))for(iin1:ncol(signif.pairs))MyText[signif.pairs[,i]]=paste(MyText[signif.pairs[,i]],letters[i],sep=)text(c(1:nlevels(ddy)+1,nlevels(dd
Ilik
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.