compare_mfx

限界効果の比較

概要

 sm.glm()の推定結果を計量経済学の実証論文でよく用いられる、回帰分析の結果を縦方向に並べて比較する表を作成します。表のフォーマットについてはR言語の texreg::screenreg()modelsummary::modelsummary()を参考にしています。

compare_mfx(
    list_models, 
    model_name = None,
    subset = None,
    stats = 'std_err',
    add_stars = True,
    stats_glance = ['prsquared', 'nobs', 'df'],
    at = 'overall',
    method = 'dydx',
    dummy = False,
    digits = 4, 
    table_style = 'two_line',
    line_break = '\n',
    **kwargs
)

引数 Argument

  • list_models
    推定結果を表示する分析結果のリスト(必須)。sm.glm()で作成された一般化線形モデルの結果を list_models = [fit1, fit2] のようにリストとして指定してください。

  • model_namelist of str
    表頭に表示するモデルの名前。['モデル1', 'モデル2'] のように文字列のリストを指定してください。初期設定では、自動的に model 1, model 2, model 3 … と連番が割り当てられます。

  • subsetlist of str
    表示する回帰係数のリスト。指定しない場合(初期設定)、モデルに含まれる全ての回帰係数が表示されます。内部ではpandas.DataFrame.locメソッドを用いて処理を行っているため、['変数1', '変数2', ...] のような文字列のリスト、[True, False, True, ...] のようなブール値のリストに対応しています。文字列のリストが指定された場合、リストの並び順に合わせて回帰係数が表示されます。

  • statsstr
    表中の丸括弧 ( ) 内に表示する統計値の設定。次の値が指定できます。

    • 'std_err' 標準誤差(初期設定)
    • 'p_value' p-値
    • 'statistics' t統計量
  • add_starsbool
    回帰係数の統計的有意性を表すアスタリスク * を表示するかどうかを表すブール値。add_stars = True(初期-設定)なら表示、add_stars = Falseなら非表示となります。table_style'two_line' を指定した場合はアスタリスクは回帰係数の直後に表示され、'one_line' を指定した場合は stats で指定した統計値の後に表示されます。アスタリスクはp-値の値に応じて次のように表示されます。

  • starsdictp_stars() のみ)
     有意性を示す記号を key に、表示を切り替える閾値を値(value)にもつ辞書オブジェクト。初期設定の stars = None の場合、下記の方式で表示されます。

  • stats_glance:list of str

  • 表の下部に追加する当てはまりの尺度の種類を表す文字列のリスト。リストの値には次の値を指定できます。なお、None もしくは空のリスト [ ] が指定された場合には非表示となります。

    • 'rsquared':決定係数
    • 'rsquared_adj':自由度調整済み決定係数
    • 'nobs':サインプルサイズ
    • 'df':モデルの自由度(説明変数の数)
    • 'sigma':回帰式の標準誤差
    • 'F_values':全ての回帰係数がゼロであることを帰無仮説とするF検定の統計量
    • 'p_values':F検定のP-値
    • 'AIC':赤池情報量基準
    • 'BIC':ベイズ情報量基準
  • digits: int
    回帰係数と統計値について表示する小数点以下の桁数。初期設定は4です。

  • table_style: str
    表の書式を表す文字列。次の値から選択できます(部分一致可)。

    • 'two_line'回帰係数と統計値を2行に分ける(初期設定)
    • 'one_line'回帰係数と統計値を1行で表示する
  • line_break: str
    table_style = 'two_line' とした場合に使用される改行記号。table_style = 'one_line' とした場合、この引数は無視されます。

  • at: str
    限界効果の集計方法。内部で使用しているstatsmodels.discrete.discrete_model.DiscreteResults.get_margeff() メソッドに引数 at として渡されます。method = 'coef' を指定した場合、この引数は無視されます。

    • 'overall':各観測値の限界効果の平均値を表示(初期設定)
    • 'mean':各説明変数の平均値における限界効果を表示
    • 'median':各説明変数の中央値における限界効果を表示
    • 'zero':各説明変数の値がゼロであるときの限界効果を表示
  • method: str
    推定する限界効果の種類。内部で使用しているstatsmodels.discrete.discrete_model.DiscreteResults.get_margeff() メソッドに引数 method として渡されます。ただし、method = 'coef' を指定した場合には限界効果を推定せずに回帰係数をそのまま表示します。

    • 'coef':回帰係数の推定値を表示
    • 'dydx':限界効果の値を変換なしでそのまま表。(初期設定)
    • 'eyex':弾力性 d(lny)/d(lnx) の推定値を表示
    • 'dyex':準弾力性 dy /d(lnx) の推定値を表示
    • 'eydx':準弾力性 d(lny)/dx の推定値を表示
  • dummy: bool
    ダミー変数の限界効果の推定方法を制御するブール値。もし False (初期設定)であれば、ダミー変数を連続な数値変数として扱います。もし、True であればダミー変数が0から1へと変化したときの予測値の変化を推定します。内部で使用しているstatsmodels.discrete.discrete_model.DiscreteResults.get_margeff() メソッドに引数 dummy として渡されます。

使用例 Example

import py4stats as py4st
import statsmodels.formula.api as smf

import pandas as pd
import numpy as np
from palmerpenguins import load_penguins
penguins = load_penguins() # サンプルデータの読み込み

 py4st.compare_mfx()py4st.compare_ols() の一般化線型モデルバージョンで、初期設定では statsmodels ライブラリの.get_margeff() メソッドから得られた限界効果の推定値を表示します。

penguins['female'] = np.where(penguins['sex'] == 'female', 1, 0)

# ロジスティック回帰の実行
fit_logit1 = smf.logit('female ~ body_mass_g + bill_length_mm + bill_depth_mm', data = penguins).fit()
fit_logit2 = smf.logit('female ~ body_mass_g + bill_length_mm + bill_depth_mm + species', data = penguins).fit()

py4st.compare_mfx([fit_logit1, fit_logit2])
term model 1 model 2
body_mass_g -0.0004 *** -0.0003 ***
(0.0000) (0.0000)
bill_length_mm -0.0053 -0.0357 ***
(0.0036) (0.0070)
bill_depth_mm -0.1490 *** -0.1098 ***
(0.0051) (0.0175)
species[T.Chinstrap] 0.4172 ***
(0.0848)
species[T.Gentoo] 0.3527 ***
(0.1308)
prsquared 0.5647 0.6187
nobs 342 342
df 3 5
from great_tables import GT, md, html
compare_tab = py4st.compare_mfx(
    [fit_logit1, fit_logit2],
    model_name = ['ベースモデル', 'species 追加'], # モデル名を変更
    line_break = '<br>'                         # 改行文字の変更
)

GT(compare_tab.reset_index())\
  .tab_header(title = 'ロジットモデルの限界効果')\
  .tab_source_note(
      source_note= "Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’"
      )\
  .tab_source_note(source_note = '丸括弧 ( ) の値は標準誤差')

compare_tab_gt2

補足

  table_style = 'two_line' としたとき、初期設定ではの回帰係数とp-値の間に改行記号 '\n'が挿入されます。そのため、print() 関数や display() 関数を使った出力では、改行記号 '\n' がそのまま表示されます。この場合でも、pd.DataFrame.to_excel()pd.DataFrame.to_markdown() を使って Excel ファイルや markdown の表に変換していただくと、改行として反映されます。


Return to Function reference.