Prueba de hipótesis para la diferencia en medianas entre más de dos muestras


12

Pregunta

Los puntajes de las pruebas de tres grupos de personas se guardan como vectores separados en 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)

Quiero saber si hay una diferencia significativa en las medianas entre estos grupos. Sé que podría probar el grupo 1 versus el grupo 2 usando la prueba de Wilcoxon, así.

wilcox.test(group1, group2)

Sin embargo, esto compara solo dos grupos a la vez, y me gustaría comparar los tres simultáneamente. Me gustaría una prueba estadística que arroje un valor p en el nivel de significancia de 0.05. ¿Podría alguien ayudarme?

Edición n. ° 1: prueba mediana del estado de ánimo

Siguiendo la respuesta sugerida por el usuario Hibernación, probé la prueba mediana 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)

Sin embargo, este enfoque me permite probar una diferencia significativa entre las medianas de solo dos grupos a la vez. No estoy seguro de cómo usarlo para comparar las medianas de los tres simultáneamente.

Edición # 2 - Prueba de Kruskal-Wallis

La respuesta sugerida por el usuario dmartin parece ser más o menos lo que necesito, y me permite probar los tres grupos simultáneamente.

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

Editar # 3

El usuario Greg Snow señala útilmente en su respuesta que la prueba de Kruskal-Wallis es apropiada siempre que haga suposiciones estrictas que la hagan también una prueba de medios.


Ya ha habido una serie de preguntas similares en este sitio. Por favor busque median test. Mi propia respuesta / comentarios está aquí .
ttnphns

En cuanto a comparar las medianas de los tres simultáneamente, vea mi edición para el código R ligeramente modificado.
Hibernando el

Respuestas:


4

La prueba de Kruskal-Wallis también podría usarse, ya que es un ANOVA no paramétrico. Además, a menudo se considera más poderoso que la prueba mediana de Mood . Se puede implementar en R usando la función kruskal.test en el paquete de estadísticas en R.

Para responder a su edición, interpretar KW es similar a un ANOVA unidireccional. Un valor p significativo corresponde a rechazado el nulo de que las tres medias son iguales. Debe usar una prueba de seguimiento (nuevamente, como un ANOVA), para responder preguntas sobre grupos específicos. Esto generalmente sigue preguntas de investigación específicas que pueda tener. Simplemente observando los parámetros de la simulación, los tres grupos deberían ser significativamente diferentes entre sí si realiza una prueba de seguimiento (ya que todos están separados por 1 SD con N = 100).


1
Para aclarar un par de cosas. 1) Kruskal-Wallis no es una prueba de medianas, a menos que las distribuciones de observaciones en los grupos cumplan con ciertos supuestos. Si realmente está buscando comparar medianas, puede que no sea la prueba adecuada. Es mejor elegir una prueba que realmente pruebe la hipótesis que le interesa probar. 2) Kruskal-Wallis no es un "ANOVA". Es decir, no es un análisis de varianza. 3) La mención de "medios" en esta respuesta es incorrecta.
Sal Mangiafico

10

Primero, la prueba de Wilcoxon (o prueba de Mann-Whitney) no es una prueba de medianas (a menos que haga suposiciones muy estrictas que también la hagan una prueba de medios). Y para comparar más de 2 grupos, la prueba de Wilcoxon puede conducir a algunos resultados paradójicos (ver los dados de Efron ).

Dado que la prueba de Wilcoxon es solo un caso especial de una prueba de permutación y usted está específicamente interesado en las medianas, sugeriría una prueba de permutación en las medianas.

Primero elija una medida de la diferencia, algo así como la mayor de las 3 medianas menos la menor de las 3 (o la varianza de las 3 medianas, o la MAD, etc.).

Ahora calcule su estadística para los datos originales.

agrupar todos los datos en un conjunto y luego dividir aleatoriamente los valores en 3 grupos de

mismos tamaños que el original y calculan la misma estadística.

repetir muchas veces (como 9998)

Compare cómo se compara la estadística de los datos reales con la distribución de todas las estadísticas para su prueba.


Digamos que estoy dispuesto a hacer los supuestos estrictos necesarios para la prueba de Wilcox que también la convertirían en una prueba de medios. ¿Eso requeriría cambiar el código R que he escrito anteriormente? ¿Podría esto también hacerse para la prueba de Kruskal-Wallis?
Alexander

1
@Alexander, si está dispuesto a hacer esas suposiciones, entonces el código R está bien y Kruskal Wallis también estaría bien. Pero entonces, si usted está dispuesto a hacer esas suposiciones a continuación t.testy aovprobablemente estaría bien también.
Greg Snow

+1. Si está hablando sobre, Wilcoxon sum-rank test¿no le importaría convertir "Wilcox" a ese nombre?
ttnphns

@GregSnow +1 por los puntos hechos ... pero supongo que por 'Wilcox' te refieres a la prueba que lleva el nombre de Frank Wilcoxon. (Desafortunadamente, esta confusión se agrava con R, que, de manera engañosa, llama a la prueba correspondiente wilcox.test). ¿Podrías editar?
Glen_b: reinstala a Mónica el

8

La prueba mediana del estado de ánimo es una prueba no paramétrica que se utiliza para evaluar la igualdad de las medianas de dos o más poblaciones. Vea aquí la parte R de su pregunta. Vea también una pregunta relacionada aquí . También desde aquí :

La prueba de la mediana del estado de ánimo es la más fácil de hacer a mano: calcule la mediana general (de todos los datos) y cuente cuántos valores están por encima y por debajo de la mediana en cada grupo. Si los grupos son todos iguales, las observaciones deben ser aproximadamente 50-50 por encima y por debajo de la mediana general en cada grupo ... Los recuentos de debajo de la mediana y superior a la mediana ... forman una tabla de dos vías, que luego se analiza usando una prueba de chi-cuadrado. La prueba mediana del estado de ánimo es muy parecida a la prueba de signos generalizada a dos o más grupos.

Editar: para tres grupos, puede considerar esta simple generalización del código R al que me vinculé:

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 para nombrar la prueba. No sabía que la prueba mediana también se llama prueba de estado de ánimo.
ttnphns

+1 Gracias por ayudarme con esto, ¡realmente lo aprecio!
Alexander

Sé de un par de implementaciones en R. mood.medtesten el paquete RVAideMemoire parece ser la prueba habitual, excepto que utiliza la prueba exacta de Fisher por defecto para tamaños de muestra más pequeños. La median_testfunción en el paquete de monedas puede proporcionar una prueba asintótica o usar Monte Carlo.
Sal Mangiafico

0

Sé que esto es muy tarde, pero tampoco pude encontrar un buen paquete para la prueba mediana de Mood, así que me encargué de hacer una función en R que pareciera ser el truco.

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

    }

}

Para la pregunta del OP, primero debe ejecutar esto para hacer un nuevo marco de datos para mantener los valores de sus tres vectores de grupo con una variable de "grupo" coincidente.

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

y ejecuta la función para la prueba mediana de Mood con moods.median(df$value, df$group)


Parece que la prueba de Kruskal-Wallis fue la respuesta. El OP necesitaba una solución con 3 grupos. Parece que ttnphns ya ha proporcionado el código R para la prueba de estado de ánimo.
Michael R. Chernick

1
El código que ttnphns dio solo proporciona un valor ap, el que escribí también da la estadística chi cuadrado y df, y funciona para cualquier número de grupos. La mayoría de las veces acabo de publicar aquí, ya que esta publicación es la primera en aparecer cuando busco cómo hacer la prueba mediana de Mood en R.
JRF1111
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.