Test di ipotesi per la differenza nelle mediane tra più di due campioni


12

Domanda

I punteggi dei test di tre gruppi di persone vengono salvati come vettori separati in 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)

Voglio sapere se c'è una differenza significativa nelle mediane tra questi gruppi. So che potrei testare il gruppo 1 rispetto al gruppo 2 usando il test Wilcoxon, in questo modo.

wilcox.test(group1, group2)

Tuttavia, questo confronta solo due gruppi alla volta e vorrei confrontare tutti e tre contemporaneamente. Vorrei un test statistico che dia un valore ap al livello di significatività 0,05. Qualcuno potrebbe aiutare per favore?

Modifica n. 1 - Test mediano dell'umore

Seguendo la risposta suggerita dall'utente Hibernating, ho provato il test mediano di 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)

Tuttavia, questo approccio mi consente di verificare una differenza significativa tra le mediane di solo due gruppi alla volta. Non sono sicuro di come usarlo per confrontare le mediane di tutti e tre contemporaneamente.

Modifica n. 2 - Test di Kruskal-Wallis

La risposta suggerita dall'utente dmartin sembra essere più o meno ciò di cui ho bisogno e mi permette di testare tutti e tre i gruppi contemporaneamente.

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

Modifica n. 3

L'utente Greg Snow nota utilmente nella sua risposta che il test Kruskal-Wallis è appropriato fintanto che fa ipotesi rigorose che lo rendono anche un test di mezzi.


Ci sono già state alcune domande simili su questo sito. Per favore, cerca median test. La mia risposta / commenti è qui .
ttnphns,

Per quanto riguarda il confronto simultaneo delle mediane di tutti e tre, vedere la mia modifica per il codice R leggermente modificato.
letargo l'

Risposte:


4

Il test Kruskal-Wallis potrebbe anche essere usato, in quanto è un ANOVA non parametrico. Inoltre, è spesso considerato più potente del test mediano di Mood . Può essere implementato in R usando la funzione kruskal.test nel pacchetto stats in R.

Per rispondere alla tua modifica, interpretare KW è simile a un ANOVA a senso unico. Un valore p significativo corrisponde al rifiuto del valore nullo secondo cui tutte e tre le medie sono uguali. È necessario utilizzare un test di follow-up (di nuovo, proprio come un ANOVA), per rispondere a domande su gruppi specifici. Questo di solito segue specifiche domande di ricerca che potresti avere. Solo osservando i parametri della simulazione, tutti e tre i gruppi dovrebbero essere significativamente diversi l'uno dall'altro se si esegue un test di follow-up (poiché sono tutti 1 SD a parte con N = 100).


1
Per chiarire un paio di cose. 1) Kruskal-Wallis non è un test per i mediani, a meno che le distribuzioni delle osservazioni nei gruppi soddisfino determinati presupposti. Se stai davvero cercando di confrontare le mediane, potrebbe non essere il test appropriato. È meglio scegliere un test che verifichi effettivamente l'ipotesi che si desidera verificare. 2) Kruskal-Wallis non è un "ANOVA". Cioè, non è un'analisi della varianza. 3) La menzione di "significa" in questa risposta non è corretta.
Sal Mangiafico,

10

In primo luogo, il test di Wilcoxon (o test di Mann-Whitney) non è un test di mediane (a meno che non si facciano ipotesi molto rigide che lo rendono anche un test di mezzi). E per confrontare più di 2 gruppi il test di Wilcoxon può portare a risultati paradossali (vedi Dadi di Efron ).

Poiché il test di Wilcoxon è solo un caso speciale di un test di permutazione e tu sei particolarmente interessato ai mediani, suggerirei un test di permutazione sui mediani.

Per prima cosa scegli una misura della differenza, qualcosa come il più grande dei 3 mediani meno il più piccolo dei 3 (o la varianza dei 3 mediani, o il MAD, ecc.).

Ora calcola la tua statistica per i dati originali.

