Metodi di ricampionamento / simulazione: monte carlo, bootstrap, jackknifing, cross-validation, test di randomizzazione e test di permutazione


75

Sto cercando di comprendere la differenza tra i diversi metodi di ricampionamento (simulazione Monte Carlo, bootstrap parametrico, bootstrap non parametrico, jackknifing, cross-validation, test di randomizzazione e test di permutazione) e la loro implementazione nel mio contesto usando R.

Supponiamo che io abbia la seguente situazione: voglio eseguire ANOVA con una variabile Y ( Yvar) e una variabile X ( Xvar). Xvarè categorico. Sono interessato alle seguenti cose:

(1) Significato dei valori p - tasso di scoperta falso

(2) dimensione dell'effetto dei Xvarlivelli

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
Xvar <- c(rep("A", 5),  rep("B", 5),    rep("C", 5))
mydf <- data.frame (Yvar, Xvar)

Potresti gelificarmi per spiegare le differenze di campionamento con esempi espliciti di come funziona questo metodo di ricampionamento?

Modifiche: ecco i miei tentativi:

Bootstrap 10 campioni bootstrap, numero campione di campioni con sostituzione, significa che i campioni possono essere ripetuti

boot.samples <- list()
for(i in 1:10) {
   t.xvar <- Xvar[ sample(length(Xvar), length(Xvar), replace=TRUE) ]
   t.yvar <- Yvar[ sample(length(Yvar), length(Yvar), replace=TRUE) ]
   b.df <- data.frame (t.xvar, t.yvar) 
   boot.samples[[i]] <- b.df 
}
str(boot.samples)
 boot.samples[1]

Permutazione: 10 campioni di permutazione, numero campione di campioni senza sostituzione

 permt.samples <- list()
    for(i in 1:10) {
       t.xvar <- Xvar[ sample(length(Xvar), length(Xvar), replace=FALSE) ]
       t.yvar <- Yvar[ sample(length(Yvar), length(Yvar), replace=FALSE) ]
       b.df <- data.frame (t.xvar, t.yvar) 
       permt.samples[[i]] <- b.df 
    }
    str(permt.samples)
    permt.samples[1]

Simulazione Monte Caro

Sebbene il termine "ricampionamento" sia spesso usato per riferirsi a qualsiasi simulazione ripetuta di campionamento casuale o pseudocasuale, quando il "ricampionamento" viene eseguito da una distribuzione teorica nota, il termine corretto è la simulazione "Monte Carlo".

Non sono sicuro di tutti i termini di cui sopra e se le mie modifiche di cui sopra sono corrette. Ho trovato alcune informazioni su Jacknife ma non sono riuscito a domarlo alla mia situazione.


3
Jackknife è un predecessore più semplice del bootstrap. en.wikipedia.org/wiki/Jackknife_(statistics)
EngrStudent

4
Più precisamente: jackknife è un ricampionamento senza licenza [ma non utilizzato per la validazione incrociata]
cbeleites

Risposte:


123

Possiamo trovare diversi metodi di ricampionamento , o vagamente chiamati metodi di " simulazione ", che dipendono dal ricampionamento o dal mescolamento dei campioni. Potrebbero esserci differenze nelle opinioni rispetto alla terminologia corretta, ma la seguente discussione cerca di generalizzare e semplificare ciò che è disponibile nella letteratura appropriata:

I metodi di ricampionamento sono usati per (1) stimare la precisione / accuratezza delle statistiche del campione attraverso l'uso di un sottoinsieme di dati (ad esempio Jackknifing) o disegnare in modo casuale con la sostituzione da una serie di punti di dati (ad esempio bootstrap) (2) Scambiare etichette su punti di dati quando si esegue un significato test ( test di permutazione, chiamati anche test esatti, test di randomizzazione o test di ri-randomizzazione) (3) Convalida dei modelli utilizzando sottoinsiemi casuali (bootstrap, cross validation) (vedi Wikipedia: metodi di ricampionamento )

BOOTSTRAPING

