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=(X′X)−1X′Y

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+1−YN+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+1−YN+1p=XN+1β+ϵN+1−XN+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ϵi∗Yi∗=Xiβ^OLS+ϵi∗(Y∗,X)βr∗XN+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∗}{s1−s¯,s2−s¯,…,sN−s¯} hiisi=ei∗/(1−hi)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.