Lassen Sie uns herausfinden, ob dies ein guter Test ist oder nicht. Es steckt viel mehr dahinter, als nur zu behaupten, es sei schlecht oder zu zeigen, dass es nicht gut funktioniert. Die meisten Tests funktionieren unter bestimmten Umständen schlecht. Daher müssen wir häufig feststellen, unter welchen Umständen ein vorgeschlagener Test möglicherweise eine gute Wahl darstellt.
Beschreibung des Tests
Wie jeder Hypothesentest besteht dieser aus (a) einer Null- und einer Alternativhypothese und (b) einer Teststatistik (dem Korrelationskoeffizienten), mit der zwischen den Hypothesen unterschieden werden soll.
Die Nullhypothese lautet, dass die beiden Variablen aus derselben Verteilung stammen. Um genau zu sein, nennen wir die Variablen und Y und nehmen an, wir haben n x Instanzen von X mit der Bezeichnung x i = ( x 1 , x 2 , … , x n x ) und n y Instanzen von Y mit der Bezeichnung y beobachtet ich . Die Nullhypothese ist, dass alle Instanzen von XXY.nxXxich= ( x1, x2, … , Xnx)nyY.yichX und unabhängig und identisch verteilt sind (iid).Y.
Nehmen wir als alternative Hypothese an, dass (a) alle Instanzen von gemäß einer zugrunde liegenden Verteilung F X sind und (b) alle Instanzen von Y gemäß einer zugrunde liegenden Verteilung F Y sind, aber (c) F X von F verschieden ist Y . (Daher werden wir nicht nach Korrelationen zwischen x i , Korrelationen zwischen y i , Korrelationen zwischen x i und y j oder Verteilungsunterschieden zwischen x 's oder y suchenXFXY.FY.FXFY.xichyichxichyjxyist separat: das wird als nicht plausibel angenommen.)
Die vorgeschlagene Teststatistik wird davon ausgegangen , dass (nennen wir diesen gemeinsamen Wert n ) und berechnet den Korrelationskoeffizienten des ( x [ i ] , Y [ i ] ) (wobei, wie üblich, [ i ] bezeichnet den i - ten kleinsten der Daten). Nenne dies t ( x , y ) .nx= nyn( x[ i ], y[ i ])[ i ]ichtht ( x , y)
Permutationstests
In dieser Situation - egal welche Statistik vorgeschlagen wird - wir können immer ein Verhalten Permutationstest. Unter der Nullhypothese ist die Wahrscheinlichkeit der Daten ( ( x 1 , x 2 , … , x n ) , ( y 1 , y 2 , … , y n ) ) dieselbe wie die Wahrscheinlichkeit einer Permutation der 2 n Datenwerte. Mit anderen Worten die Zuordnung der Hälfte der Daten zu Xt( ( x1, x2, … , Xn) , ( y1, y2, … , Yn) )2 nX und der anderen Hälfte zu Y.ist ein reiner Zufall. Dies ist eine einfache, direkte Folge der iid-Annahmen und der Nullhypothese, dass FX= FY. .
Daher ist die Stichprobenverteilung von , bedingt auf den Beobachtungen x i und y i ist die Verteilung aller Werte von t für alle erreicht ( 2 n ) ! Permutationen der Daten. Dies interessiert uns, da wir für jede vorgesehene Testgröße α , wie α = 0,05 (entsprechend 95 % Konfidenz), einen zweiseitigen kritischen Bereich aus der Stichprobenverteilung von konstruierent ( x , y)xichyicht( 2 n ) !αα = 0,0595: Er besteht aus dem extremstent % der möglichen Werte von t (auf der hohen Seite, weil eine hohe Korrelation mit ähnlichen Verteilungen konsistent ist und eine niedrige Korrelation nicht). So bestimmen wir, wie groß der Korrelationskoeffizient sein muss, um zu entscheiden, ob die Daten aus unterschiedlichen Verteilungen stammen.100 αt
Simulation der Null-Sampling-Verteilung
Weil (oder, wenn Sie möchten, ( 2 n( 2 n ) !, die die Anzahl der Arten der Spaltung zählt die2nDaten in zwei Stücke der Größen) wird großselbst für kleinen,es nicht praktikabel istdie Stichprobenverteilung genau zu berechnen, so dass wir sie abtasten eine Simulation. (Zum Beispiel, wennn=16, ( 2n( 2nn) /22 nnnn = 16und(2n)! ≤2,63×1035( 2nn) /2=300540195 ( 2 n ) ! ≤ 2,63 × 1035 ) Ungefähr tausend Proben reichen oft aus (und werden es sicherlich für die Erkundungen tun, die wir in Kürze durchführen werden).
Wir müssen zwei Dinge herausfinden: Erstens, wie sieht die Stichprobenverteilung unter der Nullhypothese aus. Zweitens, wie gut unterscheidet dieser Test zwischen verschiedenen Verteilungen?
Es gibt eine Komplikation: Die Stichprobenverteilung hängt von der Art der Daten ab. Alles, was wir tun können, ist, realistische Daten zu betrachten, die erstellt wurden, um das zu emulieren, woran wir interessiert sind, und zu hoffen, dass das, was wir aus den Simulationen lernen, auf unsere eigene Situation zutrifft.
Implementierung
Zur Veranschaulichung habe ich diese Arbeit in ausgeführt R
. Es fällt natürlich in drei Teile.
Eine Funktion zur Berechnung der Teststatistik . Da ich etwas allgemeiner sein möchte, verarbeitet meine Version Datensätze unterschiedlicher Größe ( n x ≠ n y ), indem sie linear zwischen den Werten im (sortierten) größeren Datensatz interpoliert, um Übereinstimmungen mit dem (sortierten) kleineren Datensatz zu erstellen. Da dies bereits von der Funktion erledigt wird , nehme ich nur die Ergebnisse: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))
}
Eine kleine Drehung - unnötig, aber hilfreich für die Visualisierung - drückt den Korrelationskoeffizienten so um, dass die Verteilung der Nullstatistik annähernd symmetrisch wird. Das ist, was transform
macht.
Die Simulation der Stichprobenverteilung. Für die Eingabe akzeptiert diese Funktion die Anzahl der Iterationen n.iter
zusammen mit den beiden Datensätzen in Arrays x
und y
. Es gibt ein Array von n.iter
Werten der Teststatistik aus. Das Innenleben sollte auch für Nichtbenutzer transparent sein R
:
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())
}
Obwohl dies alles ist, was wir zur Durchführung des Tests benötigen, werden wir den Test zum Studieren viele Male wiederholen wollen. Also führen wir den Test einmal durch und binden diesen Code in eine dritte Funktionsschicht f
ein, die wir hier allgemein nennen und die wir wiederholt aufrufen können. Damit es für eine umfassende Studie ausreichend allgemein ist, akzeptiert es für die Eingabe die Größe der zu simulierenden Datensätze ( n.x
und n.y
), die Anzahl der Iterationen für jeden Permutationstest ( n.iter
) und einen Verweis auf die Funktion test
zur Berechnung der Teststatistik (siehe Abbildung) momentan, warum wir dies vielleicht nicht hart codieren wollen, und zwei Funktionen, um iid-Zufallswerte zu generieren, eine für ( ) und eine für Y ( ). Eine OptionXdist.x
Y.dist.y
plot.it
ist nützlich, um zu sehen, was los ist.
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)
}
Der Ausgang ist ein simulierter „p-Wert“: Der Anteil der Simulationen eine Statistik wodurch man sieht , dass mehr extreme als die tatsächlich für die Daten berechnet.
Die Teile (2) und (3) sind äußerst allgemein gehalten: Sie können eine Studie wie diese für einen anderen Test durchführen, indem Sie sie einfach durch test.statistic
eine andere Berechnung ersetzen . Das machen wir weiter unten.
Erste Ergebnisse
Standardmäßig vergleicht unser Code Daten aus zwei gleichmäßigen Verteilungen. Ich lasse es das tun (für , die ziemlich kleine Datensätze sind und daher einen mäßig schwierigen Testfall darstellen) und wiederhole es dann für einen Vergleich von Normal zu Normal und von Exponential zu Exponential. (Gleichmäßige Verteilungen sind nicht leicht von normalen Verteilungen zu unterscheiden, es sei denn, Sie haben etwas mehr als 16 Werte, aber exponentielle Verteilungen - mit einer hohen Schiefe und einem langen rechten Schwanz - sind normalerweise leicht von gleichmäßigen Verteilungen zu unterscheiden.)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)
XY.XY.
16xich16yichf
0,051116unabhängige Werte von jedem. Das ist ziemlich wenig Strom. Aber vielleicht ist es unvermeidlich, also lasst uns fortfahren.
Die rechten Diagramme testen auf ähnliche Weise eine gleichmäßige Verteilung gegen eine exponentielle. Dieses Ergebnis ist bizarr. Dieser Test lässt meistens den Schluss zu, dass einheitliche Daten und exponentielle Daten gleich aussehen. Es scheint , zu „denken“ , dass einheitliche und exponentielles variates ist mehr ähnlich als zwei einheitliche Variablen! Was ist denn hier los?
Das Problem ist, dass Daten aus einer Exponentialverteilung dazu neigen, einige extrem hohe Werte zu haben. Wenn Sie ein Streudiagramm dieser Werte gegen gleichmäßig verteilte Werte erstellen, befinden sich im Übrigen einige Punkte weit rechts oben. Das entspricht einem sehr hohen Korrelationskoeffizienten. Somit , wenn entweder der Verteilungen einige Extremwerte erzeugt, wird der Korrelationskoeffizient eine schreckliche Wahl für die Messung , wie unterschiedlich die Verteilungen sind. Dies führt zu einem weiteren, noch schlimmeren Problem: Je größer der Datensatz wird, desto größer ist die Wahrscheinlichkeit, dass Sie einige extreme Beobachtungen erhalten. Daher können wir erwarten , dass dieser Test mit zunehmender Datenmenge immer schlechter wird. Wie schrecklich ...
Ein besserer Test
y= x
Hier ist eine R
Implementierung:
test.statistic <- function(x, y) {
ks.test(x,y)$statistic
}
Das ist richtig: Es ist in die Software integriert, also müssen wir es nur aufrufen. Aber warte! Wenn Sie das Handbuch sorgfältig lesen, werden Sie feststellen, dass (a) der Test einen p-Wert liefert, (b) dieser p-Wert jedoch (grob) falsch ist, wenn beide x
und y
Datensätze sind. Es ist zur Verwendung gedacht, wenn Sie glauben, genau zu wissen , von welcher Verteilung die Daten x
stammen und ob dies zutrifft. Daher berücksichtigt der Test die Unsicherheit über die Verteilung, aus der die Daten y
stammen, nicht richtig .
Kein Problem! Das Permutationstest-Framework ist immer noch genauso gültig. Nachdem wir die vorherige Änderung an vorgenommen test.statistic
haben, müssen wir die vorherige Studie unverändert wiederholen. Hier sind die Ergebnisse.
p = 0,20
700,0511
30α = 550α = 100.10
Schlussfolgerungen
Somit sind die Probleme mit dem Korrelationstest nicht auf eine inhärente Schwierigkeit bei dieser Einstellung zurückzuführen. Der Korrelationstest ist nicht nur sehr schlecht, sondern auch im Vergleich zu einem allgemein bekannten und verfügbaren Test schlecht. (Ich würde vermuten, dass es unzulässig ist, was bedeutet, dass es im Durchschnitt immer schlechter abschneidet als die Permutationsversion des KS-Tests, was bedeutet, dass es keinen Grund gibt, es jemals zu verwenden.)