"Il bootstrap è un metodo statistico per stimare la distribuzione campionaria di uno stimatore campionando con la sostituzione dal campione originale". Il metodo assegna misure di accuratezza (definite in termini di distorsione , varianza , intervalli di confidenza , errore di previsione o qualche altra misura di questo tipo) per stimare le stime.

L'idea di base del bootstrap è che l'inferenza su una popolazione dai dati del campione ( campione → popolazione ) può essere modellata ricampionando i dati del campione ed eseguendo l'inferenza su (ricampionare → campione). Poiché la popolazione è sconosciuta, il vero errore in una statistica campione rispetto al suo valore di popolazione è inconoscibile. Nei bootstrap-resamples, la "popolazione" è in effetti il ​​campione, e questo è noto; quindi la qualità dell'inferenza dai dati di ricampionamento → campione 'vero' è misurabile. "vedi Wikipedia

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)

#To generate a single bootstrap sample
sample(Yvar, replace = TRUE) 

 #generate 1000 bootstrap samples
boot <-list()
for (i in 1:1000) 
   boot[[i]] <- sample(Yvar,replace=TRUE)

In problemi univariati, di solito è accettabile ricampionare le singole osservazioni con la sostituzione ("ricampionamento del caso"). Qui ricampioniamo i dati con la sostituzione e la dimensione del ricampionamento deve essere uguale alla dimensione del set di dati originale.

Nei problemi di regressione, il ricampionamento dei casi si riferisce al semplice schema di ricampionamento dei singoli casi - spesso righe di un set di dati in problemi di regressione, le variabili esplicative sono spesso fisse, o almeno osservate con più controllo rispetto alla variabile di risposta. Inoltre, l'intervallo delle variabili esplicative definisce le informazioni disponibili da esse. Pertanto, ricampionare i casi significa che ogni campione di bootstrap perderà alcune informazioni (vedi Wikipedia ). Quindi sarà logico campionare le righe dei dati piuttosto semplicemente Yvar.

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
Xvar <- c(rep("A", 5),  rep("B", 5),    rep("C", 5))
mydf <- data.frame (Yvar, Xvar)    

boot.samples <- list()
for(i in 1:10) {
   b.samples.cases <- sample(length(Xvar), length(Xvar), replace=TRUE) 
   b.mydf <- mydf[b.samples.cases,] 
   boot.samples[[i]] <- b.mydf
}
str(boot.samples)
 boot.samples[1]

Puoi vedere alcuni casi ripetuti mentre stiamo campionando con la sostituzione.

" Bootstrap parametrico : un modello parametrico viene adattato ai dati, spesso con la massima probabilità, e campioni di numeri casuali vengono estratti da questo modello adattato . Di solito il campione prelevato ha le stesse dimensioni del campione dei dati originali. Quindi la quantità o la stima , di interesse viene calcolato da questi dati. Questo processo di campionamento viene ripetuto più volte come per altri metodi bootstrap. L'uso di un modello parametrico nella fase di campionamento della metodologia bootstrap porta a procedure diverse da quelle ottenute applicando la teoria statistica di base per dedurre lo stesso modello. "(vedi Wikipedia ). Di seguito è riportato il bootstrap parametrico con assunzione della distribuzione normale con parametri di deviazione media e standard.

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)

# parameters for Yvar 
mean.y <- mean(Yvar)
sd.y <- sd(Yvar)

#To generate a single bootstrap sample with assumed normal distribution (mean, sd)
rnorm(length(Yvar), mean.y, sd.y)

 #generate 1000 bootstrap samples
boot <-list()
for (i in 1:1000) 
   boot[[i]] <- rnorm(length(Yvar), mean.y, sd.y)

Esistono altre varianti di bootstrap, consulta la pagina di Wikipedia o qualsiasi buon libro statistico sul ricampionamento.

Jacknife

"Lo stimatore jackknife di un parametro si trova tralasciando sistematicamente ogni osservazione da un set di dati e calcolando la stima e quindi trovando la media di questi calcoli. Dato un campione di dimensione N, la stima jackknife si trova aggregando le stime di ogni N − 1stima nel campione ". vedi: wikipedia Quanto segue mostra come jackknife il Yvar.

