Comprender la prueba de Kolmogorov-Smirnov en R

17

Estoy tratando de entender el resultado de la función de prueba de Kolmogorov-Smirnov (dos muestras, dos caras). Aquí hay una prueba simple.

x <- c(1,2,2,3,3,3,3,4,5,6)
y <- c(2,3,4,5,5,6,6,6,6,7)
z <- c(12,13,14,15,15,16,16,16,16,17)

ks.test(x,y)

#   Two-sample Kolmogorov-Smirnov test
#
#data:  x and y
#D = 0.5, p-value = 0.1641
#alternative hypothesis: two-sided
#
#Warning message:
#In ks.test(x, y) : cannot compute exact p-value with ties

ks.test(x,z)

#Two-sample Kolmogorov-Smirnov test

#data:  x and z
#D = 1, p-value = 9.08e-05
#alternative hypothesis: two-sided
#
#Warning message:
#In ks.test(x, z) : cannot compute exact p-value with ties


ks.test(x,x)

#Two-sample Kolmogorov-Smirnov test

#data:  x and x
#D = 0, p-value = 1
#alternative hypothesis: two-sided
#
#Warning message:
#In ks.test(x, x) : cannot compute exact p-value with ties

Hay algunas cosas que no entiendo aquí.

  1. De la ayuda , parece que el valor p se refiere a la hipótesis var1=var2. Sin embargo, aquí eso significaría que la prueba dice ( p<0.05):

    a. No puedo decir eso X = Y;

    si. Puede decir eso X = Z;

    C. No puedo decir eso X = X(!)

Además de parecer que x es diferente de sí mismo (!), También es bastante extraño para mí x=z, ya que las dos distribuciones tienen cero soporte superpuesto. ¿Cómo es eso posible?

  1. Según la definición de la prueba, Ddebería ser la máxima diferencia entre las dos distribuciones de probabilidad, pero por ejemplo en el caso (x,y)que debe ser D = Max|P(x)-P(y)| = 4(en el caso cuando P(x), P(y)no están normalizados) o D=0.3 (si es que se normalizan). ¿Por qué D es diferente de eso?

  2. He hecho un ejemplo intencionalmente con muchos vínculos , ya que los datos con los que estoy trabajando tienen muchos valores idénticos. ¿Por qué esto confunde la prueba? Pensé que calculaba una distribución de probabilidad que no debería verse afectada por los valores repetidos. ¿Alguna idea?

Nonancourt
fuente

Respuestas:

21

La prueba KS se basa en probar la "similitud" de dos muestras independientes de una distribución continua (como lo indica la página de ayuda). Si ese es el caso, entonces la probabilidad de los lazos debería ser asombrosamente pequeña (también se indica). El estadístico de prueba es la distancia máxima entre los ECDF de las dos muestras. El valor p es la probabilidad de ver un estadístico de prueba tan alto o más alto que el observado si las dos muestras se obtuvieron de la misma distribución. (No es la "probabilidad de que var1 = var2". Y, además, 1-p_value NO es esa probabilidad tampoco.) Los valores p altos dicen que no puedereclamar apoyo estadístico para una diferencia, pero los valores p bajos no son evidencia de similitud. Los valores p bajos pueden ocurrir con tamaños de muestra bajos (como lo proporciona su ejemplo) o la presencia de diferencias interesantes pero pequeñas, por ejemplo, perturbaciones oscilatorias superpuestas. Si está trabajando con situaciones con un gran número de vínculos, sugiere que puede necesitar usar una prueba que se ajuste más a su situación de datos.

Mi explicación de por qué los vínculos eran una violación de los supuestos no era una afirmación de que los vínculos invalidaban los resultados. Las propiedades estadísticas de la prueba KS en la práctica son relativamente resistentes o robustas al fracaso de esa suposición. El problema principal con la prueba KS, como veo, es que es excesivamente general y, como consecuencia, no tiene suficiente poder para identificar diferencias significativas de naturaleza interesante. La prueba KS es una prueba muy general y tiene una potencia bastante baja para hipótesis más específicas.

Por otro lado, también veo la prueba KS (o la prueba "aún más poderosa" Anderson Darling o Lillefors (sp?)) Utilizada para evaluar la "normalidad" en situaciones en las que dicha prueba es completamente injustificada, como la prueba de La normalidad de las variables que se utilizan como predictores en un modelo de regresión antes del ajuste. Uno podría legítimamente estar probando la normalidad de los residuos, ya que eso es lo que se supone en la teoría de modelado. Incluso entonces, las modestas desviaciones de la normalidad de los residuos generalmente no cuestionan la validez de los resultados. Sería mejor que las personas utilicen métodos sólidos para verificar el impacto importante de la "no normalidad" en las conclusiones sobre la significación estadística.

¿Quizás debería consultar con un estadístico local? Podría ayudarlo a definir la pregunta estadística con un poco más de precisión y, por lo tanto, tener una mejor oportunidad de identificar una diferencia si realmente existe. Eso sería evitar un "error tipo II": no apoyar una conclusión de diferencia cuando tal diferencia está presente.

DWin
fuente
1
Muy agradable. Esto puede ser esclarecedor: Kolmogorov-Smirnov con datos discretos: ¿Cuál es el uso adecuado de dgof :: ks.test en R?
Stephan Kolassa
He probado los mismos ejemplos con dgof::ks.test(x,y,simulate.p.value=TRUE, B=1000)y Matching::ks.boot(x,y, nboots=1000)( sekhon.berkeley.edu/matching/ks.boot.html ). Tanto D como el valor p calculado son absolutamente idénticos en ambos casos. Esto me hace pensar que quizás KS no sea tan malo, incluso cuando uno tiene varios vínculos y no se garantiza que el método funcione. La razón por la que me gusta KS es que no es paramétrica, es decir, no necesito asumir una distribución para las muestras.
Nonancourt
Sin embargo, todavía no puedo entender los valores de D. Pensé que podría ser un prefactor como sqrt (m * n / (m + n)) como aquí , pero eso sería D(x,y) = sqrt(100/20)*0.3=0.67, lo que sigue siendo diferente.
Nonancourt
3

Para calcular la D (desde ks.test código):

ks.test(x,y)

    Two-sample Kolmogorov-Smirnov test

data:  x and y
D = 0.5, p-value = 0.1641
alternative hypothesis: two-sided

alternative <- "two.sided"
x <- x[!is.na(x)]
n <- length(x)
  y <- y[!is.na(y)]
  n.x <- as.double(n)
  n.y <- length(y)
  w <- c(x, y)
  z <- cumsum(ifelse(order(w) <= n.x, 1/n.x, -1/n.y))
  z <- z[c(which(diff(sort(w)) != 0), n.x + n.y)] #exclude ties
  STATISTIC <- switch(alternative, two.sided = max(abs(z)), 
                      greater = max(z), less = -min(z))
  STATISTIC

[1] 0.5
Robert
fuente