都道府県ごとの合計データを処置変数と結果変数に使う場合
人口が交絡している
係数の解釈のため、1人あたりの値にして標準化したい
とい理由から、人口で割ったほうがいい
割ることが交絡のコントロールになる理由¶
欠落変数バイアス¶
long model:
short model:
はにも影響を与えているとする
とおいてlong modelに代入すると
割ることがコントロールになるのはなぜか¶
が
シミュレーション¶
データ生成過程を次のように、ともに人口からの影響を受けると想定する。
の効果であるを推定したい
yとxをpで割った変換後の変数は次のようになる
なので、を推定するためにはをに回帰させる必要がある
もしそのままにすると
import numpy as np
import pandas as pd
np.random.seed(0)
n = 1000
populations = np.random.lognormal(mean=10, size=n).astype(int)
alpha_x = 10
alpha_y = 5
beta = 3
x = alpha_x * populations + np.random.normal(scale=1000, size=n)
y = alpha_y * populations + beta * x + np.random.normal(scale=1000, size=n) # xとyは微弱な相関df = pd.DataFrame(dict(y=y, x=x, population=populations)).sort_values("population").assign(
# 人口あたりのy, xを計算する
ypp = lambda self: self.y / self.population,
xpp = lambda self: self.x / self.population,
)
dfLoading...
yppとxppの相関が弱いことから、 xとyの相関はpopulationによる交絡の影響を受けていることがわかる
import matplotlib.pyplot as plt
fix, axes = plt.subplots(ncols=4, figsize=[20, 3])
df.plot.scatter(x="x", y="y", ax=axes[0])
df.plot.scatter(x="population", y="y", ax=axes[1])
df.plot.scatter(x="x", y="ypp", ax=axes[2]) # 線形性が満たされないのでそれによるバイアスが入りそう
df.plot.scatter(x="xpp", y="ypp", ax=axes[3])
しかし、可能ならypp ~ xppよりもy ~ x + populationのほうが良い気がする
import statsmodels.formula.api as smf
from stargazer.stargazer import Stargazer
Stargazer([
smf.ols("y ~ x", data=df).fit(),
smf.ols("y ~ x + population", data=df).fit(),
smf.ols("ypp ~ x", data=df).fit(),
smf.ols("ypp ~ xpp", data=df).fit(),
])Loading...