ブートストラップ予測間隔


29

線形回帰または他の回帰法(k最近傍、回帰木など)から得られたポイント予測の予測間隔を計算するために利用可能なブートストラップ手法はありますか?

どういうわけか、ポイント予測(たとえば、kNN回帰の予測区間を参照)を単にブートストラップするために時々提案される方法は、予測区間ではなく信頼区間を提供していると感じています。

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

明らかに、95%の基本ブートストラップ間隔は、95%の予測間隔ではなく、95%の信頼区間と一致します。だから私の質問:それを適切に行う方法?


少なくとも通常の最小二乗の場合は、単なるポイント予測以上のものが必要です。予測区間も構築するために、推定された残差を使用する必要があります。
Kodiologist


@duplo:これを指摘してくれてありがとう。古典的な予測区間の正しい長さは、エラー項の正規性の仮定に直接依存しているため、楽観的すぎる場合、ブートストラップされたバージョンはそこから派生したものになることは間違いありません。一般に、回帰で動作するブートストラップメソッドがあるかどうか(必ずしもOLSではない)。
マイケルM

1
\ textit {conformal inference}はあなたが望むものだと思います。これにより、有効な有限サンプルカバレッジを持ち、過度にカバーしないリサンプリングベースの予測区間を構築できます。トピックの紹介として読むことができるarxiv.org/pdf/1604.04173.pdfにある良い論文と、github.com/ryantibs/conformalから入手できるRパッケージがあります。
サイモンボゲブラント

回答:


26

以下に示す方法は、Davidson and Hinckley(1997)のセクション6.3.3、Bootstrap Methods and their Applicationで説明されている 方法です。ここにGlen_bと彼のコメントに感謝します。このトピックに関して相互検証に関するいくつかの質問があることを考えると、私はそれを書く価値があると思いました。

線形回帰モデルは次のとおりです。

Yi=Xiβ+ϵi

我々は、データを持っている我々は推定するために使用し、:として β β OLSi=1,2,,Nβ

β^OLS=(XX)1XY

今、私たちは何を予測したい、我々が知っていることを考えると、新しいデータポイントになりそれのために。これが予測の問題です。新しい(既知)と新しい(予測したい)呼び出しましょう。通常の予測は(がiidでと無相関であると仮定している場合): X X X N + 1 Y Y N + 1 ϵ i X Y p N + 1YXXXN+1YYN+1ϵiX

YN+1p=XN+1β^OLS

この予測による予測エラーは次のとおりです。

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

この式を次のようにことができ。

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

これで、がすでに計算されました。したがって、を一定の間隔(たとえば、90%の時間)でバインドする場合、のおよびパーセンタイル/分位数を一貫して推定するだけです。、それらをと呼び、予測間隔は。 Y N + 1 5 t h 95 t h e p N + 1 e 5e 95 [ Y p N + 1 + e 5Y p N + 1 + e 95 ]YN+1pYN+15th95theN+1pe5,e95[YN+1p+e5,YN+1p+e95]

の分位数/パーセンタイルを推定する方法は?さて、次のように書くことができます: e p N + 1eN+1p

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

戦略は、から(ブートストラップのような方法で)何回もサンプリングし、通常の方法でパーセンタイルを計算することです。したがって、多分から10,000回サンプリングし、およびパーセンタイルをおよび最小メンバーとして推定します。標本、見本。のE P N + 1 5 のT H 95 T H 500 のT H 9 500 のT HeN+1peN+1p5th95th500th9,500th

を描画するには、ブートストラップエラーを使用できます(ケースも問題ありませんが、iidを想定しています)とにかくエラー)。そのため、各ブートストラップレプリケーションで、分散調整された残差(次の段落を参照)を置​​換して回描画し、を取得してから、新しい、その後、新しいデータセット OLSを実行して、このレプリケーションのを取得します。最後に、この複製のの描画は N ε * I Y * I = X I β OLS + ε * IY *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)

iid想定している場合、方程式の部分からサンプリングする自然な方法は、回帰から得た残差。残差は異なるため、一般的に分散が小さすぎるため、、分散修正残差。ここで、あり、は観測値てこです。ϵϵN+1{e1,e2,,eN}{s1s¯,s2s¯,,sNs¯}si=ei/(1hi)hii

そして、最後に、90%の予測区間製造するためのアルゴリズムとすれば、あるです。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+ϵ
    • この複製のブートストラップOLS推定量を計算します、 βr=(XX)1XY
    • この複製からブートストラップ残差を取得します、er=YXβr
    • この複製からブートストラップ分散調整残差を計算します、ss¯
    • この複製からブートストラップ分散調整残差の1つ、描画しϵN+1,r
    • この複製の描画を、計算し eN+1perp=XN+1(β^OLSβr)+ϵN+1,r
  4. 、およびパーセンタイルを見つける5th95theN+1pe5,e95
  5. 90%予測間隔は です。[ Y p N + 1 + e 5Y p N + 1 + e 95 ]YN+1[YN+1p+e5,YN+1p+e95]

ここにあるRコードは:

# 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))

有用で詳細な説明をありがとう。これらの線に従って、OLS以外の一般的な手法(ツリーベースの手法、最近傍など)は簡単に利用できるとは思わないでしょうか?
マイケルM

1
これはランダムフォレスト用です:stats.stackexchange.com/questions/49750/…これは似ています。
ビル

私が知る限り、をに抽象化すると、この手法はどのモデルでも機能します。F X θ Xβf(X,θ)
シャドウトーカー

「分散調整残差」をどのように一般化しますか-OLSアプローチはレバレッジに依存します-任意のf(X)推定量のレバレッジ計算はありますか?
デビッドウォーターワース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.