jackdf <- list()
jack <- numeric(length(Yvar)-1)

for (i in 1:length (Yvar)){

for (j in 1:length(Yvar)){
     if(j < i){ 
            jack[j] <- Yvar[j]
}  else if(j > i) { 
             jack[j-1] <- Yvar[j]
}
}
jackdf[[i]] <- jack
}
jackdf

"il bootstrap regolare e il jackknife, stimano la variabilità di una statistica dalla variabilità di quella statistica tra i sottocampioni, piuttosto che dai presupposti parametrici . Per il jackknife più generale, il jackknife osservazioni delete-m, il bootstrap può essere visto come un caso approssimazione. Entrambi producono risultati numerici simili, motivo per cui ognuno può essere visto come approssimazione all'altro. " Vedi questa domanda su Bootstrap vs Jacknife.

PROVE DI RANDOMIZZAZIONE

"Nei test parametrici campioniamo casualmente da una o più popolazioni. Facciamo alcune ipotesi su quelle popolazioni, più comunemente che sono normalmente distribuite con varianze uguali. Stabiliamo un'ipotesi nulla che è inquadrata in termini di parametri, spesso nella forma m1 -m2 = 0. Utilizziamo le nostre statistiche di esempio come stime dei corrispondenti parametri della popolazione e calcoliamo una statistica di test (come nel test) Ad esempio: nel test t di Student per le differenze nelle medie quando le varianze sono sconosciute, ma sono considerate essere uguali. L'ipotesi di interesse è quella H0: m1 = m2. Una delle ipotesi alternative sarebbe dichiarata come:HA: m1 < m2. Dati due campioni prelevati dalle popolazioni 1 e 2, supponendo che si tratti di popolazioni normalmente distribuite con varianze uguali e che i campioni siano stati estratti in modo indipendente e casuale da ciascuna popolazione, è possibile elaborare una statistica la cui distribuzione è nota per testare H0.

Un modo per evitare queste ipotesi distributive è stato l'approccio ora chiamato statistiche non parametriche, di ordine di rango, di ordine di rango e libere di distribuzione. Queste statistiche prive di distribuzione sono generalmente criticate per essere meno "efficienti" rispetto al test analogo basato sul presupposto che le popolazioni siano normalmente distribuite.

Un altro approccio alternativo è l'approccio di randomizzazione - "processo di assegnazione casuale di ranghi ad osservazioni indipendenti dalla propria conoscenza di quale campione un'osservazione è un membro. Un test di randomizzazione si avvale di tale procedura, ma lo fa operando sulle osservazioni anziché sull'articolazione classifica delle osservazioni. Per questo motivo, la distribuzione di una statistica analoga (la somma delle osservazioni in un campione) non può essere facilmente tabulata, sebbene sia teoricamente possibile enumerare tale distribuzione "( vedi )

I test di randomizzazione differiscono dai test parametrici per quasi tutti gli aspetti. (1) Non è necessario disporre di campioni casuali da una o più popolazioni, in effetti di solito non abbiamo effettuato il campionamento casuale. (2) Raramente pensiamo in termini di popolazioni da cui provengono i dati, e non è necessario assumere nulla sulla normalità o l'omoscedasticità (3) La nostra ipotesi nulla non ha nulla a che fare con i parametri, ma è formulata in modo piuttosto vago, come, per esempio, l'ipotesi che il trattamento non abbia alcun effetto sul rendimento dei partecipanti. (4) Poiché non ci occupiamo delle popolazioni, non ci occupiamo di stimare (o addirittura testare) le caratteristiche di quelle popolazioni (5) una sorta di statistica di prova, tuttavia non confrontiamo tale statistica con le distribuzioni presentate. Anziché, lo confrontiamo con i risultati ottenuti quando randomizziamo ripetutamente i dati tra i gruppi e calcoliamo la statistica corrispondente per ogni randomizzazione. (6) Ancor più dei test parametrici, i test di randomizzazione sottolineano l'importanza dell'assegnazione casuale dei partecipanti ai trattamenti. "vedi .

