Kolmogorov-Smirnov-Test in R verstehen


17

Ich versuche die Ausgabe der Kolmogorov-Smirnov-Testfunktion zu verstehen (zwei Beispiele, zweiseitig). Hier ist ein einfacher Test.

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

Es gibt ein paar Dinge, die ich hier nicht verstehe.

  1. Aus der Hilfe geht hervor , dass sich der p-Wert auf die Hypothese bezieht var1=var2. Hier würde dies jedoch bedeuten, dass der Test ( p<0.05) sagt :

    ein. Kann ich nicht sagen X = Y;

    b. Kann das sagen X = Z;

    c. Kann ich nicht sagen X = X(!)

Abgesehen davon, dass x von sich selbst (!) Verschieden ist, ist es für mich auch ziemlich seltsam, dass x=zdie beiden Verteilungen keine überlappende Unterstützung haben. Wie ist das möglich?

  1. Nach der Definition des Tests Dsoll die maximale Differenz zwischen den beiden Wahrscheinlichkeitsverteilungen, sondern zum Beispiel in dem Fall , (x,y)sollte es sein D = Max|P(x)-P(y)| = 4(in dem Fall , wenn P(x), P(y)nicht normalisiert ist) oder D=0.3 (wenn sie normiert ist). Warum unterscheidet sich D davon?

  2. Ich habe absichtlich ein Beispiel mit vielen Bindungen gemacht , da die Daten, mit denen ich arbeite, viele identische Werte haben. Warum verwirrt dies den Test? Ich dachte, es berechnete eine Wahrscheinlichkeitsverteilung, die durch wiederholte Werte nicht beeinflusst werden sollte. Irgendeine Idee?

Antworten:


21

Der KS-Test basiert auf dem Testen der "Gleichheit" zweier unabhängiger Stichproben aus einer kontinuierlichen Verteilung (wie auf der Hilfeseite angegeben ). Wenn dies der Fall ist, sollte die Wahrscheinlichkeit von Unentschieden erstaunlich gering sein (ebenfalls angegeben). Die Teststatistik ist der maximale Abstand zwischen den ECDFs der beiden Proben. Der p-Wert gibt die Wahrscheinlichkeit an, dass eine Teststatistik so hoch oder höher ist als diejenige, die beobachtet wurde, wenn die beiden Proben aus derselben Verteilung entnommen wurden. (Es ist nicht die "Wahrscheinlichkeit, dass var1 = var2". Außerdem ist 1-p_value auch NICHT die Wahrscheinlichkeit.) Hohe p-Werte sagen, dass Sie dies nicht könnenbehaupten statistische Unterstützung für einen Unterschied, aber niedrige p-Werte sind kein Beweis für Gleichheit. Niedrige p-Werte können bei geringen Stichprobengrößen (wie in Ihrem Beispiel angegeben) oder bei interessanten, aber kleinen Unterschieden auftreten, z. B. bei überlagerten Schwingungsstörungen. Wenn Sie mit Situationen mit einer großen Anzahl von Bindungen arbeiten, empfiehlt es sich, möglicherweise einen Test zu verwenden, der besser zu Ihrer Datensituation passt.

Meine Erklärung, warum Bindungen einen Verstoß gegen Annahmen darstellen, ist keine Behauptung, dass Bindungen die Ergebnisse ungültig machen. Die statistischen Eigenschaften des KS-Tests sind in der Praxis relativ widerstandsfähig oder robust gegen das Scheitern dieser Annahme. Das Hauptproblem beim KS-Test besteht meines Erachtens darin, dass er zu allgemein ist und infolgedessen nicht in der Lage ist, signifikante Unterschiede interessanter Art zu identifizieren. Der KS-Test ist ein sehr allgemeiner Test und hat für spezifischere Hypothesen eine eher geringe Aussagekraft.

Andererseits sehe ich auch den KS-Test (oder den "noch leistungsstärkeren" Anderson-Darling- oder Lillefors-Test (sp?)), Der zum Testen der "Normalität" in Situationen verwendet wird, in denen ein solcher Test völlig ungerechtfertigt ist, z Die Normalität von Variablen, die vor der Anpassung als Prädiktoren in einem Regressionsmodell verwendet werden. Man könnte will berechtigterweise die Normalität zu testen von den Residuen denn das ist , was in der Modellierungstheorie angenommen wird. Selbst dann stellen bescheidene Abweichungen von der Normalität der Residuen die Gültigkeit der Ergebnisse im Allgemeinen nicht in Frage. Es wäre besser, wenn die Personen robuste Methoden anwenden, um zu überprüfen, ob die "Nicht-Normalität" wichtige Auswirkungen auf die Schlussfolgerungen über die statistische Signifikanz hat.

Vielleicht sollten Sie einen örtlichen Statistiker konsultieren? Es kann Ihnen dabei helfen, die statistische Frage etwas genauer zu definieren, und hat daher eine bessere Chance, einen Unterschied zu identifizieren, wenn einer tatsächlich existiert. Das wäre die Vermeidung eines "Typ-II-Fehlers": Wenn ein solcher Unterschied vorliegt, kann die Schlussfolgerung eines Unterschieds nicht gestützt werden.



Ich habe die gleichen Beispiele sowohl mit dgof::ks.test(x,y,simulate.p.value=TRUE, B=1000)als auch Matching::ks.boot(x,y, nboots=1000)( sekhon.berkeley.edu/matching/ks.boot.html ) getestet . Sowohl D als auch der berechnete p-Wert sind in beiden Fällen absolut identisch. Das lässt mich denken, dass KS vielleicht gar nicht so schlecht ist, auch wenn man mehrere Bindungen hat und die Methode nicht garantiert funktioniert? Der Grund, warum ich KS mag, ist, dass es nicht parametrisch ist, dh ich muss keine Verteilung für die Samples annehmen.
Nonancourt

Allerdings kann ich die Werte von D immer noch nicht verstehen. Ich dachte, es könnte ein Präfaktor wie hier sein , aber das würde bedeuten D(x,y) = sqrt(100/20)*0.3=0.67, was immer noch anders ist.
Nonancourt

3

So berechnen Sie das D (aus 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.