ヘキット分析とヘックマンの2段階推定

要約

 次のようなサンプル・セレクションがある場合で

 ヘックマンの2段階推定はサンプル・セレクション・バイアスを除去できました。

ヘキット分析

(1)ヘキット・モデル

 ヘキット・モデルはサンプル・セレクション・バイアスを考慮するモデルです。例えば、母集団では

$$Y=\beta_0+\beta_1X+u$$

でも、潜在変数S*

$$S^*= \delta_0+\delta_1X +\delta_2 Z+v$$

が0以上でないと観測されないモデルです。

 ただし

$$E(u|X)=E(v|X)=0$$

$$v 〜 N(0,1)$$

$$E(u|v)=\gamma v$$

が仮定されています。

(2)ヘックマンの2段階推定

 ヘキット分析では、ヘックマンの2段階推定か最尤法を用います。この記事では、ヘックマンの2段階推定を解説します。ヘックマンの2段階推定は、回帰分析を2回する方法です。

 1回目はセレクション式

$$S^*= \delta_0+\delta_1X +\delta_2 Z+v$$

をプロビット分析し、δ0、δ1、δ2を推定します。推定値には「^」をつけましょう。次に、

$$\widehat{c}= \widehat{\delta_0}+\widehat{\delta_1}X+\widehat{\delta_2} Z$$

として、それぞれの標本について

$$逆ミルズ比=E(v|v ≧\widehat{c})$$

を推定します。

 最後に、構造式に逆ミルズ比の推定値を入れて

$$Y_{観測有}=\beta_0+\beta_1X+\gamma \widehat{逆ミルズ比}+\epsilon$$

について最小二乗法を行います。これがヘックマンの2段階推定です。

最小二乗法とヘックマンの2段階推定

 ヘキット分析では、どのようなサンプル・セレクション・バイアスに対応できるのかを、シミュレーションで確かめてみます。

(1)母集団と標本

 母集団では、構造式

$$Y=1.5+0.3X+$$

でも、潜在変数S*

$$S^*= -0.1-0.2X +0.1 Z+v$$

が0以上でないと観測されないとします(セレクション式)。そして、

$$E(u_i|v_i)=-5 v_i$$

とします。つまり、逆ミルズ比の係数は-5です。

 他にもいくつかの項目を設定して、出力すると以下の結果になりました。左が母集団に従う分布で、右がYが観測されなかったサンプルを除いた標本の分布です。

(2)最小二乗推定

 右図の標本を最小二乗法推定した結果が、下図です。

 目的変数Xの母回帰係数が「0.3」であるのに、最小二乗推定では「-0.21」となりました。プラスがマイナスとされたのですから、深刻なサンプル・セレクション・バイアスが発生しています。しかも、1%有意でありタチが悪いです。

(3)ヘックマンの2段階推定

 次にヘックマンの2段階推定によって、推定します。その結果が下です。

 目的変数Xの母回帰係数が「0.3」である中、ヘックマンの2段階推定では「0.18」となりました。10%有意にすぎず、誤差は存在しますが、最小二乗法よりは改善されています。

サンプル・セレクション・バイアスの影響

(1)分布を調べる意義

 さきほどの結果のみでヘックマンの2段階推定が優れていると結論することはできません。偶然、母回帰係数に近かっただけかもしれないからです。

 そこで、同じモデルで乱数発生させ推定する試行を、1000回繰り返します。それぞれで得た推定値の分布を比較すれば、平均的にどちらの推定法がよいのかがわかります。

(2)推定量の分布

 1000回推定した分布が下図です。

 上図をみると、最小二乗法ではサンプル・セレクション・バイアスを受けており、ヘックマンの2段階推定ではサンプル・セレクション・バイアスを除去できていることがわかります。

ヘキット分析のRコード

#パッケージのインストールと呼び出し
install.packages("sampleSelection") #PCにつき1回やればよい
library(sampleSelection)
#ヘックマンの2段階推定
lm0 <- heckit(s ~ x + z, #セレクション式
                y ~ x,  #構造式
                method = "2step",  #2段階推定
                data=?)  #データ「?」を使う
summary(lm00)
 
#最尤法
lm00 <- heckit(s ~ x + z,  #セレクション式
                y ~ x,   #構造式
                method = "mls",   #最尤法
                data=?)  #データ「?」を使う
summary(lm00)
 
#(おまけ)最小二乗法(←ヘキット分析ではない)
lm000 <-lm(YS ~ x,data=?)
summary(lm000)

