まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

効果検証入門 1,2章 俺俺メモ

効果検証入門を買った。因果推論系はあまりちゃんと手を動かしていないので、気になったところのみ自分なりにまとめる。

効果検証入門〜正しい比較のための因果推論/計量経済学の基礎

効果検証入門〜正しい比較のための因果推論/計量経済学の基礎

  • 作者:安井 翔太
  • 発売日: 2020/01/18
  • メディア: 単行本(ソフトカバー)

github.com

1章.セレクションバイアスとRCT

セレクションバイアス

ユーザーに対して、メール配信がされた(Z=1)グループとされなかったグループ(Z=0)の売上(購入)yの差からメールの効果(τ)を推定する。

このとき、メールが配信された売上を y^{(1)}、されなかった売上を y^{(0)}とすると

 τ_{naive} = E(y^{(1)}_i | Z=1) - E(y^{(0)}_i | Z=0)

からメール効果が推定されるように感じるが、一般的にはメールを配信されるかどうかはユーザーの性質によって決まる(購入しそうな人など)。
そのため、そもそもメール配信がされた人は配信されていなくても、売上が高いことから E(y^{(1)}_i | Z=0) > E(y^{(0)}_i | Z=0) となる。

つまり、上式は以下のように考えられる。

 τ_{naive} = E(y^{(1)}_i | Z=1) - E(y^{(0)}_i | Z=0)
\,\,\,\,\,\,\,\,\,\,\,\,= E(y^{(1)}_i | Z=1) + (E(y^{(0)}_i | Z=1) - E(y^{(0)}_i | Z=1)) - E(y^{(0)}_i | Z=0)
\,\,\,\,\,\,\,\,\,\,\,\,= E(y^{(1)}_i - y^{(0)}_i | Z=1) + (E(y^{(0)}_i | Z=1) - E(y^{(0)}_i | Z=0)) \,\,\,\,\,\,\,\,\,\,\,\,= τ_{true} + セレクションバイアス

ここでの第1項が本来の効果τ_{true}となる。一方、第2,3項は「メール配信がされていない状態での、配信された人とされなかった人のもとから持っている差」、つまりグループ内の人を由来とするセレクションバイアスを表す。

もしRCTがされていた場合、「配信された人とされなかった人のもとから持っている差」はないので、第2,3項は  E(y^{(0)}_i | Z=1) = E(y^{(0)}_i | Z=0)となりτ_{true} =τ_{naive} が成立する。

この本では、RCTができない場合にセレクションバイアスをいかにして取り除く分析デザインをするのか、ということを主眼に展開している。

検定

施策の効果があったかどうか、「E(y_i | Z=1) - E(y_i | Z=1)が0になるかどうか」の有意差検定おこなうことで検証できる。ただし、これはRCT下における話で、セレクションバイアスがかかっていた場合、「E(y_i | Z=1) - E(y_i | Z=1)にセレクションバイアスが足された効果が0になるか」という意味合いになる。正負が一致している場合は過大になることから有意になりやすいし、不一致の場合は過小になることから有意になりづらい。

2章 介入効果を測るための回帰分析

共変量

セレクションバイアスを生んでいると考えられる全変数を共変量X、介入変数をダミー変数Zとする。
その場合、前述の場合はZをメールが打たれたかどうか、Xを過去の購買額となり、購入額Yを以下の式から求めることができる。

 Spend_i = \beta_0 + \beta_1 Treatment_i + \beta_2 History_i + ε_i

この場合、共変量XであるHistoryをコントロールした上でのTreatmentの影響が\beta_1よりわかる。

## 回帰分析の実行
biased_reg <- lm(data = biased_data, formula = spend ~ treatment + history)

## 推定されたパラメーターの取り出し
tidy(biased_reg)

# term        estimate std.error statistic     p.value
# <chr>          <dbl>     <dbl>     <dbl>       <dbl>
#   1 (Intercept)  0.324    0.144         2.24 0.0248     
# 2 treatment    0.903    0.174         5.18 0.000000225
# 3 history      0.00109  0.000337      3.25 0.00117   

上の例では共変量は1つとなっているが複数取ってTreatment係数\beta_1を見る。
また、セレクションバイアスの影響を見るため、
①RCT下で単回帰
②非RCT下で単回帰 ③非RCT下で重回帰(共変量1つ)@上述
④非RCT下で重回帰(共変量複数)
を見ると結果は以下のようになる。

①RCT下で単回帰

## RCTデータでの単回帰
rct_reg <- lm(data = male_df, formula = spend ~ treatment)
tidy(rct_reg)
# term        estimate std.error statistic  p.value
# <chr>          <dbl>     <dbl>     <dbl>    <dbl>
# 1 (Intercept)    0.653     0.103      6.36 2.09e-10
# 2 treatment      0.770     0.145      5.30 1.16e- 7

②非RCT下で単回帰

## バイアスのあるデータでの単回帰
nonrct_reg <- lm(data = biased_data, formula = spend ~ treatment)
tidy(nonrct_reg)
# term        estimate std.error statistic      p.value
# <chr>          <dbl>     <dbl>     <dbl>        <dbl>
# 1 (Intercept)    0.548     0.127      4.32 0.0000156   
# 2 treatment      0.979     0.173      5.67 0.0000000143

