Hypothesentest für Medianunterschiede zwischen mehr als zwei Stichproben

12

Frage

Die Testergebnisse von drei Personengruppen werden als separate Vektoren in R gespeichert.

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

Ich möchte wissen, ob es einen signifikanten Unterschied in den Medianwerten zwischen diesen Gruppen gibt. Ich weiß, dass ich mit dem Wilcoxon-Test Gruppe 1 gegen Gruppe 2 testen kann.

wilcox.test(group1, group2)

Dabei werden jedoch nur zwei Gruppen gleichzeitig verglichen, und ich möchte alle drei gleichzeitig vergleichen. Ich hätte gerne einen statistischen Test, der einen p-Wert bei einem Signifikanzniveau von 0,05 ergibt. Könnte jemand bitte helfen?

Edit # 1 - Mood's Median Test

Nach der von Benutzer Hibernating vorgeschlagenen Antwort habe ich den Mood-Median-Test durchgeführt.

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)

Mit diesem Ansatz kann ich jedoch auf einen signifikanten Unterschied zwischen den Medianwerten von jeweils nur zwei Gruppen testen. Ich bin mir nicht sicher, wie ich damit die Mediane aller drei gleichzeitig vergleichen soll.

Edit # 2 - Kruskal-Wallis-Test

Die von Benutzer dmartin vorgeschlagene Antwort scheint mehr oder weniger das zu sein, was ich brauche, und ermöglicht es mir, alle drei Gruppen gleichzeitig zu testen.

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

Bearbeiten Sie # 3

Der Benutzer Greg Snow merkt in seiner Antwort hilfreich an, dass der Kruskal-Wallis-Test angemessen ist, solange strenge Annahmen getroffen werden, die ihn auch zu einem Mittelwerttest machen.

Alexander
quelle
Auf dieser Website gab es bereits eine Reihe ähnlicher Fragen. Bitte suchen Sie nach median test. Meine eigenen Antworten / Kommentare sind hier .
TTNPHNS
Zum Vergleich der Mediane aller drei gleichzeitig siehe meine Bearbeitung für den leicht geänderten R-Code.
Winterschlaf am

Antworten:

4

Der Kruskal-Wallis-Test kann ebenfalls verwendet werden, da es sich um eine nicht parametrische ANOVA handelt. Darüber hinaus wird es oft als leistungsstärker angesehen als der Mood-Median-Test . Es kann in R implementiert werden, indem die Funktion kruskal.test im Statistikpaket in R verwendet wird.

Um auf Ihre Bearbeitung zu reagieren, ähnelt das Interpretieren von KW einer Einweg-ANOVA. Ein signifikanter p-Wert entspricht der abgelehnten Null, dass alle drei Mittelwerte gleich sind. Sie müssen einen Folgetest verwenden (wie bei einer ANOVA), um Fragen zu bestimmten Gruppen zu beantworten. Dies ergibt sich normalerweise aus spezifischen Forschungsfragen, die Sie möglicherweise haben. Wenn Sie nur die Parameter der Simulation betrachten, sollten sich alle drei Gruppen erheblich voneinander unterscheiden, wenn Sie einen Folgetest durchführen (da alle 1 SD mit N = 100 auseinanderliegen).

dmartin
quelle
1
Um ein paar Dinge zu klären. 1) Kruskal-Wallis ist kein Median-Test, es sei denn, die Verteilung der Beobachtungen in den Gruppen entspricht bestimmten Annahmen. Wenn Sie wirklich Mediane vergleichen möchten, ist dies möglicherweise nicht der richtige Test. Wählen Sie am besten einen Test, der tatsächlich die Hypothese testet, an der Sie interessiert sind. 2) Kruskal-Wallis ist keine "ANOVA". Das heißt, es ist keine Varianzanalyse. 3) Die Erwähnung von "bedeutet" in dieser Antwort ist falsch.
Sal Mangiafico
10

Erstens ist der Wilcoxon-Test (oder der Mann-Whitney-Test) kein Median-Test (es sei denn, Sie treffen sehr strenge Annahmen, die ihn auch zu einem Mittelwerttest machen). Beim Vergleich von mehr als zwei Gruppen kann der Wilcoxon-Test zu paradoxen Ergebnissen führen (siehe Efrons Würfel ).

Da der Wilcoxon-Test nur ein Sonderfall eines Permutationstests ist und Sie sich speziell für die Mediane interessieren, würde ich einen Permutationstest für die Mediane vorschlagen .

Wählen Sie zunächst ein Maß für die Differenz, etwa den größten der 3 Mediane minus den kleinsten der 3 (oder die Varianz der 3 Mediane oder die MAD usw.).

Berechnen Sie nun Ihre Statistik für die Originaldaten.