シミュレーションの方法

(1)セッティング

 シミュレーションでは次のモデルを考えていました。

  • n=1500

 

  • 乱数発生

$$説明変数:X 〜 N(-0.5,5)$$

$$Zの誤差項:e 〜 N(0,2)$$

$$構造式の誤差項の誤差項:ee 〜 N(0,0.5)$$

$$セレクション式の誤差項:uu 〜 N(0,1)$$

 

  • セレクション式の変数作成

$$除外変数Z:z=-0.05-0.1X+e$$

$$プロビットの潜在変数S^*:ss=-0.1 – 0.2x + 0.1z+ uu$$

$$観測有無:ss≧0ならs=1、ss<0ならs=0$$

 

  • 構造式の変数作成

$$構造式の誤差項:u=-5uu+ee$$

$$目的変数:Y=1.5+0.3X+u$$

 

  • サンプル・セレクション

$$観測された目的変数(※観測なしは0):$$

$$ys = s (1.5 + 0.3x + u)$$

$$観測された目的変数(※観測なしはNA):$$

$$ys ≠0ならYS =ys、 ys =0ならYS =(NA)$$

(2)シミュレーションのRコード

#サンプル数
sample_number <- 1500
 
#乱数発生
x <- rnorm(n=sample_number, mean =-0.5, sd=5)
e <- rnorm(n=sample_number, mean =0, sd=2)
ee <- rnorm(n=sample_number, mean =0, sd=0.5)
uu <- rnorm(n=sample_number, mean =0, sd=1)
 
#セレクション式
z <- -0.05 - 0.1*x + e
ss <- -0.1 -  0.2*x + 0.1 *z+ uu
s <- ifelse(ss>=0,1,0)
 
#構造式
u <- -5*uu + ee
y <- 1.5 + 0.3*x + u
 
#サンプル・セレクション
ys <- s*(1.5 + 0.3*x + u)
YS <- ifelse(ys==0,NA,ys)

(3)散布図の作成

#母集団
plot(x,y)
 
#標本
plot(x,YS)

(4)1000回の試行

 1000回の試行は、処理に数分かかります。気長に待ちましょう。

#サンプル数sample_number
sample_number <- 1500
#試行回数trial_number
trial_number <- 1000
  
#データなし(NA)がtrial_number個並んだ箱をつくり、beta_1と名付けます
beta_1_heck_2step <- rep(NA, trial_number)
beta_1_heck_mls <- rep(NA, trial_number)
beta_1_ols <- rep(NA, trial_number)
 
 
 
#1回目からtrial_number回目まで繰り返し処理します
for(i in 1:trial_number){
  
  #サンプル数
sample_number <- 1500
 
  #乱数発生
  x <- rnorm(n=sample_number, mean =-0.5, sd=5)
  e <- rnorm(n=sample_number, mean =0, sd=2)
  ee <- rnorm(n=sample_number, mean =0, sd=0.5)
  uu <- rnorm(n=sample_number, mean =0, sd=1)
 
  #セレクション式
  z <- -0.05 - 0.1*x + e
  ss <- -0.1 -  0.2*x + 0.1 *z+ uu
  s <- ifelse(ss>=0,1,0)
 
  #構造式
  u <- -5*uu + ee
  y <- 1.5 + 0.3*x + u
 
  #サンプル・セレクション
  ys <- s*(1.5 + 0.3*x + u)
  YS <- ifelse(ys==0,NA,ys)
  
  #ヘックマンの2段階推定
  lm0 <- heckit(s ~ x + z, 
                YS ~ x, 
                method = "2step") 
  beta_1_heck_2step[i] <- lm0$coef[5] #coefがポイント
 
  #最尤法
  lm00 <- heckit(s ~ x + z, 
                YS ~ x, 
                method = "mls") 
  beta_1_heck_mls[i] <- lm00$estimate[5] #estimateがポイント
 
  #最小二乗推定量
  lm000 <-lm(YS ~ x)
  beta_1_ols[i] <- lm000$coef[2]
}
 
 
 
#最小二乗推定量の分布
hist(beta_1_ols,xlim=c(-0.5,0.8),breaks=30) 
 
#ヘックマンの2段階推定の分布
hist(beta_1_heck_2step,xlim=c(-0.5,0.8),breaks=30)
 
#最尤推定量の分布
hist(beta_1_heck_mls,xlim=c(-0.5,0.8),breaks=30)