Solo un'altra variante che è in qualche modo semplicistica ma penso che recapiti il messaggio senza usare esplicitamente la libreria boot
che potrebbe confondere alcune persone con la sintassi che utilizza.
Abbiamo un modello lineare: ,y= Xβ+ ϵϵ ∼ N( 0 , σ2)
Quello che segue è un bootstrap parametrico per quel modello lineare, ciò significa che non ricampioniamo i nostri dati originali ma in realtà generiamo nuovi dati dal nostro modello adattato. Inoltre supponiamo che la distribuzione bootstrap del coefficiente di regressione sia simmetrica e che sia invariante per la traduzione. (Molto approssimativamente parlando che possiamo spostarne l'asse influenzandone le proprietà) L'idea alla base è che le fluttuazioni negli sono dovute a e quindi con abbastanza campioni dovrebbero fornire una buona approssimazione della vera distribuzione di 's. Come prima nuovo e nostri valori p comeββεβH0: 0 = βj"la probabilità, data un'ipotesi nulla per la distribuzione di probabilità dei dati, che il risultato sarebbe estremo come, o più estremo di, il risultato osservato" (dove i risultati osservati in questo caso sono iche abbiamo ottenuto per il nostro modello originale). Quindi ecco qui:β
# Sample Size
N <- 2^12;
# Linear Model to Boostrap
Model2Boot <- lm( mpg ~ wt + disp, mtcars)
# Values of the model coefficients
Betas <- coefficients(Model2Boot)
# Number of coefficents to test against
M <- length(Betas)
# Matrix of M columns to hold Bootstraping results
BtStrpRes <- matrix( rep(0,M*N), ncol=M)
for (i in 1:N) {
# Simulate data N times from the model we assume be true
# and save the resulting coefficient in the i-th row of BtStrpRes
BtStrpRes[i,] <-coefficients(lm(unlist(simulate(Model2Boot)) ~wt + disp, mtcars))
}
#Get the p-values for coefficient
P_val1 <-mean( abs(BtStrpRes[,1] - mean(BtStrpRes[,1]) )> abs( Betas[1]))
P_val2 <-mean( abs(BtStrpRes[,2] - mean(BtStrpRes[,2]) )> abs( Betas[2]))
P_val3 <-mean( abs(BtStrpRes[,3] - mean(BtStrpRes[,3]) )> abs( Betas[3]))
#and some parametric bootstrap confidence intervals (2.5%, 97.5%)
ConfInt1 <- quantile(BtStrpRes[,1], c(.025, 0.975))
ConfInt2 <- quantile(BtStrpRes[,2], c(.025, 0.975))
ConfInt3 <- quantile(BtStrpRes[,3], c(.025, 0.975))
Come accennato, l'idea è che hai la distribuzione bootstrap di quella approssimativa di quella vera. (Chiaramente questo codice è ottimizzato per la velocità ma per la leggibilità. :))β