Teste de hipótese para diferença de medianas entre mais de duas amostras


12

Questão

As pontuações dos testes de três grupos de pessoas são salvas como vetores separados em 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)

Quero saber se existe uma diferença significativa nas medianas entre esses grupos. Eu sei que eu poderia testar o grupo 1 versus o grupo 2 usando o teste de Wilcoxon, assim.

wilcox.test(group1, group2)

No entanto, isso compara apenas dois grupos por vez, e eu gostaria de comparar os três simultaneamente. Eu gostaria de um teste estatístico que produza um valor de p no nível de significância 0,05. Alguém poderia ajudar?

Edit # 1 - Teste de mediana do humor

Seguindo a resposta sugerida pelo usuário Hibernating, tentei o teste mediano 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)

No entanto, essa abordagem me permite testar uma diferença significativa entre as medianas de apenas dois grupos por vez. Não tenho certeza de como usá-lo para comparar as medianas dos três simultaneamente.

Edit # 2 - Teste de Kruskal-Wallis

A resposta sugerida pelo usuário dmartin parece ser mais ou menos o que eu preciso e me permite testar todos os três grupos simultaneamente.

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

Editar # 3

O usuário Greg Snow observa útil em sua resposta que o teste de Kruskal-Wallis é apropriado desde que faça suposições estritas que o tornem também um teste de meios.


Já houve várias perguntas semelhantes neste site. Por favor, procure median test. Minha própria resposta / comentários está aqui .
precisa saber é

Quanto à comparação das medianas dos três simultaneamente, veja minha edição do código R ligeiramente modificado.
Hibernando

Respostas:


4

O teste de Kruskal-Wallis também pode ser utilizado, pois é uma ANOVA não paramétrica. Além disso, é frequentemente considerado mais poderoso que o teste mediano de Mood . Pode ser implementado em R usando o função kruskal.test no pacote de estatísticas em R.

Para responder à sua edição, a interpretação de KW é semelhante a uma ANOVA unidirecional. Um valor p significativo corresponde a rejeitar o nulo de que todas as três médias são iguais. Você deve usar um teste de acompanhamento (novamente, como uma ANOVA), para responder a perguntas sobre grupos específicos. Isso geralmente segue perguntas de pesquisa específicas que você possa ter. Apenas observando os parâmetros da simulação, todos os três grupos devem ser significativamente diferentes um do outro se você fizer um teste de acompanhamento (como todos os 1 DP separados por N = 100).


1
Para esclarecer algumas coisas. 1) Kruskal-Wallis não é um teste de medianas, a menos que as distribuições de observações nos grupos atendam a certas suposições. Se você realmente deseja comparar medianas, pode não ser o teste apropriado. É melhor escolher um teste que realmente teste a hipótese de seu interesse. 2) Kruskal-Wallis não é uma "ANOVA". Ou seja, não é uma análise de variância. 3) A menção de "meios" nesta resposta está incorreta.
Sal Mangiafico

10

Primeiro, o teste de Wilcoxon (ou teste de Mann-Whitney) não é um teste de medianas (a menos que você faça suposições muito estritas que também o tornem um teste de médias). E para comparar mais de 2 grupos, o teste de Wilcoxon pode levar a alguns resultados paradoxais (consulte Dados de Efron ).

Como o teste de Wilcoxon é apenas um caso especial de teste de permutação e você está especificamente interessado nas medianas, sugiro um teste de permutação nas medianas.

Primeiro, escolha uma medida da diferença, algo como a maior das 3 medianas menos a menor das 3 (ou a variação das 3 medianas, ou o MAD, etc.).

Agora calcule sua estatística para os dados originais.

agrupar todos os dados em um conjunto e particionar aleatoriamente os valores em 3 grupos do

tamanhos iguais ao original e calcule a mesma estatística.

repita várias vezes (como 9998)

Compare como a estatística dos dados reais se compara à distribuição de todas as estatísticas do seu teste.


Digamos que estou disposto a fazer as suposições estritas necessárias para o teste de Wilcox que também o tornariam um teste de meios. Isso exigiria a alteração do código R que escrevi acima? Isso também poderia ser feito para o teste de Kruskal-Wallis?
Alexander Alexander

1
@ Alexander, se você estiver disposto a fazer essas suposições, o código R está correto e Kruskal Wallis também está correto. Mas, então, se você estiver disposto a fazer essas suposições, em seguida, t.teste aovprovavelmente seria bom também.
Greg Snow

+1. Se você está falando Wilcoxon sum-rank test, não se importaria em converter "Wilcox" para esse nome?
precisa saber é o seguinte

@GregSnow +1 pelos pontos apresentados ... mas suponho que por 'Wilcox' você quer dizer o teste com o nome de Frank Wilcoxon. (Infelizmente, essa confusão é composta por R, que - enganosamente - chama o teste correspondente wilcox.test). Você poderia editar?
Glen_b -Reinstala Monica 11/01

8

O teste de mediana de Mood é um teste não paramétrico usado para testar a igualdade de medianas de duas ou mais populações. Veja aqui a parte R da sua pergunta. Veja também uma pergunta relacionada aqui . Também daqui :

O teste da mediana de Mood é o mais fácil de fazer manualmente: calcule a mediana geral (de todos os dados) e conte quantos valores estão acima e abaixo da mediana em cada grupo. Se os grupos são todos iguais, as observações devem estar entre 50 e 50 acima e abaixo da mediana geral em cada grupo ... As contagens de abaixo da mediana e acima da mediana ... formam uma tabela de mão dupla, que é então analisado usando um teste qui-quadrado. O teste mediano de Mood é muito parecido com o teste de sinais generalizado para dois ou mais grupos.

Editar: Para três grupos, você pode considerar essa generalização simples do código R ao qual vinculei:

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 nomear o teste. Eu não sabia que o teste mediano também é chamado de teste de Mood.
ttnphns

+1 Obrigado por me ajudar com isso, eu realmente aprecio isso!
Alexander

Conheço algumas implementações em R. mood.medtestno pacote RVAideMemoire parece ser o teste usual, exceto que ele usa o teste exato de Fisher por padrão para tamanhos de amostra menores. A median_testfunção no pacote de moedas pode fornecer um teste assintótico ou usar Monte Carlo.
Sal Mangiafico

0

Sei que é tarde demais, mas também não consegui encontrar um bom pacote para o teste mediano de Mood, então resolvi fazer uma função em R que parece fazer o truque.

#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 a pergunta do OP, você primeiro executaria isso para criar um novo quadro de dados para armazenar os valores dos seus três vetores de grupo com uma variável "group" correspondente.

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

e execute a função para o teste mediano de Mood com moods.median(df$value, df$group)


Parece que o teste de Kruskal-Wallis foi a resposta. O OP precisava de uma solução com 3 grupos. Parece que ttnphns já forneceu o código R para o teste de humor.
Michael R. Chernick 07/01

1
O código que ttnphns forneceu fornece apenas um valor de p, o que escrevi também fornece o chi quadrado stat e df, e funciona para qualquer número de grupos. Eu principalmente só postou aqui desde este post é o primeiro a chegar na busca de como fazer teste da mediana mediana de Mood na R.
JRF1111
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.