bündeln Sie alle Daten in einem Satz und unterteilen Sie die Werte nach dem Zufallsprinzip in 3 Gruppen

Dieselbe Größe wie das Original und dieselbe Statistik berechnen.

mehrmals wiederholen (wie 9998)

Vergleichen Sie, wie die Statistik aus den realen Daten mit der Verteilung aller Statistiken für Ihren Test verglichen wird.

Greg Snow
quelle
Nehmen wir an, ich bin bereit, die strengen Annahmen zu treffen, die für den Wilcox-Test erforderlich sind, und würde ihn auch zu einem Mittelwerttest machen. Müsste dafür der R-Code geändert werden, den ich oben geschrieben habe? Könnte dies auch für den Kruskal-Wallis-Test gemacht werden?
Alexander
1
@Alexander, Wenn Sie bereit sind, diese Annahmen zu treffen, ist der R-Code in Ordnung und Kruskal Wallis wäre auch in Ordnung. Aber dann , wenn Sie bereit sind , dann diese Annahmen zu treffen , t.testund aovwürde wahrscheinlich gut als gut.
Greg Snow
+1. Wenn Sie darüber sprechen, Wilcoxon sum-rank testwürde es Ihnen nichts ausmachen, "Wilcox" in diesen Namen umzuwandeln?
TTNPHNS
@ GregSnow +1 für die Punkte gemacht ... aber ich nehme an, mit "Wilcox" meinen Sie den nach Frank Wilcoxon benannten Test. (Diese Verwirrung wird leider durch R verstärkt, das - irreführend - den entsprechenden Test nennt wilcox.test). Könnten Sie bearbeiten?
Glen_b
8

Der Mood-Median-Test ist ein nichtparametrischer Test, mit dem die Gleichheit von Medianen aus zwei oder mehr Populationen getestet wird. Siehe hier für den R-Teil Ihrer Frage. Siehe auch eine verwandte Frage hier . Auch von hier aus :

Moods Median-Test ist am einfachsten per Hand durchzuführen: Ermitteln Sie den Gesamtmedian (aller Daten) und zählen Sie, wie viele Werte in jeder Gruppe über und unter dem Median liegen. Wenn die Gruppen etwa alle gleich sind, sollten die Beobachtungen in jeder Gruppe etwa 50-50 über und unter dem Gesamtmedian liegen ... Die Zählungen von Unter- und Übermedian ... bilden eine Zwei-Wege-Tabelle, die wird dann unter Verwendung eines Chi-Quadrat-Tests analysiert. Der Mood-Median-Test ähnelt weitgehend dem auf zwei oder mehr Gruppen verallgemeinerten Vorzeichentest.

Bearbeiten: Für drei Gruppen können Sie diese einfache Verallgemeinerung des R-Codes in Betracht ziehen, mit dem ich verknüpft bin:

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
}
Winterschlaf halten
quelle
1
+1 für die Benennung des Tests. Ich wusste nicht, dass Median-Test auch Mood-Test genannt wird.
TTNPHNS
+1 Danke, dass du mir dabei geholfen hast. Ich weiß das wirklich zu schätzen!
Alexander
Ich kenne einige Implementierungen in R. mood.medtestim RVAideMemoire-Paket, die der übliche Test zu sein scheinen, mit der Ausnahme, dass standardmäßig der Fisher-Test für kleinere Stichprobengrößen verwendet wird. Die median_testFunktion in der Münzpackung kann einen asymptotischen Test liefern oder Monte Carlo verwenden.
Sal Mangiafico
0

Ich weiß, dass dies viel zu spät ist, aber ich konnte auch kein gutes Paket für Moods Median-Test finden, also habe ich es auf mich genommen, eine Funktion in R zu erstellen, die den Trick zu tun scheint.

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

    }

}

Für die Frage des OP würden Sie dies zuerst ausführen, um einen neuen Datenrahmen zu erstellen, der die Werte Ihrer drei Gruppenvektoren mit einer übereinstimmenden "Gruppen" -Variablen enthält.

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

und führen Sie die Funktion für den Mood-Median-Test mit aus moods.median(df$value, df$group)

JRF1111
quelle
Es scheint, dass der Kruskal-Wallis-Test die Antwort war. Das OP benötigte eine Lösung mit 3 Gruppen. Es scheint, dass ttnphns bereits R-Code für den Mood-Test bereitgestellt hat.
Michael R. Chernick
1
Der von ttnphns angegebene Code liefert nur einen p-Wert, der von mir geschriebene gibt auch die Chi-Quadrat-Statistik und df an und funktioniert für eine beliebige Anzahl von Gruppen. Ich habe meistens gerade hier gepostet, da dieser Beitrag der erste ist, der auftaucht, wenn er sucht, wie Moods Median-Median-Test in R durchgeführt wird.
JRF1111