Teste não-paramétrico se duas amostras forem colhidas da mesma distribuição

19

Eu gostaria de testar a hipótese de que duas amostras são retiradas da mesma população, sem fazer nenhuma suposição sobre a distribuição das amostras ou da população. Como devo fazer isso?

Da Wikipedia, minha impressão é que o teste U de Mann Whitney deve ser adequado, mas não parece funcionar para mim na prática.

Para concretude, criei um conjunto de dados com duas amostras (a, b) grandes (n = 10000) e extraídas de duas populações não normais (bimodais), semelhantes (mesma média), mas diferentes (desvio padrão) Estou procurando um teste que reconheça que essas amostras não são da mesma população.

Visualização de histograma:

amostras bimodais

Código R:

a <- tibble(group = "a",
            n = c(rnorm(1e4, mean=50, sd=10),
                  rnorm(1e4, mean=100, sd=10)))
b <- tibble(group = "b",
            n = c(rnorm(1e4, mean=50, sd=3),
                  rnorm(1e4, mean=100, sd=3)))
ggplot(rbind(a,b), aes(x=n, fill=group)) +
  geom_histogram(position='dodge', bins=100)

Aqui está o teste de Mann Whitney surpreendentemente (?) Falhando em rejeitar a hipótese nula de que as amostras são da mesma população:

> wilcox.test(n ~ group, rbind(a,b))

        Wilcoxon rank sum test with continuity correction

data:  n by group
W = 199990000, p-value = 0.9932
alternative hypothesis: true location shift is not equal to 0

Socorro! Como devo atualizar o código para detectar as diferentes distribuições? (Gostaria especialmente de um método baseado em randomização / reamostragem genérica, se disponível.)

EDITAR:

Obrigado a todos pelas respostas! Estou animadamente aprendendo mais sobre o Kolmogorov – Smirnov, que parece muito adequado para meus propósitos.

Entendo que o teste KS está comparando esses ECDFs das duas amostras:

ECDFs

Aqui eu posso ver visualmente três características interessantes. (1) As amostras são de diferentes distribuições. (2) A está claramente acima de B em determinados pontos. (3) A está claramente abaixo de B em outros pontos.

O teste KS parece capaz de verificar hipóteses cada um desses recursos:

> ks.test(a$n, b$n)

        Two-sample Kolmogorov-Smirnov test

data:  a$n and b$n
D = 0.1364, p-value < 2.2e-16
alternative hypothesis: two-sided

> ks.test(a$n, b$n, alternative="greater")

        Two-sample Kolmogorov-Smirnov test

data:  a$n and b$n
D^+ = 0.1364, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies above that of y

> ks.test(a$n, b$n, alternative="less")

        Two-sample Kolmogorov-Smirnov test

data:  a$n and b$n
D^- = 0.1322, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies below that of y

Isso é realmente legal! Tenho um interesse prático em cada um desses recursos e, portanto, é ótimo que o teste KS possa verificar cada um deles.

Luke Gorrie
fonte
Não é de surpreender que a MW não rejeite. Para um teste unilateral, ele testa se Pr (a> b) <0,05, onde aeb são escolhidos aleatoriamente como membros de sua população.
Mdewey 02/07
1
Às vezes, diz-se que a hipótese de Mann-Whitney diz respeito à "localização" dos dois grupos, ou algo semelhante à diferença estocástica sistemática. No caso dos seus dados, os dois grupos são distribuídos simetricamente em torno de 75, portanto, o MW definitivamente não deve encontrar diferença.
Sal Mangiafico
4
Este é um bom exemplo da confusão que semeamos quando não temos certeza sobre a hipótese de um teste. Infelizmente, as pessoas são ensinadas a usar um teste t para comparar dois grupos, sem realmente pensar que esse teste compara duas médias , enquanto que existe um teste mediano para comparar duas medianas , Mann-Whitney que compara outra coisa, regressão quantílica para comparar outros percentis , testes para comparar variações, Kolmogorov-Smirnov para comparar as distribuições, e assim por diante ... Às vezes dizemos que queremos comparar duas "populações" sem deixar claro qual hipótese realmente queremos testar.
Sal Mangiafico
Refletindo, parece que a página da Wikipedia para o teste de MW declara a hipótese com muita clareza e foi um mal-entendido (salto sem fundamento) da minha parte pensar que essa hipótese também implica que as amostras provêm da mesma distribuição. De fato, o problema se torna óbvio ao comparar duas distribuições diferentes que são simétricas em torno do mesmo ponto central.
Luke Gorrie

Respostas:

17

O teste de Kolmogorov-Smirnov é a maneira mais comum de fazer isso, mas também existem outras opções.

Os testes são baseados nas funções de distribuição cumulativa empírica. O procedimento básico é:

  • eup
  • Descobrir a distribuição da estatística de teste sob a hipótese nula de que as amostras provêm da mesma distribuição (felizmente, as pessoas já fizeram isso pelas distâncias mais comuns!)
  • αα%

eu

ks.test(a,b)

p

eu2dgofcvm.test()

EDITAR:

nm

Para transformar isso em um procedimento do tipo amostragem, podemos fazer o seguinte:

  1. nmnm
  2. Calcule sua métrica de distância para as amostras. Para o teste KS, este é apenas o máximo. diferença entre os CDFs empíricos.
  3. Armazene o resultado e volte para a etapa 1.

Eventualmente, você criará muitas amostras a partir da distribuição da estatística de teste sob a hipótese nula, cujos quantis você pode usar para realizar seu teste de hipótese no nível de significância que desejar. Para a estatística do teste KS, essa distribuição é chamada de distribuição Kolmogorov.

Observe que, para o teste KS, isso é apenas um desperdício de esforço computacional, porque os quantis são muito simplesmente caracterizados teoricamente, mas o procedimento é geralmente aplicável a qualquer teste de hipótese.

Vai
fonte
Obrigado! O teste de Kolmogorov-Smirnov realmente rejeita a hipótese nula de que essas amostras são da mesma população. E intuitivamente, faz sentido comparar os ECDFs, porque é mais ou menos o que estou fazendo visualmente com o histograma. Pergunta: Suponha que eu precise implementar esse teste do zero sem nenhuma ferramenta como R. Existe um método simples que seria suficiente? (Talvez baseado em bootstrapping?) Pergunto porque meu conhecimento é sobre programação de computadores e acho os métodos baseados em simulação muito mais fáceis de entender.
Luke Gorrie
Você deve procurar randomização ou permutações. Eu prefiro estes para testes não normais. Eles também atender ur critérios de ser simulação em vez de estatísticas
RTbecard
2
@JamesAdamCampbell, você poderia expandir um pouco isso em uma resposta diferente?
Will
1
eu
1
Não vejo nenhum problema com isso. Eu ficaria interessado em ver os resultados se você tentar algumas dessas coisas! Seria legal ver se a abordagem de IC e o teste KS direto sempre oferecem a mesma resposta. Eu suspeito que eles fazem :)
Will