その他の分布とモデル選択

Pythonで学ぶSurvival Analysis

Shae Wang

Senior Data Scientist

どのモデルが最も適合するか?

同一データに対し4つのモデルの生存曲線

Pythonで学ぶSurvival Analysis

パラメトリックモデルの選択

  • 非パラメトリック(例:カプラン–マイヤー)
    • 分布仮定が不要で、データを正確に表す
    • なめらか/連続/微分可能ではない
  • パラメトリック(例:ワイブル)
    • 一般により多くの情報を与える
    • モデルが不適切だと大きく偏った結論になる
Pythonで学ぶSurvival Analysis

代表的なパラメトリック生存モデル

  • ワイブルモデル
    from lifelines import WeibullFitter
    
  • 指数モデル
    from lifelines import ExponentialFitter
    
  • 対数正規モデル
    from lifelines import LogNormalFitter
    
  • 対数ロジスティックモデル
    from lifelines import LogLogisticFitter
    
  • ガンマ(一般化ガンマ)モデル
    from lifelines import GeneralizedGammaFitter
    
Pythonで学ぶSurvival Analysis

赤池情報量規準(AIC)

  • AIC:与えられたデータに対する予測誤差と統計モデルの相対的品質の指標
  • 各モデルの情報損失を見積もり、推定パラメータ数が多いほど罰則を与える
    • 情報損失が少ないほどモデル品質は高い
    • パラメータが少ない(単純)ほどモデル品質は高い
  • 複数の候補から、AICが最小のモデルを選ぶ
Pythonで学ぶSurvival Analysis

AICによるモデル選択

手順1)lifelinesでパラメトリックモデルを当てはめる

手順2)各モデルのAIC_を出力して比較

手順3)AICが最小のモデルを選ぶ

from lifelines import WeibullFitter, 
                      ExponentialFitter, 
                      LogNormalFitter
wb = WeibullFitter().fit(D, E)
exp = ExponentialFitter().fit(D, E)
log = LogNormalFitter().fit(D, E)
print(wb.AIC_, exp.AIC_, log.AIC_)
215.9091   216.1183   202.3498
Pythonで学ぶSurvival Analysis

find_best_parametric_model()

  • find_best_parametric_model()lifelines内の関数。パラメトリックモデル間のAIC比較を自動化
  • lifelinesで利用可能な各パラメトリックモデルを順に試す

使い方

  • T: 期間、E: 打ち切り
    best_model, best_aic_ = find_best_parametric_model(event_times=T,
                                                       event_observed=E,
                                                       scoring_method="AIC")
    print(best_model)
    
<lifelines.WeibullFitter:"Weibull_estimate", 
fitted with 686 total observations, 387 right-censored observations>
Pythonで学ぶSurvival Analysis

QQプロット

  • QQプロット:2つの確率分布の分位数を相互にプロットして比較
  • 2つの分布が類似していれば、点は概ね直線y = x上に並ぶ

qq plot example

Pythonで学ぶSurvival Analysis

QQプロットでモデル選択

手順1)lifelinesでパラメトリックモデルを当てはめる

手順2)各モデルのQQプロットを描く

手順3)y = xに最も近いQQプロットを選ぶ

from lifelines.plotting import qq_plot

for model in [WeibullFitter(), LogNormalFitter(), LogLogisticFitter(), ExponentialFitter()]: model.fit(T, E) qq_plot(model)
plt.show()
Pythonで学ぶSurvival Analysis

QQプロットでモデル選択

比較用QQプロット

Pythonで学ぶSurvival Analysis

練習してみましょう!

Pythonで学ぶSurvival Analysis

Preparing Video For Download...