Uji hipotesis untuk perbedaan median di antara lebih dari dua sampel

12

Pertanyaan

Skor tes dari tiga kelompok orang disimpan sebagai vektor terpisah dalam R.

set.seed(1)
group1 <- rnorm(100, mean = 75, sd = 10)
group2 <- rnorm(100, mean = 85, sd = 10)
group3 <- rnorm(100, mean = 95, sd = 10)

Saya ingin tahu apakah ada perbedaan signifikan dalam median antara kelompok-kelompok ini. Saya tahu bahwa saya bisa menguji kelompok 1 versus kelompok 2 menggunakan tes Wilcoxon, seperti itu.

wilcox.test(group1, group2)

Namun, ini membandingkan hanya dua grup sekaligus, dan saya ingin membandingkan ketiganya secara bersamaan. Saya ingin tes statistik yang menghasilkan nilai ap pada tingkat signifikansi 0,05. Bisakah seseorang tolong?

Sunting # 1 - Tes median Mood

Mengikuti jawaban yang disarankan pengguna Hibernating, saya mencoba tes median Mood.

median.test <- function(x, y){
    z <- c(x, y)
    g <- rep(1:2, c(length(x), length(y)))
    m <- median(z)
    fisher.test(z < m, g)$p.value
}

median.test(group1, group2)

Namun, pendekatan ini memungkinkan saya untuk menguji perbedaan yang signifikan antara median hanya dua kelompok sekaligus. Saya tidak yakin bagaimana menggunakannya untuk membandingkan median ketiganya secara bersamaan.

Sunting # 2 - Tes Kruskal-Wallis

Jawaban yang disarankan pengguna dmartin tampaknya kurang lebih seperti yang saya butuhkan, dan memungkinkan saya untuk menguji ketiga kelompok secara bersamaan.

kruskal.test(list(group1, group2, group3))

Edit # 3

Pengguna Greg Snow dengan senang hati mencatat dalam jawabannya bahwa tes Kruskal-Wallis sesuai selama itu membuat asumsi-asumsi ketat yang menjadikannya juga ujian cara.

Alexander
sumber
Sudah ada beberapa pertanyaan serupa di situs ini. Silakan mencari median test. Jawaban / komentar saya sendiri ada di sini .
ttnphns
Untuk membandingkan median ketiganya secara bersamaan, lihat edit saya untuk kode R yang sedikit dimodifikasi.
Hibernasi

Jawaban:

4

Tes Kruskal-Wallis juga dapat digunakan, karena merupakan ANOVA non-parametrik. Selain itu, sering dianggap lebih kuat daripada tes median Mood . Ini dapat diimplementasikan dalam R menggunakan fungsi kruskal.test dalam paket statistik di R.

Untuk menanggapi hasil edit Anda, menafsirkan KW mirip dengan ANOVA satu arah. Nilai p signifikan berhubungan dengan menolak nol yang berarti ketiga berarti sama. Anda harus menggunakan tes tindak lanjut (sekali lagi, seperti ANOVA), untuk menjawab pertanyaan tentang grup tertentu. Ini biasanya mengikuti pertanyaan penelitian spesifik yang mungkin Anda miliki. Hanya dengan melihat parameter simulasi, ketiga kelompok harus berbeda secara signifikan satu sama lain jika Anda melakukan tes tindak lanjut (karena mereka semua 1 SD terpisah dengan N = 100).

dmartin
sumber
1
Untuk memperjelas beberapa hal. 1) Kruskal-Wallis bukan tes median, kecuali distribusi pengamatan dalam kelompok memenuhi asumsi tertentu. Jika Anda benar-benar ingin membandingkan median, itu mungkin bukan tes yang tepat. Yang terbaik adalah memilih tes yang benar-benar menguji hipotesis yang Anda minati. 2) Kruskal-Wallis bukan "ANOVA". Artinya, ini bukan analisis varian. 3) Penyebutan "berarti" dalam jawaban ini salah.
Sal Mangiafico
10

