Scopriamo se questo è un buon test o no. C'è molto di più che non solo affermare che è male o dimostrare in un caso che non funziona bene. La maggior parte dei test funziona male in alcune circostanze, così spesso ci troviamo di fronte a identificare le circostanze in cui qualsiasi test proposto potrebbe essere una buona scelta.
Descrizione del test
Come ogni test di ipotesi, questo consiste in (a) un'ipotesi nulla e alternativa e (b) una statistica test (il coefficiente di correlazione) intesa a discriminare tra le ipotesi.
L'ipotesi nulla è che le due variabili provengano dalla stessa distribuzione. Per essere precisi, diamo un nome alle variabili X e Y e assumiamo di aver osservato nX istanze di X , chiamate Xio= ( x1, x2, ... , xnX) , e ny istanze di Y , chiamate yio . L'ipotesi nulla è che tutte le istanze di X e Y siano indipendenti e identicamente distribuite (iid).
Prendiamo come ipotesi alternativa che (a) tutte le istanze di sono iid secondo una distribuzione sottostante F X e (b) tutte le istanze di Y sono iid secondo una distribuzione sottostante F Y ma (c) F X differisce da F Y . (Pertanto, non cercheremo correlazioni tra x i , correlazioni tra y i , correlazioni tra x i e y j o differenze di distribuzione tra x 's o yXFXYFYFXFYXioyioXioyjXyseparatamente: si presume che non sia plausibile.)
La statistica test proposto presuppone che (chiamare questo valore comune n ) e calcola il coefficiente di correlazione del ( x [ i ] , y [ i ] ) (dove, come al solito, [ i ] designa l' i esimo più piccolo dei dati). Chiama questo t ( x , y ) .nX= nyn( x[ i ], y[ i ])[ i ]ioesimot ( x , y)
Test di permutazione
In questa situazione - non importa quale statistica viene proposto - possiamo sempre condurre un test di permutazione. Sotto l'ipotesi nulla, la probabilità dei dati ( ( x 1 , x 2 , … , x n ) , ( y 1 , y 2 , … , y n ) ) è uguale alla probabilità di qualsiasi permutazione dei 2 n valori dei dati. In altre parole, l'assegnazione di metà dei dati at( ( x1, x2, ... , xn) , ( y1, y2, ... , yn) )2 n e l'altra metà a YXYè una pura coincidenza casuale. Questo è un semplice, diretta conseguenza delle ipotesi iid e l'ipotesi nulla che .FX= FY
Pertanto, la distribuzione campionaria di , subordinata alle osservazioni x i e y i , è la distribuzione di tutti i valori di t raggiunti per tutti ( 2 n ) ! permutazioni dei dati. Siamo interessati a questo perché per ogni data dimensione di prova prevista α , come α = 0,05 (corrispondente al 95 % di confidenza), costruiremo una regione critica su due lati dalla distribuzione campionaria di t : è la più estremat (x , y)Xioyiot( 2 n ) !αα = .0595t % dei possibili valori di100 α (sul lato alto, perché un'alta correlazione è coerente con distribuzioni simili e una bassa correlazione non lo è). In questo modo determiniamo quanto deve essere grande il coefficiente di correlazione per decidere che i dati provengono da diverse distribuzioni.t
Simulazione della distribuzione di campionamento nulla
Perché (o, se vuoi, ( 2( 2 n ) !, che conta il numero di modi per suddividere idati2nin due pezzi di dimensionin) diventa grande anche pernpiccoli, non è possibile calcolare esattamente la distribuzione di campionamento, quindi campioniamo usando una simulazione. (Ad esempio, quandon=16, ( 2n( 2nn) /22 nnnn = 16e(2n)! ≈2,63×1035.) Spesso sono sufficienti circa mille campioni (e certamente lo saranno per le esplorazioni che stiamo per intraprendere).( 2nn) /2=300540195 ( 2 n ) ! ≈ 2,63 × 1035
Ci sono due cose che dobbiamo scoprire: in primo luogo, come appare la distribuzione campionaria sotto l'ipotesi nulla. In secondo luogo, quanto bene questo test discrimina tra diverse distribuzioni?
C'è una complicazione: la distribuzione del campionamento dipende dalla natura dei dati. Tutto ciò che possiamo fare è guardare dati realistici, creati per emulare tutto ciò che ci interessa studiare e sperare che ciò che apprendiamo dalle simulazioni si applichi alla nostra situazione.
Implementazione
Per illustrare, ho svolto questo lavoro in R
. Cade naturalmente in tre pezzi.
Una funzione per calcolare la statistica di prova . Poiché voglio essere un po 'più generale, la mia versione gestisce set di dati di dimensioni diverse ( n x ≠ n y ) interpolando linearmente tra i valori nel set di dati più grande (ordinato) per creare corrispondenze con il set di dati più piccolo (ordinato). Perché questo è già fatto dalla funzione , prendo solo i suoi risultati: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 piccolo colpo di scena - inutile ma utile per la visualizzazione - riesprime il coefficiente di correlazione in un modo che renderà la distribuzione della statistica nulla approssimativamente simmetrica. Questo è quello che transform
sta facendo.
La simulazione della distribuzione campionaria. Per l'input questa funzione accetta il numero di iterazioni n.iter
insieme ai due set di dati negli array x
e y
. Produce una serie di n.iter
valori della statistica test. I suoi meccanismi interni dovrebbero essere trasparenti, anche per un non R
utente:
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())
}
Sebbene sia tutto ciò di cui abbiamo bisogno per condurre il test, per studiarlo dovremo ripetere il test molte volte. Quindi, eseguiamo il test una volta e avvolgiamo quel codice all'interno di un terzo livello funzionale, generalmente chiamato f
qui, che possiamo chiamare ripetutamente. Per renderlo sufficientemente generale per un ampio studio, per input accetta le dimensioni dei set di dati per simulare ( n.x
e n.y
), il numero di iterazioni per ogni test di permutazione ( n.iter
), un riferimento alla funzione test
per calcolare la statistica del test (vedrai momentaneamente perché potremmo non voler codificare questo) e due funzioni per generare valori casuali iid, uno per ( ) e uno per Y ( ). Un opzioneXdist.x
Ydist.y
plot.it
è utile per vedere cosa sta succedendo.
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)
}
L'output è un "valore p" simulato: la percentuale di simulazioni che produce una statistica che sembra più estrema di quella effettivamente calcolata per i dati.
Le parti (2) e (3) sono estremamente generali: è possibile condurre uno studio come questo per un test diverso semplicemente sostituendolo test.statistic
con qualche altro calcolo. Lo facciamo di seguito.
Primi risultati
Per impostazione predefinita, il nostro codice confronta i dati estratti da due distribuzioni uniformi. L'ho lasciato fare (per , che sono set di dati abbastanza piccoli e quindi presentano un caso di prova moderatamente difficile) e quindi lo ripeto per un confronto uniforme-normale e un confronto uniforme-esponenziale. (Le distribuzioni uniformi non sono facili da distinguere dalle distribuzioni normali a meno che tu non abbia un po 'più di 16 valori, ma le distribuzioni esponenziali - con elevata asimmetria e una lunga coda destra - di solito sono facilmente distinguibili dalle distribuzioni uniformi.)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)
XYXY
16Xio16yiof
0.051116valori indipendenti da ciascuno. Questo è piuttosto basso consumo. Ma forse è inevitabile, quindi procediamo.
I grafici a destra testano allo stesso modo una distribuzione uniforme contro una esponenziale. Questo risultato è bizzarro. Questo test tende, il più delle volte, a concludere che i dati uniformi e quelli esponenziali sembrano uguali. Sembra "pensare" che variate uniformi ed esponenziali siano più simili di due variabili uniformi! Cosa sta succedendo qui?
Il problema è che i dati di una distribuzione esponenziale tenderanno ad avere alcuni valori estremamente alti. Quando effettui un diagramma a dispersione di questi valori uniformemente distribuiti, ci saranno alcuni punti in alto a destra in tutto il resto. Ciò corrisponde a un coefficiente di correlazione molto elevato. Pertanto, ogni volta che una delle distribuzioni genera alcuni valori estremi, il coefficiente di correlazione è una scelta terribile per misurare quanto diverse siano le distribuzioni. Ciò porta a un altro problema ancora peggiore: con l'aumentare delle dimensioni del set di dati, aumentano le possibilità di ottenere alcune osservazioni estreme. Pertanto, possiamo aspettarci che questo test funzioni sempre meglio all'aumentare della quantità di dati. Che terribile ...
Un test migliore
y= x
Ecco R
un'implementazione:
test.statistic <- function(x, y) {
ks.test(x,y)$statistic
}
Esatto: è integrato nel software, quindi dobbiamo solo chiamarlo. Ma aspetta! Se leggi attentamente il manuale, imparerai che (a) il test fornisce un valore p ma (b) quel valore p è (grossolanamente) errato quando entrambi x
e y
sono set di dati. È destinato all'uso quando ritieni di sapere esattamente da quale distribuzione x
provengono i dati e vuoi vedere se è vero. Pertanto, il test non soddisfa adeguatamente l'incertezza sulla distribuzione y
da cui provengono i dati .
Nessun problema! Il framework del test di permutazione è altrettanto valido. Apportando la modifica precedente a test.statistic
, tutto ciò che dobbiamo fare è rieseguire lo studio precedente, invariato. Ecco i risultati
p = 0.20
700.0511
30α = 550α = 100.10
conclusioni
Pertanto, i problemi con il test di correlazione non sono dovuti a qualche difficoltà intrinseca in questa impostazione. Non solo il test di correlazione si comporta molto male, ma è negativo rispetto a un test ampiamente noto e disponibile. (Immagino che sia inammissibile, nel senso che funzionerà sempre peggio, in media, rispetto alla versione di permutazione del test KS, il che implica che non c'è motivo di usarlo mai.)