Averigüemos si esta es una buena prueba o no. Hay mucho más que simplemente afirmar que es malo o demostrar en una instancia que no funciona bien. La mayoría de las pruebas funcionan mal en algunas circunstancias, por lo que a menudo nos enfrentamos a identificar las circunstancias en las cuales cualquier prueba propuesta podría ser una buena opción.
Descripción de la prueba.
Como cualquier prueba de hipótesis, esta consiste en (a) una hipótesis nula y alternativa y (b) un estadístico de prueba (el coeficiente de correlación) destinado a discriminar entre las hipótesis.
La hipótesis nula es que las dos variables provienen de la misma distribución. Para ser precisos, nombremos las variables e y supongamos que hemos observado instancias de , llamadas , y instancias de , llamadas . La hipótesis nula es que todas las instancias de e son independientes e idénticamente distribuidas (iid).XYnxXxi=(x1,x2,…,xnx)nyYyyoXY
Tomemos como hipótesis alternativa que (a) todas las instancias de son iid según alguna distribución subyacente y (b) todas las instancias de son iid según alguna distribución subyacente pero (c) difiere de . (Por lo tanto, no buscaremos correlaciones entre , correlaciones entre , correlaciones entre y , o diferencias de distribución entre las 's o ' s por separado: se supone que no es plausible).F X Y F Y F X F Y x i y i x i y j x yXFXYFYFXFYXyoyyoXyoyjXy
El estadístico de prueba propuesto supone que (llame a este valor común ) y calcula el coeficiente de correlación de (donde, como de costumbre, designa el más pequeño de los datos). Llame a esto . n ( x [ i ] , y [ i ] ) [ i ] i th t ( x , y )norteX= nynorte( x[ i ], y[ i ])[ i ]yotht ( x , y)
Pruebas de permutación
En esta situación, sin importar la estadística propuesta, siempre podemos realizar una prueba de permutación. Bajo la hipótesis nula, la probabilidad de los datos es la misma que la probabilidad de cualquier permutación de los datos valores. En otras palabras, la asignación de la mitad de los datos a y la otra mitad a es una pura coincidencia aleatoria. Esta es una consecuencia simple y directa de los supuestos iid y la hipótesis 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
Por lo tanto, la distribución de muestreo de , condicional a las observaciones e , es la distribución de todos los valores de alcanzados para todospermutaciones de los datos. Estamos interesados en esto porque para cualquier tamaño de prueba previsto , como (correspondiente al % de confianza), construiremos una región crítica de dos lados a partir de la distribución de muestreo de : consiste en el % más extremo de los valores posibles dex i y i t ( 2 n ) ! α α = .05 95 t 100 α tt(x,y)xiyit(2n)!αα=.0595t100αt(en el lado alto, porque la alta correlación es consistente con distribuciones similares y la baja correlación no lo es). Así es como determinamos qué tan grande debe ser el coeficiente de correlación para decidir que los datos provienen de diferentes distribuciones.
Simulando la distribución de muestreo nulo
Porque(o, si lo desea, , que cuenta el número de formas de dividir los datos de en dos piezas de tamaño ) se hace grande incluso para pequeño , no es factible calcular el distribución de muestreo exactamente, por lo que se muestra mediante una simulación (Por ejemplo, cuando , y .) Casi mil muestras a menudo son suficientes (y ciertamente lo hará para las exploraciones que estamos a punto de emprender).( 2 n(2n)!2nnnn=16 ( 2n(2nn)/22nnnn=16(2n)! ≈2.63×1035(2nn)/2=300 540 195(2n)!≈2.63×1035
Hay dos cosas que necesitamos descubrir: primero, cómo se ve la distribución de muestreo bajo la hipótesis nula. Segundo, ¿qué tan bien discrimina esta prueba entre diferentes distribuciones?
Hay una complicación: la distribución del muestreo depende de la naturaleza de los datos. Todo lo que podemos hacer es mirar datos realistas, creados para emular lo que sea que nos interese estudiar, y esperar que lo que aprendamos de las simulaciones se aplique a nuestra propia situación.
Implementación
Para ilustrar, he llevado a cabo este trabajo en R
. Cae naturalmente en tres pedazos.
Una función para calcular el estadístico de prueba . Como quiero ser un poco más general, mi versión maneja conjuntos de datos de diferentes tamaños ( ) interpolando linealmente entre los valores del conjunto de datos más grande (ordenado) para crear coincidencias con el conjunto de datos más pequeño (ordenado). Como esto ya lo hace la función , solo tomo sus resultados:t(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))
}
Un pequeño giro, innecesario pero útil para la visualización, vuelve a expresar el coeficiente de correlación de una manera que hará que la distribución de la estadística nula sea aproximadamente simétrica. Eso es lo que transform
está haciendo.
La simulación de la distribución muestral. Para la entrada, esta función acepta el número de iteraciones n.iter
junto con los dos conjuntos de datos en matrices x
y y
. Produce una matriz de n.iter
valores de la estadística de prueba. Su funcionamiento interno debe ser transparente, incluso para un no R
usuario:
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())
}
Aunque eso es todo lo que necesitamos para realizar la prueba, para estudiarla, querremos repetir la prueba muchas veces. Entonces, realizamos la prueba una vez y ajustamos ese código dentro de una tercera capa funcional, generalmente nombrada f
aquí, a la que podemos llamar repetidamente. Para hacerlo lo suficientemente general para un estudio amplio, para la entrada acepta los tamaños de los conjuntos de datos para simular ( n.x
y n.y
), el número de iteraciones para cada prueba de permutación ( n.iter
), una referencia a la función test
para calcular el estadístico de prueba (verá momentáneamente por qué no queremos codificar esto), y dos funciones para generar valores aleatorios de iid, uno para ( ) y otro para ( ). Una opciónXdist.x
Ydist.y
plot.it
es útil para ayudar a ver qué está pasando.
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)
}
La salida es un "valor p" simulado: la proporción de simulaciones que producen una estadística que parece más extrema que la que realmente se calculó para los datos.
Las partes (2) y (3) son extremadamente generales: puede realizar un estudio como este para una prueba diferente simplemente reemplazando test.statistic
con algún otro cálculo. Hacemos eso a continuación.
Primeros resultados
Por defecto, nuestro código compara datos extraídos de dos distribuciones uniformes. Lo dejé hacer eso (para , que son conjuntos de datos bastante pequeños y, por lo tanto, presentan un caso de prueba moderadamente difícil) y luego lo repito para una comparación uniforme normal y una comparación uniforme exponencial. (Las distribuciones uniformes no son fáciles de distinguir de las distribuciones normales a menos que tenga un poco más de valores, pero las distribuciones exponenciales, que tienen un alto sesgo y una larga cola derecha, generalmente se distinguen fácilmente de las distribuciones uniformes).n.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)
A la izquierda está la distribución nula de los valores p cuando e son uniformes. Esperamos que el histograma sea casi uniforme (prestando especial atención al extremo izquierdo extremo, que está en el rango de resultados "significativos"), y en realidad lo es, y que la secuencia de valores obtenidos durante la simulación, se muestra debajo, parece aleatorio, y lo hace. Eso es bueno. Significa que podemos pasar al siguiente paso para estudiar cómo cambia esto cuando e provienen de diferentes distribuciones.XYXY
Las parcelas medias prueban variables uniformes contra variables normales . La mayoría de las veces, los valores p fueron más bajos de lo esperado. Eso indica una tendencia de esta prueba a detectar una diferencia. Pero no es grande. Por ejemplo, la barra más a la izquierda en el histograma muestra que de las 1000 corridas de (que comprenden 1000 conjuntos de datos simulados por separado), el valor p fue inferior a solo unas 110 veces. Si consideramos que es "significativo", entonces esta prueba tiene solo un % de posibilidades de detectar la diferencia entre una distribución uniforme y normal basada en16xi16yif
0.051116valores independientes de cada uno. Eso es bastante bajo consumo. Pero tal vez sea inevitable, así que procedamos.
Las gráficas de la derecha prueban de manera similar una distribución uniforme contra una exponencial. Este resultado es extraño. Esta prueba tiende, en la mayoría de los casos, a concluir que los datos uniformes y los datos exponenciales tienen el mismo aspecto. ¡Parece "pensar" que las variables uniformes y exponenciales son más similares que dos variables uniformes! ¿Que está pasando aqui?
El problema es que los datos de una distribución exponencial tenderán a tener unos valores extremadamente altos. Cuando hace un diagrama de dispersión de aquellos contra valores distribuidos uniformemente, habrá unos pocos puntos en la esquina superior derecha de todos los demás. Eso corresponde a un coeficiente de correlación muy alto. Por lo tanto, cada vez que cualquiera de las distribuciones genera algunos valores extremos, el coeficiente de correlación es una elección terrible para medir cuán diferentes son las distribuciones. Esto lleva a otro problema aún peor: a medida que aumenta el tamaño del conjunto de datos, aumentan las posibilidades de obtener algunas observaciones extremas. Por lo tanto, podemos esperar que esta prueba funcione peor y peor a medida que aumenta la cantidad de datos. Que horrible ...
Una mejor prueba
La pregunta original ha sido respondida en forma negativa. Sin embargo, existe una prueba conocida y poderosa para discriminar entre distribuciones: la prueba de Kolmogorov-Smirnov. En lugar del coeficiente de correlación, calcula la desviación vertical más grande de la línea en su gráfico QQ. (Cuando los datos provienen de la misma distribución, el gráfico QQ tiende a seguir esta línea. De lo contrario, se desviará en alguna parte; la estadística KS recoge la desviación más grande).y=x
Aquí hay una R
implementación:
test.statistic <- function(x, y) {
ks.test(x,y)$statistic
}
Así es: está integrado en el software, por lo que solo tenemos que llamarlo. ¡Pero espera! Si usted lee el manual cuidadosamente, aprenderá que (a) los suministros de prueba un p-valor, pero (b) que el p-valor es (groseramente) incorrectos cuando ambos x
y y
son conjuntos de datos. Está diseñado para usarse cuando crees que sabes exactamente de qué distribución x
provienen los datos y quieres ver si eso es cierto. Por lo tanto, la prueba no se adapta adecuadamente a la incertidumbre sobre la distribución de la que y
provienen los datos .
¡No hay problema! El marco de prueba de permutación sigue siendo igual de válido. Al hacer el cambio anterior a test.statistic
, todo lo que tenemos que hacer es volver a ejecutar el estudio anterior, sin cambios. Aquí están los resultados.
Aunque la distribución nula no es uniforme (arriba a la izquierda), es bastante uniforme por debajo de o menos, que es donde realmente nos preocupamos por sus valores. Un vistazo a la gráfica debajo (abajo a la izquierda) muestra el problema: la estadística KS tiende a agruparse alrededor de algunos valores discretos. (Este problema prácticamente desaparece para conjuntos de datos más grandes).p=0.20
Los histogramas medio (uniforme vs normal) y derecho (uniforme vs exponencial) están haciendo exactamente lo correcto: en la gran mayoría de los casos en que las dos distribuciones difieren, esta prueba está produciendo pequeños valores de p. Por ejemplo, tiene un % de posibilidades de obtener un valor p menor que cuando se compara un uniforme con un normal basado en 16 valores de cada uno. Compare esto con el % piddling logrado por la prueba de coeficiente de correlación.700.0511
El histograma correcto no es tan bueno, ¡pero al menos ahora está en la dirección correcta! Estimamos que tiene una probabilidad del % de detectar la diferencia entre una distribución uniforme y exponencial en el nivel % y una probabilidad del % de hacer esa detección en el nivel % (porque las dos barras para el valor p menor que total sobre 500 de las 1000 iteraciones).30α=550α=100.10
Conclusiones
Por lo tanto, los problemas con la prueba de correlación no se deben a alguna dificultad inherente en este entorno. La prueba de correlación no solo funciona muy mal, es mala en comparación con una prueba ampliamente conocida y disponible. (Supongo que es inadmisible, lo que significa que siempre funcionará peor, en promedio, que la versión de permutación de la prueba KS, lo que implica que no hay razón para usarlo).