Il tipo di test di randomizzazione che è molto popolare è il test di permutazione. Se la dimensione del nostro campione è 12 e 5, la permutazione totale possibile è C(12,5) = 792. Se le dimensioni dei nostri campioni fossero 10 e 15, sarebbero stati possibili oltre 3,2 milioni di arrangiamenti. Questa è la sfida informatica: che cosa succede allora? Campione . Quando l'universo delle possibili disposizioni è troppo grande per essere enumerato, perché non campionare le disposizioni di questo universo in modo indipendente e casuale? La distribuzione della statistica del test su questa serie di campioni può quindi essere tabulata, calcolata la sua media e varianza e stimato il tasso di errore associato a un test di ipotesi.

TEST DI PERMUTAZIONE

Secondo wikipedia "Un test di permutazione (chiamato anche test di randomizzazione , test di ri-randomizzazione o test esatto ) è un tipo di test di significatività statistica in cui si ottiene la distribuzione della statistica test sotto l'ipotesi nulla calcolando tutti i possibili valori della statistica test sotto riarrangiamenti delle etichette sui punti dati osservati. Esistono test di permutazione per qualsiasi statistica test, indipendentemente dal fatto che sia nota o meno la sua distribuzione. Pertanto, si è sempre liberi di scegliere la statistica che meglio discrimina tra ipotesi e alternativa e che minimizza le perdite ".

La differenza tra permutazione e bootstrap sta nel fatto che bootstrap campiona con sostituzione e permutazioni campionano senza sostituzione . In entrambi i casi, si perde l'ordine temporale delle osservazioni e quindi si perde il clustering di volatilità , garantendo così che i campioni siano sotto l'ipotesi nulla di nessun cluster di volatilità.

Le permutazioni hanno sempre tutte le stesse osservazioni, quindi sono più simili ai dati originali che ai campioni bootstrap. L'aspettativa è che il test di permutazione sia più sensibile di un test bootstrap. Le permutazioni distruggono il clustering di volatilità ma non aggiungono altra variabilità .

Vedi la domanda sulla permutazione vs il bootstrap - "Il test di permutazione è il migliore per testare le ipotesi e il bootstrap è il migliore per stimare gli intervalli di confidenza ".

Quindi, per eseguire la permutazione in questo caso, possiamo semplicemente cambiare replace = FALSEnell'esempio di bootstrap sopra.

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
     #generate 1000 bootstrap samples
       permutes <-list()
    for (i in 1:1000) 
       permutes[[i]] <- sample(Yvar,replace=FALSE)

In caso di più di una variabile, il solo prelievo delle righe e il rimescolamento dell'ordine non faranno alcuna differenza poiché i dati rimarranno gli stessi. Quindi rimpasto la variabile y. Qualcosa che hai fatto, ma non credo che non abbiamo bisogno di un doppio rimescolamento di entrambi xe y variables(come hai fatto).

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
Xvar <- c(rep("A", 5),  rep("B", 5),    rep("C", 5))
mydf <- data.frame (Yvar, Xvar)

 permt.samples <- list()
    for(i in 1:10) {
       t.yvar <- Yvar[ sample(length(Yvar), length(Yvar), replace=FALSE) ]
       b.df <- data.frame (Xvar, t.yvar) 
       permt.samples[[i]] <- b.df 
    }
    str(permt.samples)
    permt.samples[1]

METODI DI MONTE CARLO

"I metodi Monte Carlo (o esperimenti Monte Carlo) sono un'ampia classe di algoritmi computazionali che si basano su ripetuti campionamenti casuali per ottenere risultati numerici; in genere si eseguono simulazioni più volte per ottenere la distribuzione di un'entità probabilistica sconosciuta. Il nome deriva dalla somiglianza della tecnica all'atto di giocare e registrare i risultati in un vero casinò. "Vedi Wikipedia

"Nelle statistiche applicate, i metodi Monte Carlo sono generalmente utilizzati per due scopi:

