Bootstrap-Vorhersageintervall

29

Gibt es eine Bootstrap-Technik, mit der Vorhersageintervalle für Punktvorhersagen berechnet werden können, die z. B. aus einer linearen Regression oder einer anderen Regressionsmethode (k-nächster Nachbar, Regressionsbäume usw.) stammen?

Irgendwie habe ich das Gefühl, dass die manchmal vorgeschlagene Methode, die Punktvorhersage nur zu booten (siehe z. B. Vorhersageintervalle für die kNN-Regression ), kein Vorhersageintervall, sondern ein Konfidenzintervall liefert.

Ein Beispiel 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

Offensichtlich entspricht das 95% -Basis-Bootstrap-Intervall dem 95% -Konfidenzintervall und nicht dem 95% -Vorhersageintervall. Also meine Frage: Wie macht man das richtig?

Michael M
quelle
Zumindest bei gewöhnlichen kleinsten Quadraten benötigen Sie mehr als nur Punktvorhersagen. Sie möchten den geschätzten Restfehler verwenden, um auch Vorhersageintervalle zu erstellen.
Kodiologist
@duplo: danke für den Hinweis. Die korrekte Länge der klassischen Vorhersageintervalle hängt direkt von der Normalitätsannahme des Fehlerterms ab. Wenn es also zu optimistisch ist, wird es mit Sicherheit auch die Bootstrapped-Version sein, wenn es von dort abgeleitet wird. Ich frage mich, ob es im Allgemeinen eine Bootstrap-Methode gibt, die in der Regression arbeitet (nicht unbedingt OLS).
Michael M
1
Ich denke, \ textit {conformal inference} könnte genau das sein, was Sie wollen, wodurch Sie auf Resampling basierende Vorhersageintervalle konstruieren können, die eine gültige Endlichkeitsabdeckung haben und nicht zu viel überdecken. Unter arxiv.org/pdf/1604.04173.pdf ist ein gutes Dokument verfügbar , das als Einführung in das Thema gelesen werden kann, sowie ein R-Paket, das unter github.com/ryantibs/conformal verfügbar ist .
Simon Boge Brant

Antworten:

26

Die nachfolgend beschriebene Methode ist die in Abschnitt 6.3.3 von Davidson und Hinckley (1997), Bootstrap Methods and Their Application beschriebene . Vielen Dank an Glen_b und seinen Kommentar hier . Angesichts der Tatsache, dass es zu diesem Thema mehrere Fragen zu Cross Validated gab, hielt ich es für wert, darüber zu schreiben.

Yi=Xiβ+ϵi

i=1,2,,Nβ

β^OLS=(XX)1XY

YXXXN+1YYN+1ϵiX

YN+1p=XN+1β^OLS

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

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

YN+1pYN+15th95theN+1pe5,e95[YN+1p+e5,YN+1p+e95]

eN+1p

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

eN+1peN+1p5th95th500th9,500th

XN+1(ββ^OLS)NϵiYi=Xiβ^OLS+ϵi(Y,X)βrXN+1(ββ^OLS)XN+1(β^OLSβr)

ϵϵN+1{e1,e2,,eN}{s1s¯,s2s¯,,sNs¯}si=ei/(1hi)hii

YN+1XXN+1

  1. YN+1p=XN+1β^OLS
  2. {s1s¯,s2s¯,,sNs¯}si=ei/(1hi)
  3. r=1,2,,R
    • N{ϵ1,ϵ2,,ϵN}
    • Y=Xβ^OLS+ϵ
    • βr=(XX)1XY
    • er=YXβr
    • ss¯
    • ϵN+1,r
    • eN+1perp=XN+1(β^OLSβr)+ϵN+1,r
  4. 5th95theN+1pe5,e95
  5. YN+1[YN+1p+e5,YN+1p+e95]

Hier ist RCode:

# 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))
Rechnung
quelle
Vielen Dank für die nützlichen, detaillierten Erklärungen. Wenn ich diesen Zeilen folge, denke ich, dass eine allgemeine Technik außerhalb von OLS (baumbasierte Techniken, nächster Nachbar usw.) nicht leicht verfügbar ist, oder?
Michael M
1
Es gibt diesen für zufällige Gesamtstrukturen : stats.stackexchange.com/questions/49750/…, der sich ähnlich anhört.
Bill
Xβf(X,θ)
Wie verallgemeinern Sie die "varianzbereinigten Residuen" - der OLS-Ansatz beruht auf der Hebelwirkung - gibt es eine Hebelwirkungsberechnung für einen beliebigen f (X) -Schätzer?
David Waterworth