Come si crea un intervallo di confidenza per il parametro di un test di permutazione?


9

I test di permutazione sono test di significatività basati su campioni di permutazione estratti a caso dai dati originali. I campioni di permutazione vengono disegnati senza sostituzione, a differenza dei campioni bootstrap, che vengono disegnati con la sostituzione. Ecco un esempio che ho fatto in R di un semplice test di permutazione. (I tuoi commenti sono benvenuti)

I test di permutazione hanno grandi vantaggi. Non richiedono forme specifiche di popolazione come la normalità. Si applicano a una varietà di statistiche, non solo a statistiche che hanno una distribuzione semplice sotto l'ipotesi nulla. Possono fornire valori p molto precisi, indipendentemente dalla forma e dalle dimensioni della popolazione (se vengono utilizzate permutazioni sufficienti).

Ho anche letto che è spesso utile fornire un intervallo di confidenza insieme a un test, che viene creato utilizzando il ricampionamento bootstrap anziché il ricampionamento delle permutazioni.

Potresti spiegare (o semplicemente dare il codice R) come viene costruito un intervallo di confidenza (cioè per la differenza tra le medie dei due campioni nell'esempio sopra)?

MODIFICARE

Dopo aver cercato su Google ho trovato questa lettura interessante .

Risposte:


7

Va bene usare il ricampionamento delle permutazioni. Dipende davvero da una serie di fattori. Se le tue permutazioni sono un numero relativamente basso, la tua stima dell'intervallo di confidenza non è così grande con le permutazioni. Le tue permutazioni sono in qualche modo di un'area grigia e probabilmente vanno bene.

L'unica differenza rispetto al codice precedente è che genererai i tuoi campioni in modo casuale anziché con permutazioni. E ne genereresti di più, diciamo ad esempio 1000. Ottieni i punteggi delle differenze per le tue 1000 repliche dell'esperimento. Prendi i tagli per metà 950 (95%). Questo è il tuo intervallo di confidenza. Cade direttamente dal bootstrap.

Hai già fatto gran parte di questo nel tuo esempio. dif.treat è lungo 462 articoli. Pertanto, è necessario il taglio inferiore del 2,5% e superiore del 2,5% (circa 11 articoli in ciascuna estremità).

Usando il tuo codice prima ...

y <- sort(dif.treat)
ci.lo <- y[11]
ci.hi <- y[462-11]

Fuori mano direi che 462 è un po 'basso ma troverai un bootstrap a 10.000 che esce con punteggi leggermente diversi (probabilmente più vicini alla media).

Ho pensato di aggiungere anche alcuni semplici codici che richiedono la libreria di avvio (in base al codice precedente).

diff <- function(x,i) mean(x[i[6:11]]) - mean(x[i[1:5]])
b <- boot(total, diff, R = 1000)
boot.ci(b)

Grazie. Va bene generare i campioni usando samplee replace=TRUE? C'è qualche motivo per usare un pacchetto simile boot?
George Dontas,

In genere viene eseguito con la sostituzione, quindi si desidera impostarlo su TRUE. Per quanto riguarda il motivo per cui ... il pacchetto è ottimizzato, quindi dovrebbe essere eseguito più velocemente .... mai a tempo. Questo può essere un problema se si imposta R grande. E, come puoi vedere, il codice è carino e conciso. Ha anche molte funzionalità che non riusciresti a realizzare facilmente.
Giovanni,

boot.ci restituisce l'intervallo di confidenza. Esiste una funzione (di avvio) che fornisce il valore p.value? (come rapporto tra il numero di differenze almeno pari a quello osservato, rispetto al numero totale di campioni generati)
George Dontas,

ok, ho trovato un modo per ottenerlo:sum(b$t>=b$t0)/b$R
George Dontas il

@ gd047: tieni presente che stai calcolando un valore p unilaterale.
Joris Meys,

4

Come test di permutazione è un test esatto , che ti dà un valore p esatto. Il bootstrap di un test di permutazione non ha senso.

Inoltre, determinare un intervallo di confidenza attorno a una statistica di prova non ha senso, poiché viene calcolato in base al campione e non a una stima. Determinate gli intervalli di confidenza in base a stime come medie e Mi piace, ma non in base alle statistiche dei test.

I test di permutazione non dovrebbero essere usati su set di dati così grandi da non poter più calcolare tutte le possibili permutazioni. In tal caso, utilizzare una procedura bootstrap per determinare l'interruzione per la statistica di test che si utilizza. Ma ancora una volta, questo ha poco a che fare con un intervallo di confidenza del 95%.

Un esempio: utilizzo qui la classica statistica T, ma uso un approccio semplice al bootstrap per il calcolo della distribuzione empirica della mia statistica. Sulla base di ciò, calcolo un valore p empirico:

x <- c(11.4,25.3,29.9,16.5,21.1)
y <- c(23.7,26.6,28.5,14.2,17.9,24.3)

t.sample <- t.test(x,y)$statistic
t.dist <- apply(
      replicate(1000,sample(c(x,y),11,replace=F)),2,
      function(i){t.test(i[1:5],i[6:11])$statistic})

# two sided testing
center <- mean(t.dist)
t.sample <-abs(t.sample-center)
t.dist <- abs(t.dist - center)
p.value <- sum( t.sample < t.dist ) / length(t.dist)
p.value

Tieni presente che questo test fronte-retro funziona solo per distribuzioni simmetriche. Le distribuzioni non simmetriche sono in genere testate solo su un lato.

MODIFICARE :

OK, ho frainteso la domanda. Se si desidera calcolare un intervallo di confidenza sulla stima della differenza, è possibile utilizzare il codice menzionato qui per il bootstrap all'interno di ciascun campione. Intendiamoci, questa è una stima distorta: in genere questo fornisce un elemento della configurazione troppo piccolo. Vedi anche l'esempio fornito lì come motivo per cui devi usare un approccio diverso per l'intervallo di confidenza e il valore p.


1
Puoi dare una spiegazione del perché i test di permutazione non dovrebbero essere usati su set di dati che non puoi calcolare tutte le possibili permutazioni?
Andy W,

@Andy W: per prima cosa definire "test di permutazione". per me, i test di permutazione sono test esatti, usando ogni permutazione possibile. Questo è impossibile su set di dati più grandi. I "test di permutazione approssimativa" sono in realtà il metodo Monte Carlo semplice e dovrebbero essere affrontati in questo modo. Accanto a ciò, il teorema del limite centrale assicura nella maggior parte dei casi che le assunzioni relative alla distribuzione delle statistiche di test sono soddisfatte quando si utilizzano set di dati di grandi dimensioni. In test complessi, l'uso di test di permutazione su set di dati di grandi dimensioni rende i tempi di calcolo insopportabilmente lunghi senza aggiungere alcun valore significativo. my2cents
Joris Meys,

Non ho detto niente di simile al bootstrap di un test di permutazione. Sono entrato in questa domanda dopo aver letto l'ultimo paragrafo della [SEZIONE 14.5 | Riepilogo], nel pdf collegato.
George Dontas,

@ gd047 Quindi ho letto male la tua domanda. Ma dovresti davvero tenere gli intervalli di confidenza e i valori p. Rigorosamente separati. L'intervallo di confidenza viene stimato in base al bootstrap all'interno di ciascun campione (sebbene sia distorto per definizione), il test di permutazione viene eseguito da permutazioni sull'insieme di dati completo. Sono due cose completamente diverse.
Joris Meys,

@Kevin: il codice era dannatamente giusto. Leggi di nuovo il codice: si x[6:11]riferisce all'argomento xdella funzione anonima all'interno dell'applicazione. Forse confuso, ma la tua modifica ha dato risultati molto sbagliati. Commenta cosa pensi che dovrebbe essere prima di modificare il codice. Mi salva un rollback. Per evitare ulteriore confusione, l'ho cambiato xini
Joris Meys il

0

Dal codice Joris Meys nelle Risposte ma con modifiche per consentirne l'applicazione in più un'unica situazione:

Ho provato a modificare l'altro ma non ho avuto il tempo di finire e per qualche ragione non posso commentare (forse perché questa è una vecchia domanda).

x <- c(11.4,25.3,29.9,16.5,21.1)
y <- c(23.7,26.6,28.5,14.2,17.9,24.3)

t.sample <- t.test(x,y)$statistic

t.dist <- apply(
          replicate(1000,sample(c(x,y),length(c(x,y)),replace=F)), 2,
          function(i){t.test(i[1:length(x)],i[length(x)+1:length(c(x,y))])$statistic})

# two sided testing
center <- mean(t.dist)
t.sample <-abs(t.sample-center)
t.dist <- abs(t.dist - center)
p.value <- sum( t.sample < t.dist ) / length(t.dist)
p.value
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.