İkiden fazla örnek arasında medyanlarda farklılık için hipotez testi


12

Soru

Üç grubun test puanları R'de ayrı vektörler olarak kaydedilir.

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

Bu gruplar arasındaki medyanlarda önemli bir fark olup olmadığını bilmek istiyorum . Wilcoxon testini kullanarak grup 1'i grup 2'ye karşı test edebileceğimi biliyorum.

wilcox.test(group1, group2)

Ancak, bu bir seferde sadece iki grubu karşılaştırır ve üçünü de aynı anda karşılaştırmak istiyorum. 0.05 anlamlılık düzeyinde p değeri veren istatistiksel bir test istiyorum. Birisi yardım edebilir mi lütfen?

Düzenleme # 1 - Ruh Halinin Medyan Testi

Kullanıcı Hazırda Bekletme'nin önerdiği cevabı takiben Mood'un medyan testini denedim.

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)

Ancak, bu yaklaşım bir seferde sadece iki grubun medyanları arasında anlamlı bir fark olup olmadığımı test etmeme izin veriyor. Üçünün medyanlarını aynı anda karşılaştırmak için nasıl kullanılacağından emin değilim.

Edit # 2 - Kruskal-Wallis testi

Kullanıcı dmartin'in önerdiği cevap az çok ihtiyacım olan şey gibi görünüyor ve üç grubu da aynı anda test etmeme izin veriyor.

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

# 3'ü düzenle

Kullanıcı Greg Snow, cevabında Kruskal-Wallis testinin, aynı zamanda bir araç testi yapan katı varsayımlar yaptığı sürece uygun olduğunu belirtiyor.


Bu sitede zaten benzer sorular var. Lütfen arayın median test. Kendi cevabım / yorumlarım burada .
ttnphns

Her üçünün de medyanlarını aynı anda karşılaştırmaya gelince, biraz değiştirilmiş R kodu için düzenlememe bakın.
Kış uykusuna yatan

Yanıtlar:


4

Parametrik olmayan bir ANOVA olduğu için Kruskal-Wallis testi de kullanılabilir. Ek olarak, genellikle Mood'un medyan testinden daha güçlü olduğu düşünülmektedir . R'deki istatistik paketindeki kruskal.test işlevi kullanılarak R'de uygulanabilir.

Düzenlemenize yanıt vermek için, KW'yi yorumlamak tek yönlü bir ANOVA'ya benzer. Önemli bir p değeri, her üç aracın da eşit olduğu null değerinin reddedilmesine karşılık gelir. Belirli gruplarla ilgili soruları cevaplamak için bir takip testi kullanmalısınız (yine ANOVA gibi). Bu genellikle sahip olabileceğiniz belirli araştırma sorularını takip eder. Sadece simülasyonun parametrelerine bakarak, bir takip testi yaparsanız (hepsi N = 100 ile 1 SD olduğu için) üç grubun da birbirinden önemli ölçüde farklı olması gerekir.


1
Birkaç şeyi açıklığa kavuşturmak için. 1) Kruskal-Wallis, gruplardaki gözlemlerin dağılımı belirli varsayımları karşılamadığı sürece, medyan testi değildir. Gerçekten medyanları karşılaştırmak istiyorsanız, uygun test olmayabilir. Test etmek istediğiniz hipotezi gerçekten test eden bir test seçmek en iyisidir. 2) Kruskal-Wallis bir "ANOVA" değildir. Yani, bir varyans analizi değildir. 3) Bu cevapta "araç" ifadesi yanlıştır.
Sal Mangiafico

10

İlk olarak, Wilcoxon testi (veya Mann-Whitney testi) medyanların bir testi değildir (aynı zamanda bir araç testi de yapan çok katı varsayımlar yapmazsanız). Ve 2'den fazla grubu karşılaştırmak için Wilcoxon testi bazı paradoksal sonuçlara yol açabilir (bkz. Efron'un Zarları ).

Wilcoxon testi sadece permütasyon testinin özel bir vakası olduğundan ve özellikle medyanlarla ilgileniyorsanız, medyanlar üzerinde bir permütasyon testi öneririm .

Önce farkın bir ölçüsünü seçin, 3 medyanın en büyüğü eksi 3'ün en küçüğü (veya 3 medyanın varyansı veya MAD, vb.)

