Valori P pari a 0 nel test di permutazione


15

Ho due set di dati e vorrei sapere se sono significativamente diversi o no (questo deriva da " Due gruppi sono significativamente diversi? Test da usare ").

Ho deciso di utilizzare un test di permutazione, facendo quanto segue in R:

permutation.test <- function(coding, lncrna) {
    coding <- coding[,1] # dataset1
    lncrna <- lncrna[,1] # dataset2

    ### Under null hyphotesis, both datasets would be the same. So:
    d <- c(coding, lncrna)

    # Observed difference
    diff.observed = mean(coding) - mean(lncrna)
    number_of_permutations = 5000
    diff.random = NULL

    for (i in 1:number_of_permutations) {
        # Sample from the combined dataset
        a.random = sample (d, length(coding), TRUE)
        b.random = sample (d, length(lncrna), TRUE)
        # Null (permuated) difference
        diff.random[i] = mean(b.random) - mean(a.random)
    }

    # P-value is the fraction of how many times the permuted difference is equal or more extreme than the observed difference
    pvalue = sum(abs(diff.random) >= abs(diff.observed)) / number_of_permutations
    pvalue
}

Tuttavia, i valori di p non dovrebbero essere 0 secondo questo documento: http://www.statsci.org/smyth/pubs/permp.pdf

Cosa mi consigliate di fare? È in questo modo per calcolare il valore p:

pvalue = sum(abs(diff.random) >= abs(diff.observed)) / number_of_permutations

un buon modo? O è meglio fare quanto segue?

pvalue = sum(abs(diff.random) >= abs(diff.observed)) + 1 / number_of_permutations + 1

(1) L'ultima riga della domanda è errata perché non include le parentesi necessarie per eseguire il calcolo previsto. (È garantito che produca risultati maggiori di , il che è impossibile per qualsiasi valore p.) (2) In realtà non si sta conducendo un test di permutazione: i due campioni e raramente comprenderanno una partizione casuale dei dati ma in genere si sovrapporranno sostanzialmente. Invece, calcola come complemento all'interno dell'unione di e . 1a.randomb.randomb.randoma.randomcodinglncrna
whuber

Poiché il valore p è l'insieme di valori estremi almeno quanto quello osservato, se si valuta la distribuzione della permutazione, la statistica osservata è nelle "permutazioni" contate. Quando si esegue la randomizzazione, è comune contare la statistica osservata tra le statistiche di permutazione considerate (per motivi simili).
Glen_b

Risposte:


15

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 melementi 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 controle 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 binconfprocedura integrata nel HMiscpacchetto:

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 Rcodice 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")

figura

Il calcolo del limite di confidenza binomiale ha comportato

 PointEst Lower        Upper
        0     0 0.0003688199

00,000373.16e-050,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.


L'articolo di Smyth & Phipson sopra citato mostra chiaramente perché k / N sia una scelta sbagliata per uno stimatore del valore p. In breve, per livelli di significatività rilevanti come alfa = 0,05, P ((k / N) <alfa | H0) può essere sorprendentemente maggiore dell'alfa. Ciò significa che un test di permutazione casuale che utilizza k / N come suo stimatore del valore p e 0,05 come soglia di rifiuto rifiuterà l'ipotesi nulla più del 5% delle volte! Un valore p zero è un caso estremo di questo problema - con un criterio di alfa = 0 ci aspettiamo di non rifiutare mai il nulla, ma b / m può essere uguale a zero sotto il valore nullo, portando a un falso rifiuto.
Trisoloriansunscreen

1
@Tal "Una scelta sbagliata" per uno scopo particolare. Ciò che ci distingue come statistici dagli altri è la nostra comprensione del ruolo della variabilità nell'analisi dei dati e nel processo decisionale, insieme alla nostra capacità di quantificare tale variabilità in modo appropriato. Questo è l'approccio esemplificato (e implicitamente sostenuto) nella mia risposta qui. Quando viene eseguito, non vi è alcun problema come lo descrivi, perché l'utente della procedura di permutazione è portato a comprendere i suoi limiti e i suoi punti di forza e avrà la libertà di agire secondo i suoi obiettivi.
whuber

13

BMB+1M+1

(B è il numero di permutazioni casuali in cui si ottiene una statistica maggiore o uguale a quella osservata e M è il numero totale di permutazioni casuali campionate).

BM


1
+1 Questo è un buon riassunto del punto principale del documento. Apprezzo in particolare la tua attenzione alla distinzione tra un valore p stimato e il valore p reale della permutazione.
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.