raggruppare tutti i dati in un set quindi partizionare casualmente i valori in 3 gruppi di

stesse dimensioni dell'originale e calcola la stessa statistica.

ripetere più volte (come 9998)

Confronta come la statistica dei dati reali si confronta con la distribuzione di tutte le statistiche per il tuo test.


Diciamo che sono disposto a fare le assunzioni rigorose necessarie per il test di Wilcox che lo renderebbero anche un test di mezzi. Ciò richiederebbe la modifica del codice R che ho scritto sopra? Questo potrebbe essere fatto anche per il test Kruskal-Wallis?
Alexander

1
@Alexander, Se sei disposto a fare queste ipotesi, allora il codice R va bene e Kruskal Wallis starebbe bene. Ma poi se sei disposto a fare quelle ipotesi allora t.teste aovprobabilmente andrebbe bene anche.
Greg Snow,

+1. Se stai parlando Wilcoxon sum-rank testnon ti dispiacerebbe convertire "Wilcox" a quel nome?
ttnphns,

@GregSnow +1 per i punti fatti ... ma suppongo che per "Wilcox" intendi il test intitolato a Frank Wilcoxon. (Questa confusione è purtroppo aggravata da R, che - ingannevolmente - chiama il test corrispondente wilcox.test). Potresti modificare?
Glen_b

8

Il test mediano dell'umore è un test non parametrico che viene utilizzato per testare l'uguaglianza dei mediani da due o più popolazioni. Vedi qui per la parte R della tua domanda. Vedi anche una domanda correlata qui . Anche da qui :

Il test mediano di Mood è il più semplice da fare a mano: calcolare la mediana complessiva (di tutti i dati) e contare quanti valori sono sopra e sotto la mediana in ciascun gruppo. Se i gruppi sono tutti uguali, le osservazioni dovrebbero essere circa 50-50 al di sopra e al di sotto della mediana complessiva in ciascun gruppo ... I conteggi della mediana inferiore e della mediana superiore formano una tabella a due vie, che viene quindi analizzato utilizzando un test chi-quadrato. Il test mediano di Mood è molto simile al test dei segni generalizzato a due o più gruppi.

Modifica: per tre gruppi, puoi prendere in considerazione questa semplice generalizzazione del codice R a cui ho collegato:

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
+1 per nominare il test. Non sapevo che il test mediano si chiamasse anche test dell'umore.
ttnphns,

+1 Grazie per avermi aiutato in questo, lo apprezzo davvero!
Alexander

Conosco un paio di implementazioni in R. mood.medtestnel pacchetto RVAideMemoire sembra essere il solito test tranne per il fatto che utilizza il test esatto di Fisher per impostazione predefinita per campioni di dimensioni inferiori. La median_testfunzione nel pacchetto di monete può fornire un test asintotico o utilizzare Monte Carlo.
Sal Mangiafico,

0

So che è molto tardi, ma non sono riuscito a trovare neanche un buon pacchetto per il test mediano di Mood, quindi mi sono preso la testa di fare una funzione in R che sembra fare il trucco.

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

    }

}

Per la domanda del PO, dovresti prima eseguirlo per creare un nuovo frame di dati per contenere i valori dei tuoi tre vettori di gruppo con una variabile "group" corrispondente.

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

ed esegui la funzione per il test mediano di Mood con moods.median(df$value, df$group)


Sembra che il test Kruskal-Wallis sia stata la risposta. L'OP aveva bisogno di una soluzione con 3 gruppi. Sembra che ttnphns abbia già fornito il codice R per il test Mood.
Michael R. Chernick, il

1
Il codice che ttnphns ha fornito fornisce solo un valore ap, quello che ho scritto fornisce anche il chi quadrato stat e df, e funziona per qualsiasi numero di gruppi. Per lo più ho appena pubblicato qui poiché questo post è il primo a venire alla ricerca di come eseguire il test mediano mediano di Mood in R.
JRF1111
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.