(1) Per confrontare le statistiche concorrenti per piccoli campioni in condizioni di dati realistici. Sebbene l'errore di tipo I e le proprietà di potenza delle statistiche possano essere calcolati per i dati ricavati dalle classiche distribuzioni teoriche (ad esempio, curva normale, distribuzione di Cauchy) per condizioni asintotiche (cioè, dimensione del campione infinita ed effetto di trattamento infinitamente piccolo), i dati reali spesso lo fanno non avere tali distribuzioni.

(2) Fornire implementazioni di test di ipotesi più efficienti di test esatti come test di permutazione (che sono spesso impossibili da calcolare) pur essendo più accurati dei valori critici per le distribuzioni asintotiche.

I metodi Monte Carlo sono anche un compromesso tra randomizzazione approssimativa e test di permutazione . Un test di randomizzazione approssimativo si basa su un sottoinsieme specificato di tutte le permutazioni (che comporta un servizio di pulizie potenzialmente enorme di cui sono state prese in considerazione le permutazioni). L'approccio Monte Carlo si basa su un numero specificato di permutazioni disegnate casualmente ( scambiando una perdita minore in precisione se una permutazione viene disegnata due volte - o più frequentemente - per l'efficienza di non dover tracciare quali permutazioni sono già state selezionate ). "

Sia il test MC che il test di permutazione sono talvolta chiamati collettivamente test di randomizzazione . La differenza è in MC che campioniamo i campioni di permutazione, piuttosto usando tutte le possibili combinazioni vedi .

CONVALIDA INCROCIATA

L'idea oltre la convalida incrociata è che i modelli dovrebbero essere testati con dati che non sono stati utilizzati per adattarsi al modello. La convalida incrociata è forse più spesso utilizzata nel contesto della previsione .

"La convalida incrociata è un metodo statistico per la convalida di un modello predittivo. I sottoinsiemi dei dati sono considerati come set di convalida ; un modello è adatto ai dati rimanenti (un set di addestramento) e utilizzato per prevedere il set di convalida. Media la qualità delle previsioni nei set di convalida produce una misura complessiva dell'accuratezza della previsione.

Una forma di validazione incrociata lascia fuori una singola osservazione alla volta; questo è simile al coltello a serramanico. Un altro, K-fold cross-validation, divide i dati in K sottoinsiemi; ciascuno è tenuto a turno come set di convalida. "vedi Wikipedia . La convalida incrociata di solito viene eseguita con dati quantitativi. Puoi in qualche modo convertire i tuoi dati qualitativi (dati fattoriali) in quantitativi per adattarli a un modello lineare e testare questo modello. Quanto segue è semplice strategia di controllo in cui il 50% dei dati viene utilizzato per la previsione del modello mentre il resto viene utilizzato per i test. Supponiamo che Xvarsia anche una variabile quantitativa.

    Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
    Xvar <- c(rep(1, 5),  rep(2, 5),    rep(3, 5))
    mydf <- data.frame (Yvar, Xvar)
    training.id <- sample(1:nrow(mydf), round(nrow(mydf)/2,0), replace = FALSE)
    test.id <- setdiff(1:nrow(mydf), training.id)
   # training dataset 
    mydf.train <- mydf[training.id]

    #testing dataset 
    mydf.test <- mydf[test.id]

A differenza dei bootstrap e dei test di permutazione, il set di dati di convalida incrociata per addestramento e test è diverso. La figura seguente mostra un riepilogo del ricampionamento in diversi metodi.

inserisci qui la descrizione dell'immagine

Spero che questo aiuti un po '.


23
Questo è impressionante - e specialmente così, dato che è la tua prima risposta! Spero che tu continui a partecipare qui e attendo con impazienza i tuoi futuri contributi al nostro sito.
whuber

Questa risposta è così GRANDE una risposta globale. Tuttavia, alcuni dei collegamenti sembrano essere abbandonati. Qualcuno ha la minima idea di dove siano i collegamenti?
tintinthong

8

Ecco il mio contributo.

Dati

Yvar <- c(8,9,10,13,12,
          14,18,12,8,9,
          1,3,2,3,4)
