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