Intervallo di previsione Bootstrap


29

È disponibile una tecnica bootstrap per calcolare gli intervalli di previsione per le previsioni dei punti ottenute ad esempio dalla regressione lineare o altro metodo di regressione (k-vicino più vicino, alberi di regressione ecc.)?

In qualche modo ritengo che il modo a volte proposto di avviare semplicemente la previsione del punto (vedi ad es. Intervalli di previsione per la regressione di kNN ) non fornisca un intervallo di predizione ma un intervallo di confidenza.

Un esempio in R

# STEP 1: GENERATE DATA

set.seed(34345)

n <- 100 
x <- runif(n)
y <- 1 + 0.2*x + rnorm(n)
data <- data.frame(x, y)


# STEP 2: COMPUTE CLASSIC 95%-PREDICTION INTERVAL
fit <- lm(y ~ x)
plot(fit) # not shown but looks fine with respect to all relevant aspects

# Classic prediction interval based on standard error of forecast
predict(fit, list(x = 0.1), interval = "p")
# -0.6588168 3.093755

# Classic confidence interval based on standard error of estimation
predict(fit, list(x = 0.1), interval = "c")
# 0.893388 1.54155


# STEP 3: NOW BY BOOTSTRAP
B <- 1000
pred <- numeric(B)
for (i in 1:B) {
  boot <- sample(n, n, replace = TRUE)
  fit.b <- lm(y ~ x, data = data[boot,])
  pred[i] <- predict(fit.b, list(x = 0.1))
}
quantile(pred, c(0.025, 0.975))
# 0.8699302 1.5399179

Ovviamente, l'intervallo di avvio del 95% di base corrisponde all'intervallo di confidenza del 95%, non all'intervallo di previsione del 95%. Quindi la mia domanda: come farlo correttamente?


Almeno nel caso dei minimi quadrati ordinari, avrai bisogno di qualcosa di più di semplici previsioni puntuali; si desidera utilizzare anche l'errore residuo stimato per costruire anche intervalli di previsione.
Kodiologo,


@duplo: grazie per averlo segnalato. La lunghezza corretta degli intervalli di predizione classici si basa direttamente sull'assunzione della normalità del termine di errore, quindi se è troppo ottimista, allora anche la versione con bootstrap sarà sicuramente derivata da lì. Mi chiedo se ci sia in generale un metodo bootstrap che funzioni in regressione (non necessariamente OLS).
Michael M,

1
Penso che \ textit {inferenza conforme} potrebbe essere quello che vuoi, il che ti consente di costruire intervalli di previsione basati sul ricampionamento che hanno una copertura del campione finita valida e non coprono troppo. C'è un buon documento disponibile su arxiv.org/pdf/1604.04173.pdf , che è possibile leggere come introduzione all'argomento, e un pacchetto R che è disponibile da github.com/ryantibs/conformal .
Simon Boge Brant,

Risposte:


26

Il metodo illustrato di seguito è quello descritto nella Sezione 6.3.3 di Davidson e Hinckley (1997), Metodi Bootstrap e loro applicazione . Grazie a Glen_b e al suo commento qui . Dato che c'erano diverse domande su Cross Validated su questo argomento, ho pensato che valesse la pena scrivere.

Il modello di regressione lineare è:

Yi=Xiβ+ϵi

Abbiamo i dati, , che usiamo per stimare la come: ß ß OLSi=1,2,,Nβ

β^OLS=(XX)1XY

Ora, vogliamo prevedere quale sarà per un nuovo punto dati, dato che conosciamo per questo. Questo è il problema di previsione. Chiamiamo la nuova (che conosciamo) e la nuova (che vorremmo prevedere), . La previsione abituale (se stiamo assumendo che sia iid e non correlato a ) è: X X X N + 1 Y Y N + 1 ϵ i X Y p N + 1YXXXN+1YYN+1ϵiX

YN+1p=XN+1β^OLS

L'errore di previsione fatto da questa previsione è:

eN+1p=YN+1YN+1p

Possiamo riscrivere questa equazione come:

YN+1=YN+1p+eN+1p

Ora, abbiamo già calcolato. Quindi, se vogliamo legare in un intervallo, diciamo, il 90% delle volte, tutto ciò che dobbiamo fare è stimare coerentemente i e percentili / quantili di , chiamali e l'intervallo di previsione sarà . Y N + 1 5 t h 95 t h e p N + 1 e 5 , e 95 [ Y p N + 1 + e 5 , Y p N + 1 + e 95 ]YN+1pYN+15th95theN+1pe5,e95[YN+1p+e5,YN+1p+e95]

Come stimare i quantili / percentili di ? Bene, possiamo scrivere: e p N + 1eN+1p

eN+1p=YN+1YN+1p=XN+1β+ϵN+1XN+1β^OLS=XN+1(ββ^OLS)+ϵN+1

La strategia sarà quella di campionare (in un modo bootstrap) molte volte da e quindi calcolare i percentili nel solito modo. Quindi, forse campioneremo 10.000 volte da , e quindi stimeremo i percentili e come i membri e più piccoli di il campione. e p N + 1 5 t h 95 t h 500 t h 9 , 500 t heN+1peN+1p5th95th500th9,500th

