傾向スコア#
バランシングスコア#
バランシングスコア(balancing score)\(b(\boldsymbol{x})\)とは、\(b(\boldsymbol{x})\)が条件付けられた下での共変量\(\boldsymbol{x}\)の分布が処置\(z\)と独立になる(処置群\((z=1)\)と対照群\((z=0)\)とで\(x\)の条件付き分布が等しくなる)ような関数である(Rosenbaum & Rubin, 1983)。
共変量\(\boldsymbol{x}\)自身は最も細かい(finest)バランシングスコアであり、傾向スコア\(P(z=1|\boldsymbol{x})\)は最も粗い(coarsest)バランシングスコアである。
傾向スコア#
共変量\(\b{x}_i\)の下でその対象\(i\)が処置される確率
を傾向スコア(propensity score)という。
傾向スコアの使用方法#
マッチング:傾向スコアの値が同じ(厳密マッチング)か近い(最近傍マッチング)個体を比較する
層別解析:傾向スコアの値によっていくつかのサブクラスに分け、各クラスで処置群と対照群の平均をとって全体のATEを推定する
回帰分析・共分散分析:割当変数\(z\)と傾向スコア\(e\)を説明変数とした線形の回帰分析を行う
その他の推定量:IPW推定量やDR推定量など(後述)
傾向スコアの長所#
共変量を1次元に次元削減しているため、2つの群において共変量の値に重なりが少ない場合でも使える
共変量と結果変数のモデル設定を行わなくてもよい
例えば回帰分析のような線形モデルを構築しなくてもよい → 共変量と結果変数の間に線形性を仮定できない場合でも使える可能性
モデルの誤設定に強い
共分散分析やロジスティック回帰により\(E[y|x]\)を直接モデリングする方法と、層別による傾向スコア解析を比較したところ、傾向スコア解析のほうがモデルの誤設定から生じるバイアスがより少なかったという研究がある(Drake, 1993)
傾向スコアマッチング#
causallibパッケージを使うと簡単に実装できる
参考:causallib/examples/matching.ipynb at master · BiomedSciAI/causallib
# サンプルデータ
from causallib.datasets import load_nhefs
data = load_nhefs()
X, a, y = data.X, data.a, data.y # 共変量X、割当a、結果y
data.descriptors
Variable name
active IN YOUR USUAL DAY, HOW ACTIVE ARE YOU? IN 1971...
age AGE IN 1971
education AMOUNT OF EDUCATION BY 1971: 1: 8TH GRADE OR L...
exercise IN RECREATION, HOW MUCH EXERCISE? IN 1971, 0:m...
race 0: WHITE 1: BLACK OR OTHER IN 1971
sex 0: MALE 1: FEMALE
smokeintensity NUMBER OF CIGARETTES SMOKED PER DAY IN 1971
smokeyrs YEARS OF SMOKING
wt71 WEIGHT IN KILOGRAMS IN 1971
qsmk QUIT SMOKING BETWEEN 1ST QUESTIONNAIRE AND 198...
wt82_71 WEIGHT CHANGE IN KILOGRAMS
Name: Description, dtype: object
# ロジスティック回帰でpropensity scoreを計算する
from sklearn.linear_model import LogisticRegression
learner = LogisticRegression(solver="liblinear", class_weight="balanced")
from causallib.estimation import PropensityMatching
pm = PropensityMatching(learner)
pm.fit(X, a, y)
# 処置ごとの平均の結果
outcomes = pm.estimate_population_outcome(X, a)
effect = pm.estimate_effect(outcomes[1], outcomes[0])
print(f"ATE={effect.iloc[0]:.3f}")
ATE=2.956
層別解析#
傾向スコアの値に応じて、分析対象を\(K\)個(例えば5つ)の部分集合に分け、各クラスで処置群と対照群の結果変数の平均を計算し、それらの加重平均を全体の推定量とする
IPW推定量#
逆確率重み付け(inverse probability weighting: IPW)による推定量(Rubin, 1985)
によって各群の結果変数の期待値を推定でき、両者の差分でATEを推定できることが知られている。
なお、分子において\(z_i y_i\)のように処置変数\(z_i\)を乗じているのは処置群を取り出すため。重みを
と考えればわかりやすいかもしれない。たとえば個体\(i\)が処置群なら\(z_i = 1\)となり第一項だけが残り、
となる。
導出
真の傾向スコアの値が既知で、「強く無視できる割り当て」条件が成立するなら、
となり、\(\hat{E}(y_1)\)は\(y_1\)の周辺平均の不偏推定量になる。\(\hat{E}(y_0)\)も同様である。
真の傾向スコア\(e\)ではなく推定値\(\hat{e}_i\)を使ったとしても一致推定量となる。
\(N\)を大きくすると
に確率収束することが大数の法則により成立する。
IPW推定のイメージ#
IPWはもともと標本抽出法におけるHorvitz–Thompson推定量からアイデアを得ている。Horvitz–Thompson推定量は層化抽出されたサンプルにおいて抽出確率の逆数で重みを付けることで、抽出確率が低いカテゴリの推定への影響度を高めて補正する。
同様にIPWも傾向スコアによって重み付けを行う。
ate_naive = np.mean(y[z == 1]) - np.mean(y[z == 0])
print(f"{ate_naive=:.1f}")
p_hat = logit_res.predict(sm.add_constant(x))
y1_ipw = sum(z * y / p_hat) / sum(z / p_hat)
y0_ipw = sum( (1 - z) * y / (1 - p_hat) ) / sum( (1 - z) / (1 - p_hat) )
ate_ipw = y1_ipw - y0_ipw
print(f"{ate_ipw=:.1f}")
ate_naive=2.0
ate_ipw=1.4
from causallib.datasets import load_nhefs
data = load_nhefs()
X, a, y = data.X, data.a, data.y
from sklearn.linear_model import LogisticRegression
from causallib.estimation import IPW
ipw = IPW(LogisticRegression(solver="liblinear", class_weight="balanced"))
ipw.fit(X, a)
potential_outcomes = ipw.estimate_population_outcome(X, a, y)
effect = ipw.estimate_effect(potential_outcomes[1], potential_outcomes[0])
effect
diff 3.411915
dtype: float64
# love plot: 重みつけ後の共変量の絶対標準化差(ASMD)が十分小さいことを確認するplot
from causallib.evaluation import evaluate
results = evaluate(ipw, X, a, y)
results.plot_covariate_balance(thresh=0.1)
<Axes: xlabel='Absolute Standard Mean Difference', ylabel='Covariates'>
Bayesian IPW#
Liao, Shirley X., and Corwin M. Zigler. 2020. “Uncertainty in the Design Stage of Two-Stage Bayesian Propensity Score Analysis.” Statistics in Medicine 39 (17): 2265–90. https://doi.org/10.1002/sim.8486.
Heiss, Andrew. 2021. “How to Create a(n Almost) Fully Bayesian Outcome Model with Inverse Probability Weights.” December 20, 2021. https://doi.org/10.59350/gyvjk-hrx68.
DR推定量#
傾向スコア解析の改善余地が2点ある
傾向スコア推定後に結果変数の周辺分布を推定する際に\(z=0\)のグループの共変量の情報を用いておらず、データを無駄にしている
傾向スコアを計算する際のモデルが誤った場合、推定結果が誤ったものになる可能性
これらを解決するのがDR推定量。
二重にロバストな推定量(doubly robust estimator)は、傾向スコアと、共変量で結果変数を説明する回帰関数を両方用いる方法
傾向スコア算出のためのモデル\(p(z|\b{x}, \alpha) = e(\b{x}, \alpha)\)の母数\(\alpha\)の一致推定量を\(\hat{\alpha}\)、共変量で結果変数を説明する回帰関数\(E[y_1|\b{x}]=g(\b{x}, \b{\beta}_1)\)の母数の推定量を\(\hat{\b{\beta}}_1\)とすると
となる。
以下の条件のどちらかが成立していれば、DR推定量は結果変数の周辺平均の一致推定量となる
条件A: 傾向スコアを計算する際に利用されるモデルが正しく指定されている
条件B: 共変量で結果変数を説明する回帰関数のモデルが正しく指定されている
共変量釣り合い傾向スコア#
Imai, K., & Ratkovic, M. (2014). Covariate balancing propensity score.
**共変量釣り合い傾向スコア(covariate balancing propensity score:CBPS)**は、対照群・処置群の共変量の期待値が一致する(バランスする)という制約条件の下で傾向スコアを推定する方法
逆確率で重みを付けたとき、期待値がバランスしててほしい
推定はロジスティック回帰
モーメント条件
シンプルながらもモデルの誤特定に頑健らしい
モーメント法特有の過小識別の問題はどうクリアしてる?
causallib#
参考文献#
Rubin, D. B. (1985). The use of propensity scores in applied Bayesian inference. Bayesian statistics, 2, 463-472.