Verifica se le variabili seguono la stessa distribuzione


16

Se si desidera verificare se due variabili seguono la stessa distribuzione, sarebbe un buon test semplicemente ordinare entrambe le variabili e quindi verificarne la correlazione? Se è alto (almeno 0,9?), Allora le variabili molto probabilmente provengono dalla stessa distribuzione.

Con distribuzione qui intendo "normale", "chi-quadrato", "gamma" ecc.

Risposte:


35

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[io],y[io])[io]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))2n 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(2n)!αα=.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(2n)!, 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)/22nnnn=16e(2n)! 2,63×1035.) Spesso sono sufficienti circa mille campioni (e certamente lo saranno per le esplorazioni che stiamo per intraprendere).(2nn)/2=300 540 195(2n)!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.

  1. 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 xn 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)nXnyRqqplot

    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 transformsta facendo.

  2. La simulazione della distribuzione campionaria. Per l'input questa funzione accetta il numero di iterazioni n.iterinsieme ai due set di dati negli array xe y. Produce una serie di n.itervalori della statistica test. I suoi meccanismi interni dovrebbero essere trasparenti, anche per un non Rutente:

    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())
    }
  3. 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 fqui, che possiamo chiamare ripetutamente. Per renderlo sufficientemente generale per un ampio studio, per input accetta le dimensioni dei set di dati per simulare ( n.xe n.y), il numero di iterazioni per ogni test di permutazione ( n.iter), un riferimento alla funzione testper 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.xYdist.yplot.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.statisticcon 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)

Risultati del test di correlazione

XYXY

16Xio16yiof0.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 Run'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 xe ysono set di dati. È destinato all'uso quando ritieni di sapere esattamente da quale distribuzione xprovengono i dati e vuoi vedere se è vero. Pertanto, il test non soddisfa adeguatamente l'incertezza sulla distribuzione yda 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

Studio di test KS

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.)


Spiegazione molto bella e mi piace vedere gli altri fare alcune simulazioni. Ho ancora problemi a capire perché una correlazione sembra prevedere un po '(o non possiamo nemmeno dire così tanto?). Inoltre, l'unica vaga (eppure critica parte per capire perché KS funziona) riguarda "la linea x = y" ("calcola la più grande deviazione verticale dalla linea y = x nel loro diagramma QQ. (Quando i dati provengono dallo stesso distribuzione, la trama QQ tende a seguire questa linea ".) Grazie per lo sforzo, ho imparato molto
PascalVKooten,

1
È tutto facile da trovare su Wikipedia attraverso le ovvie ricerche :-). Per quanto riguarda la correlazione, il problema è che le variabili possono essere fortemente correlate ma avere distribuzioni totalmente diverse; in effetti, esistono sequenze di distribuzioni che diventano arbitrariamente "distanti" (in senso intuitivo) mentre la distribuzione del loro coefficiente di correlazione si avvicina arbitrariamente a1in set di dati di grandi dimensioni. Ciò rende il coefficiente di correlazione uno scarso discriminatore della distribuzione.
whuber

KS verifica se due set di dati provengono dalla stessa funzione di distribuzione, ovvero i loro CDF sono gli stessi. Mi sembra, tuttavia, che OP potrebbe essere alla ricerca di un test che dirà che Exp (0.1) è la stessa cosa di Exp (100) e Normal (0, 5) è lo stesso di Normal (10, .2 ). KS non lo fa affatto, e in effetti è probabilmente impossibile in generale (e non so davvero quando lo vorresti). Ma alcuni test su quanto sia deformabile l'uno nell'altro potrebbero funzionare in casi semplici (ad es. Centrare e standardizzare gestirà le normali in modo decente, sebbene non esponenziali).
Dougal,

@Dougal Ho riletto il tuo commento. È corretto affermare che quando diciamo che "le distribuzioni sono uguali", intendiamo che i CDF sono gli stessi?
PascalVKooten,

@PascalvKooten "Distribuzione" è una parola che si abitua a significare cose diverse in contesti diversi. In generale, tuttavia, penso che "distribuzione" in genere significhi qualcosa definito da un particolare CDF (o equivalente); "normale" o "gamma" si riferiscono a famiglie di distribuzioni, che definiscono una particolare distribuzione in base ai loro valori dei parametri (ad esμ e σ2per un normale).
Dougal,

5

No, la correlazione non è una buona prova di ciò.

x <- 1:100 #Uniform
y <- sort(rnorm(100)) #Normal
cor(x,y) #.98

Non conosco un buon test che paragona se, ad esempio, due distribuzioni sono entrambe normali, ma possibilmente con media e sd indirettamente diverse, si potrebbe testare la normalità di ciascuna, separatamente, e se entrambi sembravano normali, suppongo che lo fossero entrambi.


0

Se esiste un numero sufficientemente grande di variabili, ciò può mostrare una maggiore correlazione con i valori ordinati per dimensione. Tuttavia, non sembra essere un metodo particolarmente utile, anche perché fornisce pochi mezzi per stimare la fiducia che potrebbero usare lo stesso modello.

Un problema che si rischia di sperimentare è quando si hanno modelli con media e asimmetria simili, ma una differenza nella curtosi, poiché un numero moderato di misurazioni può adattarsi sufficientemente bene da sembrare abbastanza ben correlato.

Sembra più ragionevole modellare entrambe le variabili rispetto a distribuzioni diverse per vedere quale è la più probabile per ciascuna e confrontare i risultati.

Potrebbe esserci qualche merito nel normalizzare entrambi i valori, nell'ordinarli e nel tracciarli ciascuno - questo ti permetterà di vedere come si confrontano gli accoppiamenti - e puoi anche tracciare un possibile modello per entrambi, che sarebbe correlato a ciò che hai suggerito, ma piuttosto che aspettando una risposta concreta, solo un'idea visiva sulla vicinanza delle distribuzioni.


(1) La mia analisi rileva che l'aspettativa espressa nella prima frase non è confermata: con un numero sufficientemente grande di variabili, se una delle distribuzioni ha code corte e l'altra ha solo una leggera possibilità di esibire valori più estremi, allora la correlazione tende ad essere eccessivamente alta. (2) Quando si "modella ... contro diverse distribuzioni" come si controllano i molteplici test dipendenti impliciti da quella prescrizione?
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.