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.
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 x ≠ n yt(x,y)nx≠nyR
qqplot
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 transform
está fazendo.
A simulação da distribuição amostral. Para entrada, esta função aceita o número de iterações n.iter
junto com os dois conjuntos de dados nas matrizes x
e y
. Ele gera uma matriz de n.iter
valores da estatística de teste. Seu funcionamento interno deve ser transparente, mesmo para um não R
usuá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())
}
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 f
aqui, 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.x
e n.y
), o número de iterações para cada teste de permutação ( n.iter
), uma referência à função test
para 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.x
Ydist.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.statistic
por 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)
À 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 em16xi16yif
0.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 R
implementaçã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 x
e y
são conjuntos de dados. Ele é destinado ao uso quando você acredita que sabe exatamente de que distribuição os dados x
vieram e deseja ver se isso é verdade. Portanto, o teste não acomoda adequadamente a incerteza sobre a distribuição da qual os dados y
vieram.
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.
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.)
Não, a correlação não é um bom teste para isso.
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.
fonte
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.
fonte