Teste se as variáveis ​​seguem a mesma distribuição

16

Se você deseja testar se duas variáveis ​​seguem a mesma distribuição, seria um bom teste simplesmente classificar as duas variáveis ​​e verificar sua correlação? Se for alto (pelo menos 0,9?), As variáveis ​​provavelmente provêm da mesma distribuição.

Com distribuição aqui, quero dizer "normal", "qui-quadrado", "gama" etc.

PascalVKooten
fonte

Respostas:

35

Vamos descobrir se este é um bom teste ou não. Há muito mais do que apenas alegar que é ruim ou mostrar em um exemplo que não funciona bem. A maioria dos testes funciona mal em algumas circunstâncias, e muitas vezes nos deparamos com a identificação das circunstâncias nas quais qualquer teste proposto pode ser uma boa escolha.

Descrição do teste

Como qualquer teste de hipótese, este consiste em (a) uma hipótese nula e alternativa e (b) uma estatística de teste (o coeficiente de correlação) que visa discriminar as hipóteses.

A hipótese nula é que as duas variáveis ​​vêm da mesma distribuição. Para ser mais preciso, vamos nomear as variáveis X e Y e supor que observamos nx instâncias de , chamadas e instâncias de , chamadas . A hipótese nula é que todas as instâncias de e são independentes e distribuídas de forma idêntica (iid).YXxi=(x1,x2,,xnx)nyYyiXY