Şimdi orijinal veriler için statünüzü hesaplayın.

tüm verileri bir sette toplayın ve ardından değerleri rastgele 3 gruba bölün.

orijinalle aynı boyutlarda ve aynı istatistiği hesaplar.

birçok kez tekrarlayın (9998 gibi)

Gerçek verilerdeki istatistiklerin testiniz için tüm istatistiklerin dağılımıyla nasıl karşılaştırıldığını karşılaştırın.


Diyelim ki, Wilcox testi için gerekli olan ve aynı zamanda bir araç testi yapacak olan katı varsayımları yapmaya hazırım. Bu, yukarıda yazdığım R kodunun değiştirilmesini gerektirir mi? Bu Kruskal-Wallis testi için de yapılabilir mi?
İskender

1
@Alexander, Eğer bu varsayımları yapmak istiyorsanız, R kodu iyi ve Kruskal Wallis de iyi olur. Ama o zaman bu varsayımları yapmaya istekli iseniz t.testve aovmuhtemelen de iyi olur.
Greg Snow

+1. Eğer bahsediyorsanız Wilcoxon sum-rank test, "Wilcox" u bu isme dönüştürmeyi düşünmez misiniz?
ttnphns

@GregSnow +1 puanlar için ... ama sanırım 'Wilcox' ile Frank Wilcoxon'un adını taşıyan testi kastediyorsunuz. (Bu karışıklık maalesef, yanıltıcı bir şekilde karşılık gelen testi çağıran R ile birleştirilir wilcox.test). Düzenleyebilir misiniz?
Glen_b

8

Mood'un medyan testi, iki veya daha fazla popülasyondan medyanların eşitliğini test etmek için kullanılan parametrik olmayan bir testtir. Sorunuzun R kısmı için buraya bakın . Ayrıca ilgili bir soruya bakın burada . Ayrıca buradan :

Mood'un medyan testi elle yapılması en kolay olanıdır: genel medyanı (tüm verilerin) çalışın ve her grupta medyanın üstünde ve altında kaç değer olduğunu sayın. Grupların hepsi hemen hemen aynıysa, gözlemler her gruptaki genel medyanın yaklaşık 50-50 üstünde ve altında olmalıdır ... Medyanın altında ve medyanın üstünde ... iki yönlü bir tablo oluşturur. daha sonra ki-kare testi kullanılarak analiz edilir. Mood'un medyan testi, iki veya daha fazla gruba genelleştirilmiş işaret testine çok benzer.

Düzenleme: Üç grup için, ben bağlı R kodunun bu basit genelleme düşünebilirsiniz:

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
}

1
Testi adlandırmak için +1. Medyan testinin Mood testi olarak da adlandırıldığını bilmiyordum.
ttnphns

+1 Bu konuda bana yardımcı olduğun için teşekkürler, gerçekten minnettarım!
Alexander

mood.medtestRVAideMemoire paketinde R.'de birkaç uygulama olduğunu biliyorum, daha küçük örnek boyutları için varsayılan olarak Fisher kesin testini kullanması dışında olağan test gibi görünüyor. median_testPara paketinde fonksiyonu bir asimptotik testi sağlamak ya da Monte Carlo kullanabilir.
Sal Mangiafico

0

Bunun çok geç olduğunu biliyorum, ama Mood'un medyan testi için de iyi bir paket bulamadım, bu yüzden R'de hile yapan bir işlev yapmak için kendime aldım.

#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))

    }

}

OP sorusu için, ilk olarak eşleşen bir "grup" değişkeniyle üç grup vektörünüzdeki değerleri tutmak için yeni bir veri çerçevesi yapmak için bunu çalıştırırsınız.

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

ve Mood'un medyan testi fonksiyonunu moods.median(df$value, df$group)


Yanıt Kruskal-Wallis testinin cevap olduğu anlaşılıyor. OP'nin 3 gruplu bir çözüme ihtiyacı vardı. Görünüşe göre ttnphns Mood testi için zaten R kodu sağlamıştır.
Michael R.Chickick

1
Kod ttnphns sadece bir p değeri verir, ben yazdım da chi kare stat ve df verir ve herhangi bir sayıda grup için çalışır. Çoğunlukla burada yayınladım, çünkü bu yazı
Mood'un
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.