# coding: utf-8

# DO NOT EDIT
# Autogenerated from the notebook influence_glm_logit.ipynb.
# Edit the notebook and then sync the output with this file.
#
# flake8: noqa
# DO NOT EDIT

# # GLM Logit 的影响度量
#
#
# 基于 GLMInfluence 的草稿版本，该版本也将适用于离散的 Logit，Probit 和 Poisson，
# 最终将扩展为涵盖除时间序列分析之外的大多数模型。
#
# Logistic 回归将使用 Pregibon（1981）的“Logistic 回归诊断” 作为示例，并基于 Finney（1947）的数据。
#
# GLMInfluence 包括基本的影响度量，但仍缺少 Pregibon（1981）中描述的一些度量，
# 例如：与偏差和置信区间的影响相关的度量。
# 

import os.path
import numpy as np
import pandas as pd

from statsmodels.genmod.generalized_linear_model import GLM
from statsmodels.genmod import families

import statsmodels.stats.tests.test_influence
test_module = statsmodels.stats.tests.test_influence.__file__
cur_dir = cur_dir = os.path.abspath(os.path.dirname(test_module))

file_name = 'binary_constrict.csv'
file_path = os.path.join(cur_dir, 'results', file_name)
df = pd.read_csv(file_path, index_col=0)

res = GLM(
    df['constrict'],
    df[['const', 'log_rate', 'log_volumne']],
    family=families.Binomial()).fit(
        attach_wls=True, atol=1e-10)
print(res.summary())

# ## get the influence measures
#
# GLMResults 具有类似于 OLSResults 的 get_influence 方法，该方法返回 GLMInfluence 类的实例。 
# 此类具有方法和（缓存的）属性来检查影响力和异常值。
# 
#
# 此度量基于通过删除一个观测值的一步近似法的结果。 对于小变化，一步近似法通常是准确的，但会低估大变化的幅度。 
# 尽管低估了大的变化，但仍然清楚地展示了影响力的观察结果
# 
#
# 在此示例中，观测值 4 和 18 具有较大的标准化残差和 Cook-距离，但杠杆作用并不大。 
# 观测值 13 具有最大的杠杆作用，但 Cook-距离很小，且没有很大的学生残差。
#
# 只有两个观测值 4 和 18 对参数估计有很大的影响。

infl = res.get_influence(observed=False)

summ_df = infl.summary_frame()
summ_df.sort_values('cooks_d', ascending=False)[:10]

infl.plot_influence()

infl.plot_index(y_var='cooks', threshold=2 * infl.cooks_distance[0].mean())

infl.plot_index(y_var='resid', threshold=1)

infl.plot_index(y_var='dfbeta', idx=1, threshold=0.5)

infl.plot_index(y_var='dfbeta', idx=2, threshold=0.5)

infl.plot_index(y_var='dfbeta', idx=0, threshold=0.5)
