Test d'hypothèse pour la différence de médiane entre plus de deux échantillons

12

Question

Les résultats des tests de trois groupes de personnes sont enregistrés en tant que vecteurs distincts dans 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)

Je veux savoir s'il y a une différence significative dans les médianes entre ces groupes. Je sais que je pourrais tester le groupe 1 contre le groupe 2 en utilisant le test de Wilcoxon, comme ça.

wilcox.test(group1, group2)

Cependant, cela ne compare que deux groupes à la fois, et je voudrais comparer les trois simultanément. Je voudrais un test statistique qui donne une valeur ap au niveau de signification 0,05. Quelqu'un pourrait-il m'aider?

Edit # 1 - Test médian de Mood

Après la réponse suggérée de l'utilisateur Hibernating, j'ai essayé le test médian de 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)

Cependant, cette approche me permet de tester une différence significative entre les médianes de seulement deux groupes à la fois. Je ne sais pas comment l'utiliser pour comparer les médianes des trois simultanément.

Edit # 2 - Test de Kruskal-Wallis

La réponse suggérée par l'utilisateur dmartin semble être plus ou moins ce dont j'ai besoin et me permet de tester les trois groupes simultanément.

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

Éditer # 3

L'utilisateur Greg Snow note utilement dans sa réponse que le test de Kruskal-Wallis est approprié tant qu'il fait des hypothèses strictes qui en font également un test de moyens.

Alexandre
la source
Il y a déjà eu un certain nombre de questions similaires sur ce site. Veuillez rechercher median test. Ma propre réponse / commentaires est ici .
ttnphns
Quant à comparer les médianes des trois simultanément, voir ma modification pour le code R légèrement modifié.
Hibernation le

Réponses:

4

Le test de Kruskal-Wallis pourrait également être utilisé, car il s'agit d'une ANOVA non paramétrique. De plus, il est souvent considéré comme plus puissant que le test médian de Mood . Il peut être implémenté dans R en utilisant la fonction kruskal.test dans le package de statistiques dans R.

Pour répondre à votre modification, l'interprétation de KW est similaire à une ANOVA unidirectionnelle. Une valeur de p significative correspond au rejet de la valeur nulle que les trois moyennes sont égales. Vous devez utiliser un test de suivi (à nouveau, tout comme une ANOVA), pour répondre aux questions sur des groupes spécifiques. Cela suit généralement les questions de recherche spécifiques que vous pourriez avoir. En regardant simplement les paramètres de la simulation, les trois groupes devraient être significativement différents les uns des autres si vous effectuez un test de suivi (car ils sont tous à 1 écart de SD avec N = 100).

dmartin
la source
1
Pour clarifier deux ou trois choses. 1) Kruskal-Wallis n'est pas un test des médianes, sauf si les distributions des observations dans les groupes répondent à certaines hypothèses. Si vous cherchez vraiment à comparer les médianes, ce n'est peut-être pas le test approprié. Il est préférable de choisir un test qui teste réellement l'hypothèse que vous souhaitez tester. 2) Kruskal-Wallis n'est pas une "ANOVA". Autrement dit, il ne s'agit pas d'une analyse de la variance. 3) La mention de «moyens» dans cette réponse est incorrecte.
Sal Mangiafico
10

Premièrement, le test de Wilcoxon (ou test de Mann-Whitney) n'est pas un test des médianes (sauf si vous faites des hypothèses très strictes qui en font également un test des moyens). Et pour comparer plus de 2 groupes, le test de Wilcoxon peut conduire à des résultats paradoxaux (voir Efron's Dice ).

Étant donné que le test de Wilcoxon n'est qu'un cas particulier d'un test de permutation et que vous êtes spécifiquement intéressé par les médianes, je suggère un test de permutation sur les médianes.

Choisissez d'abord une mesure de la différence, quelque chose comme la plus grande des 3 médianes moins la plus petite des 3 (ou la variance des 3 médianes, ou le MAD, etc.).

Calculez maintenant votre statistique pour les données d'origine.