Xvar <- rep(LETTERS[1:3], each=5)
mydf <- data.frame(Yvar, Xvar)

Monte Carlo

Vedo Monte Carlo come un metodo per ottenere una distribuzione di una variabile casuale (risultato), che è il risultato di una funzione non banale di altre variabili casuali (input). Non vedo immediatamente una sovrapposizione con l'attuale analisi ANOVA, probabilmente altri membri del forum possono dare il loro contributo qui.

bootstrapping

Lo scopo è di avere un'idea dell'incertezza di una statistica calcolata da un campione osservato. Ad esempio: possiamo calcolare che la media campionaria di Yvar è 8.4, ma quanto siamo certi della media della popolazione per Yvar? Il trucco è fare come se il campione fosse la popolazione e campionare molte volte da quella popolazione falsa.

n <- 1000
bootstrap_means <- numeric(length=n)
for(i in 1:n){
   bootstrap_sample <- sample(x=Yvar, size=length(Yvar), replace=TRUE)
   bootstrap_means[i] <- mean(bootstrap_sample)
}
hist(bootstrap_means)

Abbiamo appena preso campioni e non abbiamo assunto alcuna distribuzione parametrica. Questo è il bootstrap non parametrico . Se ti sentissi a tuo agio nel supporre che Xvar fosse normalmente distribuito, puoi anche campionare da una distribuzione normale ( rnorm(...)) usando la media stimata e la deviazione standard, questo sarebbe il bootstrap parametrico .

Altri utenti potrebbero forse fornire applicazioni del bootstrap rispetto alle dimensioni degli effetti dei Xvarlivelli?

jackknifing

Il coltellino sembra essere un po 'datato. Solo per completezza, potresti confrontarlo più o meno con il bootstrap, ma la strategia è qui per vedere cosa succede se tralasciamo un'osservazione (e ripeterlo per ogni osservazione).

Convalida incrociata

Nella convalida incrociata, dividere il set di dati (di solito di grandi dimensioni) in un set di addestramento e in un set di convalida, per vedere in che modo il modello stimato è in grado di prevedere i valori nel set di convalida. Personalmente non ho ancora visto un'applicazione di convalida incrociata per ANOVA, quindi preferisco lasciare questa parte ad altri.

Test di randomizzazione / permutazione

Attenzione, la terminologia non è concordata. Vedi Differenza tra test di randomizzazione e test di permutazione .

L'ipotesi nulla sarebbe che non vi sia alcuna differenza tra le popolazioni dei gruppi A, B e C, quindi non dovrebbe importare se scambiamo casualmente le etichette dei 15 valori di Xvar. Se il valore F originariamente osservato (o un'altra statistica) non concorda con quelli ottenuti dopo lo scambio casuale di etichette, probabilmente ha avuto importanza e l'ipotesi nulla può essere respinta.

observed_F_value <- anova(lm(Yvar ~ Xvar))$"F value"[1]

n <- 10000
permutation_F_values <- numeric(length=n)

for(i in 1:n){
   # note: the sample function without extra parameters defaults to a permutation
   temp_fit <- anova(lm(Yvar ~ sample(Xvar)))
   permutation_F_values[i] <- temp_fit$"F value"[1]
}

hist(permutation_F_values, xlim=range(c(observed_F_value, permutation_F_values)))
abline(v=observed_F_value, lwd=3, col="red")
cat("P value: ", sum(permutation_F_values >= observed_F_value), "/", n, "\n", sep="")

istogramma

Fai attenzione a come riassegni le etichette nel caso di disegni complessi. Si noti inoltre che nel caso di varianze disuguali, l'ipotesi nulla di scambiabilità non è vera in primo luogo, quindi questo test di permutazione non sarebbe corretto.

Qui non abbiamo esaminato esplicitamente tutte le possibili permutazioni delle etichette, questa è una stima di Monte Carlo del valore P. Con piccoli set di dati è possibile passare attraverso tutte le possibili permutazioni, ma il codice R sopra è un po 'più facile da capire.

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.