Intervalo de predicción de Bootstrap

29

¿Existe alguna técnica de arranque disponible para calcular los intervalos de predicción para predicciones puntuales obtenidas, por ejemplo, de regresión lineal u otro método de regresión (k-vecino más cercano, árboles de regresión, etc.)?

De alguna manera, siento que la forma a veces propuesta de simplemente reiniciar la predicción de puntos (ver, por ejemplo, Intervalos de predicción para la regresión de kNN ) no es proporcionar un intervalo de predicción sino un intervalo de confianza.

Un ejemplo en 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

Obviamente, el intervalo de arranque básico del 95% coincide con el intervalo de confianza del 95%, no con el intervalo de predicción del 95%. Entonces mi pregunta: ¿Cómo hacerlo correctamente?

Michael M
fuente
Al menos en el caso de los mínimos cuadrados ordinarios, necesitará más que solo predicciones puntuales; desea utilizar el error residual estimado para construir intervalos de predicción también.
Kodiólogo
@duplo: gracias por señalar esto. La longitud correcta de los intervalos de predicción clásicos se basa directamente en la suposición de normalidad del término de error, por lo que si es demasiado optimista, entonces seguramente también la versión de arranque será si se deriva de allí. Me pregunto si hay en general un método de arranque que funcione en regresión (no necesariamente OLS).
Michael M
1
Creo que \ textit {conformal inference} podría ser lo que desea, lo que le permite construir intervalos de predicción basados ​​en remuestreo que tengan una cobertura de muestra finita válida y no cubra demasiado. Hay un buen documento disponible en arxiv.org/pdf/1604.04173.pdf , que se puede leer como introducción al tema, y ​​un paquete R que está disponible en github.com/ryantibs/conformal .
Simon Boge Brant

Respuestas:

26

El método presentado a continuación es el descrito en la Sección 6.3.3 de Davidson y Hinckley (1997), Bootstrap Methods and These Application . Gracias a Glen_b y su comentario aquí . Dado que había varias preguntas sobre Cross Validated sobre este tema, pensé que valía la pena escribirlo.

El modelo de regresión lineal es:

Yi=Xiβ+ϵi

Tenemos datos, , que utilizamos para estimar la β como: beta MCOi=1,2,,Nβ

β^OLS=(XX)1XY

Ahora, queremos predecir qué será para un nuevo punto de datos, dado que conocemos X para él. Este es el problema de predicción. Llamemos a la nueva X (que conocemos) X N + 1 y a la nueva Y (que nos gustaría predecir), Y N + 1 . La predicción habitual (si suponemos que ϵ i es iid y no está correlacionada con X ) es: Y p N + 1YXXXN+1YYN+1ϵiX

YN+1p=XN+1β^OLS

El error de pronóstico realizado por esta predicción es:

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

Podemos reescribir esta ecuación como:

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

Ahora, ya hemos calculado. Entonces, si queremos vincular Y N + 1 en un intervalo, digamos, el 90% del tiempo, todo lo que tenemos que hacer es estimar consistentemente los percentiles / cuantiles de 5 t h y 95 t h de e p N + 1 , llame al ellos e 5 , e 95 , y el intervalo de predicción será [ YYN+1pYN+15th95theN+1pe5,e95.[YN+1p+e5,YN+1p+e95]

¿Cómo estimar los cuantiles / percentiles de ? Bueno, podemos escribir: e p N + 1eN+1p

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

La estrategia será muestrear (en forma de arranque) muchas veces a partir de y luego calcular los percentiles de la manera habitual. Entonces, tal vez muestrearemos 10,000 veces de e p N + 1 , y luego estimaremos los percentiles 5 t h y 95 t h como los 500 t h y 9 , 500 t h miembros más pequeños de la muestra.eN+1peN+1p5th95th500th9,500th

Para dibujar en , podemos iniciarla errores (casos estaría bien, también, pero estamos asumiendo errores iid de todos modos). Así, en cada replicación de inicio, se dibuja N veces con la sustitución de los residuos de la varianza ajustados (véase el siguiente párrafo) para obtener ε * i , a continuación, hacer nuevos Y * i = X i β MCO +XN+1(ββ^OLS)Nϵi , a continuación, ejecutar MCO en el nuevo conjunto de datos, ( Y , X )Yi=Xiβ^OLS+ϵi(Y,X)para obtener esta replicación . En el último, el sorteo de esta replicación en X N + 1 ( β - β OLS ) es X N + 1 ( β OLS - β * r )βrXN+1(ββ^OLS)XN+1(β^OLSβr)

Dado que asumimos iid , la forma natural de tomar muestras de la parte ϵ N + 1 de la ecuación es usar los residuos que tenemos de la regresión, { e 1 , e 2 , ... , e N } . Los residuos tienen variaciones diferentes y generalmente demasiado pequeñas, por lo que tendremos que tomar muestras de { s 1 - ¯ s , s 2 -ϵϵN+1{e1,e2,,eN}{s1s¯,s2s¯,,sNs¯}, los residuos con corrección de varianza, donde yhies el apalancamiento de la observacióni.si=ei/(1hi)hii

Y, finalmente, el algoritmo para hacer un intervalo de predicción del 90% para , dado que X es X N + 1 es:YN+1XXN+1

  1. Hacer la predicción .YN+1p=XN+1β^OLS
  2. {s1s¯,s2s¯,,sNs¯}si=ei/(1hi)
  3. r=1,2,,R
    • N{ϵ1,ϵ2,,ϵN}
    • Generate bootstrap Y=Xβ^OLS+ϵ
    • Calculate bootstrap OLS estimator for this replication, βr=(XX)1XY
    • Obtain bootstrap residuals from this replication, er=YXβr
    • Calculate bootstrap variance-adjusted residuals from this replication, ss¯
    • Draw one of the bootstrap variance-adjusted residuals from this replication, ϵN+1,r
    • Calculate this replication's draw on eN+1p, erp=XN+1(β^OLSβr)+ϵN+1,r
  4. Find 5th and 95th percentiles of eN+1p, e5,e95
  5. 90% prediction interval for YN+1 is [YN+1p+e5,YN+1p+e95].

Here is R code:

# 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))
Bill
fuente
Thank you for the useful, detailed explanations. Following these lines, I think that a general technique outside OLS (tree based techniques, nearest neighbour etc.) wont be easily available, right?
Michael M
1
There is this one for random forests: stats.stackexchange.com/questions/49750/… which sounds similar.
Bill
As far as I can tell, if you abstract Xβ to f(X,θ), this technique works for any model.
shadowtalker
How do you generalise the "variance adjusted residuals" - the OLS approach relies on the leverage - is there a leverage calculation for an arbitrary f(X) estimator?
David Waterworth