Per attingere a , possiamo avviare gli errori di bootstrap (anche i casi andrebbero bene, ma supponiamo che errori comunque). Quindi, su ogni replica bootstrap, si disegna volte con la sostituzione dai residui adattati alla varianza (vedere il paragrafo successivo) per ottenere , quindi creare un nuovo , quindi esegui OLS sul nuovo set di dati, per ottenere questa replica . Alla fine, il sorteggio di questa replica su è N ε * i Y * i = X i β OLS + ε * i ( Y * , X ) β * r X N + 1 ( β - β OLS ) X N + 1 ( β OLS - β * rXN+1(ββ^OLS)NϵiYi=Xiβ^OLS+ϵi(Y,X)βrXN+1(ββ^OLS)XN+1(β^OLSβr)

Dato che stiamo assumendo iid , il modo naturale di campionare dalla parte dell'equazione è utilizzare i residui che abbiamo dalla regressione, . I residui hanno varianze diverse e generalmente troppo piccole, quindi vorremmo campionare da , i residui corretti dalla varianza, dove e è l' leva dell'osservazione .ϵ N + 1 { e 1 , e 2 , , e N } { s 1 - ¯ s , s 2 - ¯ s , ... , s N - ¯ s } s i = e i / ϵϵN+1{e1,e2,,eN}{s1s¯,s2s¯,,sNs¯} hiisi=ei/(1hi)hii

E, infine, l'algoritmo per fare un intervallo di previsione del 90% per , dato che è è: X X N + 1YN+1XXN+1

  1. Fai la previsione .YN+1p=XN+1β^OLS
  2. Crea i residui aggiustati per la varianza, , dove . s i = e i / {S1-S¯,S2-S¯,...,SN-S¯}Sio=eio/(1-hio)
  3. Per repliche : r=1,2,...,R
    • Disegna volte sui residui corretti per creare residui bootstrap N{ε1*,ε2*,...,εN*}
    • Genera bootstrapY*=Xβ^OLS+ε*
    • Calcola lo stimatore OLS bootstrap per questa replica, βr*=(X'X)-1X'Y*
    • Ottieni i residui del bootstrap da questa replica,er*=Y*-Xβr*
    • Calcola i residui adattati alla varianza del bootstrap da questa replica,S*-S*¯
    • Disegna uno dei residui adattati alla varianza del bootstrap da questa replica,εN+1,r*
    • Calcola il disegno di questa replica su ,eN+1perp*=XN+1(β^OLS-βr*)+εN+1,r*
  4. Trova percentili e di ,5th95theN+1pe5,e95
  5. L'intervallo di previsione del 90% per è .[ Y p N + 1 + e 5 , Y p N + 1 + e 95 ]YN+1[YN+1p+e5,YN+1p+e95]

Ecco il Rcodice:

# This script gives an example of the procedure to construct a prediction interval
# for a linear regression model using a bootstrap method.  The method is the one
# described in Section 6.3.3 of Davidson and Hinckley (1997),
# _Bootstrap Methods and Their Application_.


#rm(list=ls())
set.seed(12344321)
library(MASS)
library(Hmisc)

# Generate bivariate regression data
x <- runif(n=100,min=0,max=100)
y <- 1 + x + (rexp(n=100,rate=0.25)-4)

my.reg <- lm(y~x)
summary(my.reg)

# Predict y for x=78:
y.p <- coef(my.reg)["(Intercept)"] + coef(my.reg)["x"]*78
y.p

# Create adjusted residuals
leverage <- influence(my.reg)$hat
my.s.resid <- residuals(my.reg)/sqrt(1-leverage)
my.s.resid <- my.s.resid - mean(my.s.resid)


reg <- my.reg
s <- my.s.resid

the.replication <- function(reg,s,x_Np1=0){
  # Make bootstrap residuals
  ep.star <- sample(s,size=length(reg$residuals),replace=TRUE)

  # Make bootstrap Y
  y.star <- fitted(reg)+ep.star

  # Do bootstrap regression
  x <- model.frame(reg)[,2]
  bs.reg <- lm(y.star~x)

  # Create bootstrapped adjusted residuals
  bs.lev <- influence(bs.reg)$hat
  bs.s   <- residuals(bs.reg)/sqrt(1-bs.lev)
  bs.s   <- bs.s - mean(bs.s)

  # Calculate draw on prediction error
  xb.xb <- coef(my.reg)["(Intercept)"] - coef(bs.reg)["(Intercept)"] 
  xb.xb <- xb.xb + (coef(my.reg)["x"] - coef(bs.reg)["x"])*x_Np1
  return(unname(xb.xb + sample(bs.s,size=1)))
}

# Do bootstrap with 10,000 replications
ep.draws <- replicate(n=10000,the.replication(reg=my.reg,s=my.s.resid,x_Np1=78))

# Create prediction interval
y.p+quantile(ep.draws,probs=c(0.05,0.95))

# prediction interval using normal assumption
predict(my.reg,newdata=data.frame(x=78),interval="prediction",level=0.90)


# Quick and dirty Monte Carlo to see which prediction interval is better
# That is, what are the 5th and 95th percentiles of Y_{N+1}
# 
# To do it properly, I guess we would want to do the whole procedure above
# 10,000 times and then see what percentage of the time each prediction 
# interval covered Y_{N+1}

y.np1 <- 1 + 78 + (rexp(n=10000,rate=0.25)-4)
quantile(y.np1,probs=c(0.05,0.95))

Grazie per le spiegazioni utili e dettagliate. Seguendo queste linee, penso che una tecnica generale al di fuori di OLS (tecniche basate sugli alberi, vicino più vicino ecc.) Non sarà facilmente disponibile, giusto?
Michael M,

1
Ce n'è uno per le foreste casuali: stats.stackexchange.com/questions/49750/… che sembra simile.
Bill

Per quanto ne so, se si estrae in , questa tecnica funziona per qualsiasi modello. f ( X , θ )Xβf(X,θ)
Shadowtalker

Come si generalizzano i "residui adattati alla varianza" - l'approccio OLS si basa sull'effetto leva - esiste un calcolo dell'effetto leva per uno stimatore f (X) arbitrario?
David Waterworth,
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.