Pertama, tes Wilcoxon (atau tes Mann-Whitney) bukan tes median (kecuali Anda membuat asumsi yang sangat ketat yang juga menjadikannya tes berarti). Dan untuk membandingkan lebih dari 2 kelompok, uji Wilcoxon dapat mengarah pada beberapa hasil paradoks (lihat Efron's Dice ).

Karena tes Wilcoxon hanyalah kasus khusus dari tes permutasi dan Anda secara khusus tertarik pada median, saya akan menyarankan tes permutasi pada median.

Pertama-tama pilih ukuran perbedaan, sesuatu seperti yang terbesar dari 3 median minus yang terkecil dari 3 (atau varians dari 3 median, atau MAD, dll).

Sekarang hitung stat Anda untuk data asli.

pool semua data dalam satu set kemudian secara acak mempartisi nilai menjadi 3 kelompok

ukuran yang sama seperti aslinya dan menghitung statistik yang sama.

ulangi berkali-kali (seperti 9998)

Bandingkan bagaimana statistik dari data nyata dibandingkan dengan distribusi semua statistik untuk pengujian Anda.

Greg Snow
sumber
Katakanlah saya bersedia membuat asumsi ketat yang diperlukan untuk uji Wilcox yang juga akan menjadikannya sebagai uji kemampuan. Apakah itu perlu mengubah kode R yang saya tulis di atas? Mungkinkah ini juga dilakukan untuk tes Kruskal-Wallis?
Alexander
1
@Alexander, Jika Anda bersedia membuat asumsi itu maka kode R baik-baik saja dan Kruskal Wallis juga akan baik-baik saja. Tetapi kemudian jika Anda bersedia membuat asumsi-asumsi itu t.testdan aovmungkin juga akan baik-baik saja.
Greg Snow
+1. Jika Anda berbicara tentang Wilcoxon sum-rank testapakah Anda tidak keberatan untuk mengkonversi "Wilcox" ke nama itu?
ttnphns
@GregSnow +1 untuk poin yang dibuat ... tapi saya berasumsi dengan 'Wilcox' maksud Anda tes dinamai Frank Wilcoxon. (Sayangnya kebingungan ini diperparah oleh R, yang - menyesatkan - menyebut tes yang sesuai wilcox.test). Bisakah Anda mengedit?
Glen_b -Reinstate Monica
8

Tes median Mood adalah tes nonparametrik yang digunakan untuk menguji kesetaraan median dari dua atau lebih populasi. Lihat di sini untuk bagian R dari pertanyaan Anda. Lihat juga pertanyaan terkait di sini . Juga dari sini :

Tes median Mood adalah yang paling mudah dilakukan dengan tangan: kerjakan median keseluruhan (dari semua data), dan hitung berapa banyak nilai di atas dan di bawah median di setiap kelompok. Jika semua kelompok hampir sama, pengamatan harus sekitar 50-50 di atas dan di bawah rata-rata keseluruhan di setiap kelompok ... Jumlah di bawah median dan di atas median ... membentuk tabel dua arah, yang kemudian dianalisis menggunakan uji chi-squared. Tes median Mood sangat mirip dengan tes tanda yang digeneralisasikan ke dua atau lebih kelompok.

Sunting: Untuk tiga grup, Anda dapat mempertimbangkan generalisasi sederhana kode R yang saya tautkan ke:

median.test2 <- function(x, y, z) {
  a <- c(x, y, z)
  g <- rep(1:3, c(length(x), length(y), length(z)))
  m <- median(a)
  fisher.test(a < m, g)$p.value
}
Hibernasi
sumber
1
+1 untuk penamaan tes. Saya tidak tahu bahwa tes median juga disebut tes Mood.
ttnphns
+1 Terima kasih telah membantu saya dengan ini, saya sangat menghargainya!
Alexander
Saya tahu beberapa implementasi dalam R. mood.medtestdalam paket RVAideMemoire tampaknya menjadi tes biasa kecuali bahwa ia menggunakan uji pasti Fisher secara default untuk ukuran sampel yang lebih kecil. The median_testfungsi dalam paket koin dapat memberikan tes asimtotik atau menggunakan Monte Carlo.
Sal Mangiafico
0

Saya tahu ini terlambat, tetapi saya juga tidak bisa menemukan paket yang bagus untuk tes median Mood, jadi saya mengambilnya sendiri untuk membuat fungsi dalam R yang tampaknya melakukan trik.

#Mood's median test for a data frame with one column containing data (d),
#and another containing a factor/grouping variable (f)

moods.median = function(d,f) {

    #make a new matrix data frame
    m = cbind(f,d)
    colnames(m) = c("group", "value")


    #get the names of the factors/groups
    facs = unique(f)

    #count the number of factors/groups
    factorN = length(unique(f))


    #Make a 2 by K table that will be saved to the global environment by using "<<-":
    #2 rows (number of values > overall median & number of values <= overall median)
    #K-many columns for each level of the factor
    MoodsMedianTable <<- matrix(NA, nrow = 2, ncol = factorN)

    rownames(MoodsMedianTable) <<- c("> overall median", "<= overall median")
    colnames(MoodsMedianTable) <<- c(facs[1:factorN])
    colnames(MoodsMedianTable) <<- paste("Factor: ",colnames(MoodsMedianTable))


    #get the overall median
    overallmedian = median(d)



    #put the following into the 2 by K table:
    for(j in 1:factorN){ #for each factor level

        g = facs[j] #assign a temporary "group name"


        #count the number of observations in the factor that are greater than
        #the overall median and save it to the table
        MoodsMedianTable[1,j] <<- sum(m[,2][ which(m[,1]==g)] > overallmedian)


        #count the number of observations in the factor that are less than
        # or equal to the overall median and save it to the table
        MoodsMedianTable[2,j] <<- sum(m[,2][ which(m[,1]==g)] <= overallmedian)

    }


    #percent of cells with expected values less than 5
    percLT5 = ((sum(chisq.test(MoodsMedianTable)$expected < 5)) /
        (length(chisq.test(MoodsMedianTable)$expected)))


    #if >20% of cells have expected values less than 5
    #then give chi-squared stat, df, and Fisher's exact p.value
    if (percLT5 > 0.2) {
        return(list(
            "Chi-squared" = chisq.test(MoodsMedianTable)$statistic,
            "df" = chisq.test(MoodsMedianTable)$parameter,
            "Fisher's exact p.value" = fisher.test(MoodsMedianTable)$p.value))

    }


    #if <= 20% of cells have expected values less than 5
    #then give chi-squared stat, df, and chi-squared p.value
    if (percLT5 <= 0.2) {
        return(list(
            "Chi-squared" = chisq.test(MoodsMedianTable)$statistic,
            "df" = chisq.test(MoodsMedianTable)$parameter,
            "Chi-squared p.value" = chisq.test(MoodsMedianTable)$p.value))

    }

}

Untuk pertanyaan OP, pertama-tama Anda akan menjalankan ini untuk membuat bingkai data baru untuk menyimpan nilai-nilai dari tiga vektor grup Anda dengan variabel "grup" yang cocok.

require(reshape2)
df = cbind(group1, group2, group3)
df = melt(df)
colnames(df) = c("observation", "group", "value")

dan menjalankan fungsi untuk tes median Mood dengan moods.median(df$value, df$group)

JRF1111
sumber
Tampaknya tes Kruskal-Wallis adalah jawabannya. OP membutuhkan solusi dengan 3 kelompok. Tampaknya ttnphns telah memberikan kode R untuk pengujian Mood.
Michael R. Chernick
1
Kode yang diberikan ttnphns hanya memberikan nilai ap, kode yang saya tulis juga memberikan statistik kuadrat dan df, dan itu berfungsi untuk sejumlah grup. Saya kebanyakan hanya memposting di sini karena posting ini adalah yang pertama muncul ketika mencari bagaimana melakukan tes median Mood di R.
JRF1111