Slide 21
Slide 21 text
© GO Inc.
● 非介入グループのデータを利用し、介入グループに近似する重みを学習する
● 学習した重みを利用し、介入グループに近似するデータ(合成コントロール)を生成する
Synthetic Controlによる因果効果の推定
from scipy.optimize import fmin_slsqp
import numpy as np
from toolz import reduce, partial
## 損失関数の定義
def loss_w(W, X, y) -> float:
return np.sqrt(np.mean((y - X.dot(W))**2))
## weightの推定
def get_w(X, y):
w_start = [1/X.shape[1]]*X.shape[1]
weights = fmin_slsqp(partial(loss_w, X=X, y=y),
np.array(w_start),
f_eqcons=lambda x: np.sum(x) - 1,
bounds=[(0.0, 1.0)]*len(w_start),
disp=False)
return weights
## 学習や合成コントロールの作成
tar_ind = df_sc.variable.astype('int') < 1988
y = df_sc.loc[tar_ind,'California'].values
X = df_sc.loc[tar_ind,tar_cols].values
calif_weights = get_w(X, y).reshape(-1,1)
synthetic_calif = df_sc[tar_cols].values.dot(calif_weights)
介入前の期間で
重み付けする