③非RCT下で重回帰(共変量1つ)@上述再掲

## 回帰分析の実行
biased_reg <- lm(data = biased_data, formula = spend ~ treatment + history)

## 推定されたパラメーターの取り出し
tidy(biased_reg)

# term        estimate std.error statistic     p.value
# <chr>          <dbl>     <dbl>     <dbl>       <dbl>
#   1 (Intercept)  0.324    0.144         2.24 0.0248     
# 2 treatment    0.903    0.174         5.18 0.000000225
# 3 history      0.00109  0.000337      3.25 0.00117   

④非RCT下で重回帰(共変量複数)

## バイアスのあるデータでの重回帰
nonrct_mreg <- lm(data = biased_data,
                  formula = spend ~ treatment + recency + channel + history)
tidy(nonrct_mreg)
# term         estimate std.error statistic    p.value
# <chr>           <dbl>     <dbl>     <dbl>      <dbl>
# 1 (Intercept)   0.502    0.379      1.32    0.185     
# 2 treatment     0.847    0.178      4.74    0.00000211
# 3 recency      -0.0403   0.0259    -1.55    0.121     
# 4 channelPhone -0.00178  0.304     -0.00585 0.995     
# 5 channelWeb    0.226    0.303      0.745   0.456     
# 6 history       0.00103  0.000375   2.74    0.00608  

このとき、「①RCT下で単回帰」はRCTなのでTreatmentの正しい効果として0.770が得られる。
「②非RCT下で単回帰」では0.979となりセレクションバイアスの影響で過大評価されている。
「③非RCT下で重回帰(共変量1つ)@上述再掲」では 0.903となりセレクションバイアスの影響は②より軽減されているがそれでも①での0.770よりはだいぶ過大評価されている。 「④非RCT下で重回帰(共変量複数)」では0.847となり、共変量を増やしたことでさらにセレクションバイアスの影響が軽減されていることがわかる。

ただし、介入後による影響を受けるような変数を入れるとPost Treatment Biasが発生する。
例えば、訪問回数は「メール配信があったから訪問をする」というようなことが起きうる。そのため、メール配信がされた人はされなかった人と比べてメール配信による効果で訪問回数が増加しているため、同じ訪問回数でも「増加した訪問回数(配信者)vs素の訪問回数(非配信者)」となるため訪問回数は変数として入れない方がよい。

脱落変数バイアス(OVB)

前説でTreatmentに関係する(相関がある)共変量を複数入れたが、このとき必要となる共変量のうち一部が欠けている場合に欠落変数バイアス(OVB)が発生する(本書では「脱落変数」として記載)。
これは、誤差項εの中に欠落変数が内包されることで、Treatmentと誤差項の相関が起き、係数の推定が収束しないことにより一致性が失われることで起きる(詳細は過去記事)。

knknkn.hatenablog.com

大雑把に言えば、Treatmentの効果(係数)に欠落変数の効果が入ることで効果が過剰に見積もられることになる。
 \beta_{treatment} + γ \beta_{omit}

なお、このとき興味がある変数はTreatmentの係数なので、欠落変数の係数などが統計的に有意かどうかは関係がない。あくまで、Treatmentの係数を正しく推定するためのコントロールとして共変量を置いている。
また、既に含んでいる共変量と欠落変数が強く相関している場合、含んでいる共変量の係数に欠落変数の効果がある程度含まれているため欠落変数バイアスは小さくなる。

Conditional Independence Assumption

共変量Xが与えられたとき、割り振りZはY_0, Y_1とは独立している状況をConditional Independence Assumption(CIA)と呼ぶ。

 {Y_0, Y_1} ⊥ Z_i | X_i

この状況になっていることはつまり、共変量Xが同じときY_0, Y_1を比べた場合は割り振りZはRCTと同じ状態になっていることを指す。逆に、割り当ては共変量Xのみできまっている。つまり、CIA下ではセレクションバイアスがかからない。

ただし、CIAになっているかどうかの検証をすることはできないので「どの共変量が必要か」ということはよく考える必要がある。

また、手に入らないデータ(欠落変数)が存在する場合は操作変数法や固定効果法などで対処できないか考える。

knknkn.hatenablog.com

余談ですが、「強く無視できる割り当て条件(Strongly Ignorable Treatment Assignment)」で書いてる本の方が多い気はするけど本書ではCIAなんすね。CIAの方がちょっと条件が緩い模様。

qiita.com

Sensitivity Analysis

分析者が重要だと感じている共変量以外の変数をモデルから抜くと効果の推定値が大きく変動するか確認をする。つまり、共変量以外によってどれくらい共変量に影響があるかを考える。このことをSensitivity Analysis(感度分析)といい、現時点の共変量が欠落変数の影響を大きく受けるのかを知ることができる。

観察研究における感度分析の勧め 入門編

回帰分析の注意点

介入効果はサンプルの特徴に左右される。そのため、例えば効果を強く受けるような共変量Xのサンプルが多く、小さく受けるようなXのサンプルが少ない場合前者の影響に引っ張られて過剰に介入効果が見積もられる。