Discussione
Un test di permutazione genera tutte le permutazioni rilevanti di un set di dati, calcola una statistica di test designata per ciascuna di tali permutazioni e valuta la statistica di test effettiva nel contesto della distribuzione di permutazione risultante delle statistiche. Un modo comune per valutarlo è riportare la percentuale di statistiche che sono (in un certo senso) "come o più estreme" rispetto alla statistica reale. Questo è spesso chiamato "valore p".
Poiché il set di dati effettivo è una di quelle permutazioni, la sua statistica sarà necessariamente tra quelle presenti nella distribuzione delle permutazioni. Pertanto, il valore p non può mai essere zero.
A meno che il set di dati non sia molto piccolo (in genere meno di circa 20-30 numeri totali) o che la statistica del test abbia una forma matematica particolarmente piacevole, non è possibile generare tutte le permutazioni. (Un esempio in cui vengono generate tutte le permutazioni appare al Test di permutazione in R. ) Pertanto le implementazioni al computer dei test di permutazione tipicamente campionano dalla distribuzione di permutazione. Lo fanno generando alcune permutazioni casuali indipendenti e sperano che i risultati siano un campione rappresentativo di tutte le permutazioni.
Pertanto, tutti i numeri (come un "valore p") derivati da tale campione sono solo stimatori delle proprietà della distribuzione della permutazione. È del tutto possibile - e spesso accade quando gli effetti sono grandi - che il valore p stimato è zero. Non c'è nulla di sbagliato in questo, ma solleva immediatamente il problema finora trascurato di quanto il valore p stimato potrebbe differire da quello corretto? Poiché la distribuzione campionaria di una proporzione (come un valore p stimato) è binomiale, questa incertezza può essere affrontata con un intervallo di confidenza binomiale .
Architettura
Un'attuazione ben costruita seguirà da vicino la discussione sotto tutti gli aspetti. Inizierebbe con una routine per calcolare la statistica del test, in quanto questa per confrontare le medie di due gruppi:
diff.means <- function(control, treatment) mean(treatment) - mean(control)
Scrivere un'altra routine per generare una permutazione casuale del set di dati e applicare la statistica del test. L'interfaccia a questo consente al chiamante di fornire la statistica di test come argomento. Confronterà i primi m
elementi di un array (presumibilmente un gruppo di riferimento) con gli elementi rimanenti (il gruppo "trattamento").
f <- function(..., sample, m, statistic) {
s <- sample(sample)
statistic(s[1:m], s[-(1:m)])
}
Il test di permutazione viene eseguito innanzitutto trovando la statistica per i dati effettivi (si presume che qui siano memorizzati in due array control
e treatment
) e quindi trovando le statistiche per molte permutazioni casuali indipendenti di essi:
z <- stat(control, treatment) # Test statistic for the observed data
sim<- sapply(1:1e4, f, sample=c(control,treatment), m=length(control), statistic=diff.means)
Ora calcola la stima binomiale del valore p e un intervallo di confidenza per esso. Un metodo utilizza la binconf
procedura integrata nel HMisc
pacchetto:
require(Hmisc) # Exports `binconf`
k <- sum(abs(sim) >= abs(z)) # Two-tailed test
zapsmall(binconf(k, length(sim), method='exact')) # 95% CI by default
Non è una cattiva idea confrontare il risultato con un altro test, anche se è risaputo che non è del tutto applicabile: almeno potresti avere un senso dell'ordine di grandezza di dove dovrebbe trovarsi il risultato. In questo esempio (di mezzi di confronto), un test t di Student di solito dà comunque un buon risultato:
t.test(treatment, control)
Questa architettura è illustrata in una situazione più complessa, con R
codice funzionante , in Test se le variabili seguono la stessa distribuzione .
Esempio
100201.5
set.seed(17)
control <- rnorm(10)
treatment <- rnorm(20, 1.5)
Dopo aver utilizzato il codice precedente per eseguire un test di permutazione, ho tracciato il campione della distribuzione di permutazione insieme a una linea rossa verticale per contrassegnare la statistica effettiva:
h <- hist(c(z, sim), plot=FALSE)
hist(sim, breaks=h$breaks)
abline(v = stat(control, treatment), col="Red")
Il calcolo del limite di confidenza binomiale ha comportato
PointEst Lower Upper
0 0 0.0003688199
00,000373.16e-05
0,000370,000370.050.010.001
Commenti
KN k / N( k + 1 ) / ( N+ 1 )N
10102= 1000.0000051.611.7parti per milione: un po 'più piccolo del test t di Student riportato. Sebbene i dati siano stati generati con normali generatori di numeri casuali, il che giustificherebbe l'uso del test t di Student, i risultati del test di permutazione differiscono dai risultati del test t di Student perché le distribuzioni all'interno di ciascun gruppo di osservazioni non sono perfettamente normali.
a.random
b.random
b.random
a.random
coding
lncrna