Rの階層線形モデルlme4のlmerと同等のモデルがstatsmodelsにあるのでそれを利用してみる。
pythonのデータ処理になれている場合はこちらの方が良いか。
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
import pandas as pd
test_data = pd.read_csv("dat/nine-school-testdata.csv", sep=",", index_col=0)
test_data.head()
import statsmodels.api as sm
Y = test_data['normexam'].values
df_X = test_data[["standLRT"]]
X = df_X.values
X1 = sm.add_constant(X) # 1列めに1.0を入れるだけ
model = sm.OLS(Y,X1)
result = model.fit()
result.summary()
# pandasのDataFrameを利用するにはstatsmodels.formula.apiを利用する
import statsmodels.formula.api as smf
result2 = smf.ols(formula="normexam ~ standLRT", data=test_data).fit()
result2.summary()
result2.fittedvalues[:5]
test_data['fitted_olm'] = result2.fittedvalues
statsmodelsのmixedlmを用いる。 https://www.statsmodels.org/stable/mixed_linear.html
結果はRのlmerを利用したときと同じ
利用例のページ http://www.statsmodels.org/0.6.1/examples/notebooks/generated/mixed_lm_example.html
import statsmodels.formula.api as smf
md = smf.mixedlm("normexam ~ standLRT", test_data, groups=test_data["school"], re_formula="~standLRT")
mdf = md.fit()
print(mdf.summary())
# ランダム効果の係数部分
mdf.random_effects
# 各データに対するフィッティング値
mdf.fittedvalues[:5]
test_data['fitted_lmer'] = mdf.fittedvalues
test_data.head()
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(12, 5))
test_data['color'] = test_data['school'].str.replace("学校","").astype(int) # 色は整数値で指定
test_data.plot(kind="scatter", ax=axes[0], x="fitted_olm", y="normexam", c="color", colormap='Accent', colorbar=False)
test_data.plot(kind="scatter", ax=axes[1], x="fitted_lmer", y="normexam", c="color", colormap='Accent', colorbar=False)
print(test_data[['fitted_olm','normexam']].corr())
print(test_data[['fitted_lmer','normexam']].corr())
test_data.plot(kind="scatter", y="fitted", x="standLRT")