Menyoroti hasil signifikan dari beberapa perbandingan non-parametrik pada plot kotak

9

Saya memiliki plot kotak dari 13 grup yang saya tampilkan dalam satu plot. Kelompok-kelompok tersebut memiliki populasi yang tidak seimbang dan tidak terdistribusi secara normal. Saya ingin menunjukkan pasangan mana yang secara statistik serupa (yaitu, memiliki nilai p kruskal.test <0,05) dengan meletakkan a, b, c, dll di atas kotak yang cocok. Berikut adalah kode semu untuk menunjukkan apa yang saya miliki:

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) 

Berikut adalah plot yang saya temukan yang melakukan apa yang saya inginkan (kecuali saya memiliki 13 grup dalam satu baris):

Ilik
sumber

Jawaban:

7

Kode paling sederhana yang muncul di benak saya ditunjukkan di bawah ini. Saya cukup yakin ada beberapa fungsi yang sudah ada untuk melakukan itu pada CRAN tetapi saya terlalu malas untuk mencari mereka, bahkan pada pencarian-R .

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)

Berikut adalah contoh dari apa yang dihasilkan oleh kode di atas (dengan perbedaan yang signifikan antara keempat kelompok):

masukkan deskripsi gambar di sini

Alih-alih tes Wilcoxon, orang bisa mengandalkan prosedur yang diimplementasikan dalam kruskalmc()fungsi dari paket pgirmess (lihat deskripsi prosedur yang digunakan di sini ).

Juga, pastikan untuk memeriksa tips R Rudolf Cardinal tentang R: grafik dasar 2 (lihat khususnya, grafik batang lain, dengan anotasi ).

chl
sumber
Terima kasih, chl. Saya bukan ahli statistik jadi saya perlu mempelajari jawaban Anda lebih lanjut, tetapi sepertinya ia melakukan apa yang saya butuhkan.
Ilik
Jika ada sesuatu yang tidak jelas, jangan ragu untuk bertanya. Tidak ada banyak hal statistik di sini: Saya menggunakan tes Wilcoxon untuk perbandingan kelompok berpasangan dan mengoreksi nilai-p individu untuk membatasi risiko keseluruhan positif palsu hingga 5%. The npmc paket termasuk fasilitas tambahan untuk menangani beberapa perbandingan non-parametrik, tetapi ada juga koin kerangka. Sisanya murni kode R menggunakan grafis dasar R; itu bisa dilakukan dengan lattice atau ggplot2 juga.
chl
Saya minta maaf atas ketidaktahuan saya dalam statistik. Jadi saya mencoba kode Anda dan saya pertama kali memperhatikan Anda menghitung kruskal.test tetapi tidak menggunakan hasilnya (aov.res). Saya sekarang mengerti wilcox.test adalah kasus khusus untuk kruskal untuk dua sampel. Tetapi kemudian saya mencoba mengubah nilai-nilai dalam kelompok saya untuk membuatnya (secara intuitif) berbeda dan melihat apa yang muncul. 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 sekarang sangat berbeda ?? dan g3 & g4 bukan? tidak yakin saya mengerti mengapa.
Ilik
@Ilik Sesuatu yang salah dalam kode saya ( with(dd,instruksi berada di tempat yang salah mengakibatkan tes aneh!). Terima kasih telah menangkap itu! Ya, saya tidak menggunakan hasil dari tes KW tapi itu selalu ide yang baik untuk memeriksanya terlebih dahulu, jika beberapa tes post-hoc akan menjadi tidak berarti (atau paling tidak, menganjurkan data mengintai). Catatan saya telah memperbaiki kode dan ternyata tidak ada yang signifikan, tetapi saya meninggalkan gambar asli demi kejelasan dengan hasil yang signifikan.
chl
Bagi siapa pun yang tertarik, saya telah sedikit mengubah kode untuk menulis hasilnya ke boxplot: MyText = rep ('', nlevels (ddg))for(iin1:ncol(signif.pairs))MyText[signif.pairs[,i]]=paste(MyText[signif.pairs[,i]],letters[i],sep=)text(c(1:nlevels(ddg)), rep (maks (dd g)), MyText)y)+1,nlevels(dd
Ilik