Tomemos como hipótese alternativa que (a) todas as instâncias de são iid de acordo com alguma distribuição subjacente e (b) todas as instâncias de são iid de acordo com alguma distribuição subjacente mas (c) difere de . (Portanto, não procuraremos correlações entre , correlações entre , correlações entre e , ou diferenças de distribuição entre os 's ou separadamente: supõe-se que isso não seja plausível.)F X Y F Y F X F Y x i y i x i y j x yXFXYFYFXFYxiyixiyjxy

A estatística de teste proposta supõe que (chame esse valor comum de ) e calcula o coeficiente de correlação de (onde, como de costume, designa menor dos dados). Chame isso de . n ( x [ i ] , y [ i ] ) [ i ] i th t ( x , y )nx=nyn(x[i],y[i])[i]itht(x,y)

Testes de permutação

Nesta situação - não importa qual estatística seja proposta - sempre podemos realizar um teste de permutação. Sob a hipótese nula, a probabilidade dos dados é a mesma que a probabilidade de qualquer permutação dos dados valores. Em outras palavras, a atribuição de metade dos dados para e a outra metade para é uma pura coincidência aleatória. Essa é uma conseqüência direta e simples das suposições iid e da hipótese nula de que .( ( x 1 , x 2 , , x n ) , ( y 1 , y 2 , , y n ) ) 2 n X Y F X = F Yt((x1,x2,,xn),(y1,y2,,yn))2nXYFX=FY

Portanto, a distribuição amostral de , condicional às observações e , é a distribuição de todos os valores de atingidos para todospermutações dos dados. Estamos interessados ​​nisso porque, para qualquer tamanho de teste pretendido , como (correspondente a % de confiança), construiremos uma região crítica de dois lados a partir da distribuição amostral de : ela consiste no mais extremot(x,y)y i t ( 2 n ) ! α α = 0,05 95 t 100 αxiyit(2n)!αα=.0595t100α % dos valores possíveis det(no lado alto, porque alta correlação é consistente com distribuições semelhantes e baixa correlação não é). É assim que determinamos o tamanho do coeficiente de correlação para decidir se os dados são provenientes de diferentes distribuições.

Simulando a distribuição de amostragem nula

Porque(ou, se você quiser, , que conta o número de maneiras de dividir os dados em duas partes de tamanho ) fica grande mesmo para pequeno , não é praticável calcular o valor distribuição de amostragem exatamente, então a amostramos usando uma simulação (Por exemplo, quando , e( 2 n(2n)!2nnnn=16 ( 2n(2nn)/22nnnn=16(2N)! 2.63×1035(2nn)/2=300 540 195(2n)!2.63×1035 .) Cerca de mil amostras são suficientes (e certamente será para as explorações que estamos prestes a empreender).

Há duas coisas que precisamos descobrir: primeiro, como é a distribuição da amostra sob a hipótese nula. Segundo, quão bem esse teste discrimina entre diferentes distribuições?

Há uma complicação: a distribuição da amostra depende da natureza dos dados. Tudo o que podemos fazer é analisar dados realistas, criados para emular o que quer que seja que estamos interessados ​​em estudar, e torcer para que o que aprendemos das simulações se aplique à nossa própria situação.

Implementação

Para ilustrar, eu realizei este trabalho em R. Cai naturalmente em três partes.

  1. Uma função para calcular a estatística de teste . Como quero ser um pouco mais geral, minha versão lida com conjuntos de dados de tamanhos diferentes ( ) interpolando linearmente entre os valores no conjunto de dados maior (classificado) para criar correspondências com o conjunto de dados menor (classificado). Como isso já é feito pela função , apenas tomo seus resultados:n xn yt(x,y)nxnyRqqplot

    test.statistic <- function(x, y) {
      transform <- function(z) -log(1-z^2)/2
      fit <- qqplot(x,y, plot.it=FALSE)
      transform(cor(fit$x, fit$y))
    }

    Uma pequena reviravolta - desnecessária, mas útil para a visualização - reexpressa o coeficiente de correlação de uma maneira que tornará a distribuição da estatística nula aproximadamente simétrica. É o que transformestá fazendo.

  2. A simulação da distribuição amostral. Para entrada, esta função aceita o número de iterações n.iterjunto com os dois conjuntos de dados nas matrizes xe y. Ele gera uma matriz de n.itervalores da estatística de teste. Seu funcionamento interno deve ser transparente, mesmo para um não Rusuário:

    permutation.test <- function(n.iter, x, y) {
      z <- c(x,y)
      n.x <- length(x)
      n.y <- length(y)
      n <- length(z)
      k <- min(n.x, n.y)
      divide <- function() {
        i <- sample.int(n, size=k)
        test.statistic(z[i], z[-i])
      }
      replicate(n.iter, divide())
    }
  3. Embora seja tudo o que precisamos para realizar o teste, para estudá-lo, queremos repetir o teste várias vezes. Portanto, realizamos o teste uma vez e agrupamos esse código em uma terceira camada funcional, geralmente denominada faqui, que podemos chamar repetidamente. Para torná-lo suficientemente geral para um estudo amplo, para entrada ele aceita os tamanhos dos conjuntos de dados para simular ( n.xe n.y), o número de iterações para cada teste de permutação ( n.iter), uma referência à função testpara calcular a estatística do teste (você verá momentaneamente, por que não queremos codificar isso) e duas funções para gerar valores aleatórios de iid, um para ( ) e outro para ( é útil para ajudar a ver o que está acontecendo.YXdist.xYdist.y ). Uma opçãoplot.it

    f <- function(n.x, n.y, n.iter, test=test.statistic, dist.x=runif, dist.y=runif, 
        plot.it=FALSE) {
      x <- dist.x(n.x)
      y <- dist.y(n.y)
      if(plot.it) qqplot(x,y)
    
      t0 <- test(x,y)
      sim <- permutation.test(n.iter, x, y)
      p <- mean(sim > t0) + mean(sim==t0)/2
      if(plot.it) {
        hist(sim, xlim=c(min(t0, min(sim)), max(t0, max(sim))), 
             main="Permutation distribution")
        abline(v=t0, col="Red", lwd=2)
      }
      return(p)
    }

    A saída é um "valor p" simulado: a proporção de simulações que produz uma estatística que parece mais extrema do que aquela realmente calculada para os dados.

As partes (2) e (3) são extremamente gerais: você pode realizar um estudo como este para um teste diferente simplesmente substituindo-o test.statisticpor algum outro cálculo. Fazemos isso abaixo.

Primeiros resultados

Por padrão, nosso código compara dados extraídos de duas distribuições uniformes. Eu deixei fazer isso (para , que são conjuntos de dados razoavelmente pequenos e, portanto, apresentam um caso de teste moderadamente difícil) e, em seguida, repito-o para uma comparação uniforme-normal e uma comparação exponencial uniforme. (As distribuições uniformes não são fáceis de distinguir das distribuições normais, a menos que você tenha um pouco mais de valores, mas as distribuições exponenciais - com alta assimetria e cauda longa direita - geralmente são facilmente diferenciadas das distribuições uniformes.)16n.x=n.y=1616

set.seed(17)             # Makes the results reproducible
n.per.rep <- 1000        # Number of iterations to compute each p-value
n.reps <- 1000           # Number of times to call `f`
n.x <- 16; n.y <- 16     # Dataset sizes

par(mfcol=c(2,3))        # Lay results out in three columns
null <- replicate(n.reps, f(n.x, n.y, n.per.rep))
hist(null, breaks=20)
plot(null)

normal <- replicate(n.reps, f(n.x, n.y, n.per.rep, dist.y=rnorm))
hist(normal, breaks=20)
plot(normal)

exponential <- replicate(n.reps, f(n.x, n.y, n.per.rep, dist.y=function(n) rgamma(n, 1)))
hist(exponential, breaks=20)
plot(exponential)

Resultados do teste de correlação

À esquerda está a distribuição nula dos valores de p quando e são uniformes. Esperamos que o histograma seja quase uniforme (prestando atenção especial à extremidade esquerda extrema, que está na faixa de resultados "significativos") - e na verdade é - e que a sequência de valores obtidos durante a simulação, mostrado abaixo, parece aleatório - e parece. Isso é bom. Isso significa que podemos avançar para o próximo passo para estudar como isso muda quando e vêm de diferentes distribuições.Y X YXYXY

As plotagens intermediárias testam variáveis ​​uniformes contra variáveis ​​normais . Mais frequentemente, os valores de p eram mais baixos do que o esperado. Isso indica uma tendência para esse teste realmente detectar uma diferença. Mas não é grande. Por exemplo, a barra mais à esquerda no histograma mostra que, das 1000 execuções de (incluindo 1000 conjuntos de dados simulados separadamente), o valor de p era menor que apenas cerca de 110 vezes. Se considerarmos "significativo", esse teste tem apenas % de chance de detectar a diferença entre uma distribuição uniforme e normal com base em16xi16yif0.051116valores independentes de cada um. Isso é muito baixo consumo de energia. Mas talvez seja inevitável, então vamos prosseguir.

As plotagens da direita testam similarmente uma distribuição uniforme contra uma distribuição exponencial. Este resultado é bizarro. Esse teste tende, mais frequentemente do que não, a concluir que dados uniformes e dados exponenciais têm a mesma aparência. Parece "pensar" que as variáveis ​​uniformes e exponenciais são mais semelhantes do que duas variáveis ​​uniformes! O que está acontecendo aqui?

O problema é que os dados de uma distribuição exponencial tenderão a ter alguns valores extremamente altos. Quando você faz um gráfico de dispersão desses valores distribuídos de maneira uniforme, haverá alguns pontos distantes no canto superior direito de todo o resto. Isso corresponde a um coeficiente de correlação muito alto. Assim, sempre que uma das distribuições gera alguns valores extremos, o coeficiente de correlação é uma péssima escolha para medir a diferença entre as distribuições. Isso leva a outro problema ainda pior: à medida que os tamanhos dos conjuntos de dados aumentam, aumentam as chances de obter algumas observações extremas. Portanto, podemos esperar que esse teste tenha um desempenho cada vez pior à medida que a quantidade de dados aumenta. Quão terrível ....

Um teste melhor

A pergunta original foi respondida de forma negativa. No entanto, existe um teste conhecido e poderoso para discriminar entre distribuições: o teste de Kolmogorov-Smirnov. Em vez do coeficiente de correlação, ele calcula o maior desvio vertical da linha em seu gráfico QQ. (Quando os dados vêm da mesma distribuição, o gráfico QQ tende a seguir essa linha. Caso contrário, ele se desviará para algum lugar; a estatística KS capta o maior desvio desse tipo.)y=x

Aqui está uma Rimplementação:

test.statistic <- function(x, y) {
  ks.test(x,y)$statistic
}

É isso mesmo: ele está embutido no software, então só precisamos chamá-lo. Mas espere! Se você ler o manual com atenção, aprenderá que (a) o teste fornece um valor-p, mas (b) esse valor-p é (grosseiramente) incorreto quando ambos xe ysão conjuntos de dados. Ele é destinado ao uso quando você acredita que sabe exatamente de que distribuição os dados xvieram e deseja ver se isso é verdade. Portanto, o teste não acomoda adequadamente a incerteza sobre a distribuição da qual os dados yvieram.

Sem problemas! A estrutura de teste de permutação ainda é válida. Ao fazer a alteração anterior em test.statistic, tudo o que precisamos fazer é executar novamente o estudo anterior, inalterado. Aqui estão os resultados.

Estudo de teste KS

Embora a distribuição nula não seja uniforme (canto superior esquerdo), é bastante uniforme abaixo de ou mais, e é aí que realmente nos importamos com seus valores. Uma olhada no gráfico abaixo (canto inferior esquerdo) mostra o problema: a estatística KS tende a se agrupar em torno de alguns valores discretos. (Esse problema praticamente desaparece para conjuntos de dados maiores.)p=0.20

Os histogramas médio (uniforme vs normal) e direito (uniforme vs exponencial) estão fazendo exatamente a coisa certa: na grande maioria dos casos em que as duas distribuições diferem, esse teste está produzindo pequenos valores de p. Por exemplo, ele tem % de chance de obter um valor p menor que ao comparar um uniforme a um normal com base em 16 valores de cada um. Compare isso com os % insignificantes alcançados pelo teste do coeficiente de correlação.700.0511

O histograma certo não é tão bom, mas pelo menos está na direção correta agora! Estimamos que tenha % de chance de detectar a diferença entre uma distribuição uniforme e exponencial no nível % e % de chance de fazer essa detecção no nível % (porque as duas barras para o valor p menor que totaliza mais de 500 das 1000 iterações).30α=550α=100.10

Conclusões

Portanto, os problemas com o teste de correlação não se devem a alguma dificuldade inerente nesse cenário. Não apenas o teste de correlação tem um desempenho muito ruim, como também é ruim se comparado a um teste amplamente conhecido e disponível. (Eu acho que é inadmissível, o que significa que sempre terá um desempenho pior, em média, do que a versão de permutação do teste KS, o que implica que não há razão para usá-lo.)

whuber
fonte
Explicação muito boa, e eu gosto de ver outras pessoas fazendo algumas simulações. Ainda tenho problemas para entender por que uma correlação parece prever um pouco (ou não podemos dizer muito isso?). Além disso, a única vaga (ainda parte crítica para entender por que o KS funciona) é sobre a linha "x = y" ("calcula o maior desvio vertical da linha y = x em seu gráfico de QQ.") (Quando os dados vêm do mesmo distribuição, o gráfico QQ tende a seguir esta linha. "). Obrigado pelo esforço, porém, eu aprendi muito
PascalVKooten
1
1
O KS testa se dois conjuntos de dados vieram da mesma função de distribuição, ou seja, seus CDFs são os mesmos. Parece-me, no entanto, que o OP pode estar procurando um teste que diga que Exp (0,1) é a mesma coisa que Exp (100) e Normal (0, 5) é o mesmo que Normal (10, .2 ) O KS não faz isso e, de fato, é provavelmente impossível em geral (e eu realmente não sei quando você deseja). Mas alguns testes de quão deformável um é o outro podem funcionar em casos simples (por exemplo, centralizar e padronizar lidam com os normais decentemente, embora não exponenciais).
Dougal
@Dougal Reli seu comentário. É correto dizer que, quando mencionamos que "distribuições são iguais", queremos dizer que as CDF são iguais?
22414 PascalVKooten
μσ2
5

Não, a correlação não é um bom teste para isso.

x <- 1:100 #Uniform
y <- sort(rnorm(100)) #Normal
cor(x,y) #.98

Eu não conheço um bom teste que compare se, por exemplo, duas distribuições são normais, mas possivelmente com média e sd diferentes. Indiretamente, você pode testar a normalidade de cada uma separadamente e, se ambas parecerem normais, acho que ambas são.

Peter Flom - Restabelece Monica
fonte
0

Se houver um número suficientemente grande de variáveis, isso poderá mostrar mais correlação com os valores ordenados por tamanho. No entanto, não parece ser um método particularmente útil, principalmente porque fornece poucos meios para estimar a confiança de que eles possam usar o mesmo modelo.

Um problema que você pode experimentar é quando você tem modelos com média e assimetria semelhantes, mas há uma diferença na curtose, pois um número moderado de medições pode se ajustar suficientemente bem para parecer razoavelmente bem correlacionado.

Parece mais razoável modelar ambas as variáveis ​​em relação a diferentes distribuições para ver qual é mais provável para cada uma e comparar os resultados.

Pode haver algum mérito em normalizar os dois valores, classificando e plotando cada um - isso permitirá que você veja como os ajustes se comparam - e você também pode traçar um possível modelo para ambos, o que estaria relacionado ao que você sugeriu, mas não esperando uma resposta concreta, apenas uma idéia visual sobre a proximidade das distribuições.

David Burton
fonte
(1) Minha análise conclui que a expectativa expressa na primeira frase não é confirmada: com um número suficientemente grande de variáveis, se uma das distribuições tiver caudas curtas e a outra tiver apenas uma pequena chance de exibir valores mais extremos, a correlação tende a ser indevidamente alta. (2) Quando você "modela ... contra diferentes distribuições", como controla os vários testes dependentes implícitos nessa prescrição?
whuber