Comprendre le test de Kolmogorov-Smirnov dans R

17

J'essaie de comprendre la sortie de la fonction de test de Kolmogorov-Smirnov (deux échantillons, deux côtés). Voici un test 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

Il y a quelques choses que je ne comprends pas ici.

  1. D'après l' aide , il semble que la valeur p se réfère à l'hypothèse var1=var2. Cependant, ici, cela signifierait que le test dit ( p<0.05):

    une. Je ne peux pas dire ça X = Y;

    b. Je peux dire ça X = Z;

    c. Je ne peux pas dire ça X = X(!)

En plus d'apparaître que x est différent de lui-même (!), Il est également assez étrange pour moi que x=z, comme les deux distributions ont un support sans chevauchement. Comment est-ce possible?

  1. Selon la définition du test, Ddevrait être la différence maximale entre les deux distributions de probabilité, mais par exemple dans le cas, (x,y)elle devrait l'être D = Max|P(x)-P(y)| = 4(dans le cas où P(x),P(y) ne sont pas normalisées) ou D=0.3 (si elles sont normalisées). Pourquoi D est différent de cela?

  2. J'ai intentionnellement fait un exemple avec de nombreux liens , car les données avec lesquelles je travaille ont beaucoup de valeurs identiques. Pourquoi cela confond-il le test? J'ai pensé qu'il calculait une distribution de probabilité qui ne devrait pas être affectée par des valeurs répétées. Une idée?

Nonancourt
la source

Réponses:

21

Le test KS est fondé sur le test de la «similitude» de deux échantillons indépendants d'une distribution continue (comme l'indique la page d'aide). Si tel est le cas, la probabilité de liens devrait être étonnamment faible (également indiqué). La statistique de test est la distance maximale entre les ECDF des deux échantillons. La valeur p est la probabilité de voir une statistique de test aussi élevée ou plus élevée que celle observée si les deux échantillons ont été tirés de la même distribution. (Ce n'est pas la "probabilité que var1 = var2". Et en outre, 1-p_value n'est PAS non plus cette probabilité.) Des valeurs de p élevées disent que vous ne pouvez pasrevendiquent un support statistique pour une différence, mais les faibles valeurs de p ne sont pas des preuves de similitude. De faibles valeurs de p peuvent se produire avec de faibles tailles d'échantillon (comme le montre votre exemple) ou la présence de différences intéressantes mais faibles, par exemple des perturbations oscillatoires superposées. Si vous travaillez avec des situations avec un grand nombre de liens, cela suggère que vous devrez peut-être utiliser un test qui correspond mieux à votre situation de données.

Mon explication de la raison pour laquelle les liens étaient une violation des hypothèses n'était pas une affirmation selon laquelle les liens invalidaient les résultats. Les propriétés statistiques du test KS dans la pratique sont relativement résistantes ou robustes à l'échec de cette hypothèse. Le problème principal avec le test KS, comme je le vois, est qu'il est excessivement général et, par conséquent, est sous-alimenté pour identifier des différences significatives de nature intéressante. Le test KS est un test très général et a une puissance assez faible pour des hypothèses plus spécifiques.

D'un autre côté, je vois également le test KS (ou le test "encore plus puissant" d'Anderson Darling ou Lillefors (sp?)) Utilisé pour tester la "normalité" dans des situations où un tel test est complètement injustifié, comme un test pour la normalité des variables utilisées comme prédicteurs dans un modèle de régression avant l'ajustement. On peut légitimement vouloir être tester la normalité des les résidus puisque c'est ce que l' on suppose dans la théorie de la modélisation. Même alors, des écarts modestes par rapport à la normalité des résidus ne remettent généralement pas en cause la validité des résultats. Les personnes préfèrent utiliser des méthodes robustes pour vérifier l'impact important de la «non-normalité» sur les conclusions concernant la signification statistique.

Vous devriez peut-être consulter un statisticien local? Cela pourrait vous aider à définir un peu plus précisément la question statistique et donc avoir une meilleure chance d'identifier une différence si elle existe réellement. Ce serait éviter une "erreur de type II": ne pas étayer une conclusion de différence lorsqu'une telle différence est présente.

DWin
la source
J'ai testé les mêmes exemples avec dgof::ks.test(x,y,simulate.p.value=TRUE, B=1000)et Matching::ks.boot(x,y, nboots=1000)( sekhon.berkeley.edu/matching/ks.boot.html ). D et la valeur de p calculée sont absolument identiques dans les deux cas. Cela me fait penser que peut-être KS n'est pas si mal, même quand on a plusieurs liens et que la méthode n'est pas garantie de fonctionner? La raison pour laquelle j'aime KS n'est pas paramétrique, c'est-à-dire que je n'ai pas besoin de supposer une distribution pour les échantillons.
Nonancourt
Cependant, je ne peux toujours pas donner un sens aux valeurs de D. Je pensais que ce pourrait être un préfacteur comme sqrt (m * n / (m + n)) comme ici , mais cela ferait D(x,y) = sqrt(100/20)*0.3=0.67, ce qui est toujours différent.
Nonancourt
3

Pour calculer le D (à partir du ks.testcode):

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
la source