regrouper toutes les données dans un ensemble, puis partitionner aléatoirement les valeurs en 3 groupes de

mêmes tailles que l'original et calculer la même statistique.

répéter plusieurs fois (comme 9998)

Comparez la comparaison des statistiques des données réelles avec la distribution de toutes les statistiques de votre test.

Greg Snow
la source
Disons que je suis prêt à faire les hypothèses strictes nécessaires au test de Wilcox qui en feraient également un test de moyens. Cela nécessiterait-il de changer le code R que j'ai écrit ci-dessus? Cela pourrait-il également être fait pour le test de Kruskal-Wallis?
Alexander
1
@Alexander, Si vous êtes prêt à faire ces hypothèses, le code R est correct et Kruskal Wallis conviendrait également. Mais alors, si vous êtes prêt à faire ces hypothèses t.test, ce aovserait probablement bien aussi.
Greg Snow
+1. Si vous parlez, Wilcoxon sum-rank testcela ne vous dérangerait pas de convertir "Wilcox" en ce nom?
ttnphns
@GregSnow +1 pour les points soulevés ... mais je suppose que par "Wilcox" vous voulez dire le test nommé d'après Frank Wilcoxon. (Cette confusion est malheureusement aggravée par R, qui - à tort - appelle le test correspondant wilcox.test). Pourriez-vous modifier?
Glen_b -Reinstate Monica
8

Le test médian de l'humeur est un test non paramétrique utilisé pour tester l'égalité des médianes de deux populations ou plus. Voir ici pour la partie R de votre question. Voir également une question connexe ici . Aussi d' ici :

Le test médian de Mood est le plus simple à faire à la main: calculer la médiane globale (de toutes les données) et compter le nombre de valeurs au-dessus et au-dessous de la médiane dans chaque groupe. Si les groupes sont tous à peu près les mêmes, les observations doivent être d'environ 50 à 50 au-dessus et au-dessous de la médiane globale dans chaque groupe ... Les chiffres des valeurs inférieures à la médiane et supérieures à la médiane ... est ensuite analysé à l'aide d'un test du chi carré. Le test médian de Mood ressemble beaucoup au test de signe généralisé à deux ou plusieurs groupes.

Edit: Pour trois groupes, vous pouvez considérer cette généralisation simple du code R auquel je suis lié:

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
}
Hibernation
la source
1
+1 pour nommer le test. Je ne savais pas que le test médian était aussi appelé test de Mood.
ttnphns du
+1 Merci de m'avoir aidé, j'apprécie vraiment!
Alexander
Je connais quelques implémentations dans R. mood.medtestdans le package RVAideMemoire qui semble être le test habituel, sauf qu'il utilise le test exact de Fisher par défaut pour les plus petits échantillons. La median_testfonction du paquet de pièces peut fournir un test asymptotique ou utiliser Monte Carlo.
Sal Mangiafico
0

Je sais que c'est bien tard, mais je n'ai pas non plus trouvé de bon package pour le test médian de Mood, alors j'ai décidé de créer une fonction dans R qui semble faire l'affaire.

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

    }

}

Pour la question de l'OP, vous devez d'abord l'exécuter pour créer une nouvelle trame de données pour contenir les valeurs de vos trois vecteurs de groupe avec une variable "groupe" correspondante.

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

et exécutez la fonction pour le test médian de Mood avec moods.median(df$value, df$group)

JRF1111
la source
Il semble que le test de Kruskal-Wallis était la réponse. L'OP avait besoin d'une solution avec 3 groupes. Il semble que ttnphns ait déjà fourni le code R pour le test Mood.
Michael R. Chernick
1
Le code donné par ttnphns ne fournit qu'une valeur ap, celui que j'ai écrit donne également la statistique chi au carré et df, et il fonctionne pour n'importe quel nombre de groupes. La plupart du temps, je viens de poster ici, car ce message est le premier à apparaître lors de la recherche de la façon de faire le test médian médian de Mood dans R.
JRF1111