R パッケージ
一覧library(tidyverse)
library(stargazer)
library(patchwork)
Plobit Model
や Logit Model
のような非線形モデルでは、OLS
推定は使えないMLE: maximum likelihood esitmation
)
を使って推定する最小二乗法 (OLS) | 不偏性・効率的 (BLUE) |
最尤法(MLE) | 一致性・効率的・サンプル数が十分に大きければ正規分布 |
次のような事例を考える
試験の答案を返された
10点満点中、自分の試験点数は「4 点」
これは良い点なのか、悪い点なのか?
調べる方法:回りの友人達の点数を聞いてみる
友人 4 人の点数を確かめた (6, 7, 3, 5点)
自分の点数を含めて 5 つのサンプル(サンプルの平均値は
5)
← 3 + 4 + 5 + 6 + 7 = 25 ÷ 5 = 5
5 人分サンプルから母平均(試験全体の平均値)を推定する
この母集団の特徴
最小二乗法 (OLS) | 得られたサンプルの外れ度合いを最小にする母平均は? |
最尤法 (MLE) | 得れたサンプルを生み出す蓋然性 (likelihood) を最大にする母平均は? |
クラス全体の試験の平均値(\(μ\)) がもし 5 点なら
5 個のサンプルを同時に取得する蓋然性(μ = 5
の場合)
クラス全体の試験の平均値(\(μ\)) がもし 6 点なら
- 平均 6、標準偏差 1
の正規分布の確率密度関数を使えば、母集団からサンプルを取った時に、それが「3
点である蓋然性」「4 点である蓋然性」「5 点である蓋然性」「6
点である蓋然性」「7 点である蓋然性」を計算できる
5 個のサンプルを同時に取得する蓋然性(μ = 6
の場合)
(3である蓋然性)x (4である蓋然性) x (5である蓋然性) x (6である蓋然性) x (7である蓋然性)
クラス全体の試験の平均値(\(μ\)) が 4, 5, 6 点の場合の比較
これらの平均値(\(μ\))の値の中で、どれが尤(もっと)もありえそう
(likely
) な値か?
→ 蓋然性がもっとも大きくなる \(μ\)
ここでは「サンプルデータを生み出す蓋然性を最大化するような平均値(\(μ\))の値」は「5 個のサンプルの平均値」
これを「母集団の μ の推定値」として使う・・・最尤法
(MLE
) の考え方
尤度(ゆうど)
MLE
)
は、尤度を最大化するような値をパラメータの推定値として使う尤度関数 (likelihood function
)
最尤法 (MLE) による推定方法
・尤度関数を求める
・尤度関数を最大化するようなパラメータの値を解く
パラメータの計算方法 | 詳細 |
解析的 (analytical) 方法 | この方法で最尤法はなかなか解けない |
数値的 (numerical)方法 | Newton-Raphson法、BHHH法、DFP法、BFGS法などを使って数値的 (numerical) に解く |
analytical
)
な推定は困難numerical
) に解くMLE
における推定値 = サンプルデータを生成する蓋然性 (=
尤度)最尤推定法 (MLE) | 最小二乗法 (OLS) |
尤度比検定
(likelihood ratio test: LR test )・・・問題あり |
F 検定 |
疑似決定係数 (pseudo \(R^2\))・・・問題あり | |
OLS における F 検定の解説 - F
検定では複数の帰無仮説を同時に検定する
- 複数の帰無仮説を同時に検定する理由:
→ 1
つずつ検定すると有意でないが、全体で検定する有意なことがありうるから
検定の方法:
→ 2 つのモデルを作る
(1) 無制限モデル (unrestricted model
) — β1
と
β2
を含むモデル
(2) 制限モデル (restricted model
) — β1
と
β2
を含まないモデル
→ それぞれの \(R^2\) を計算
→ 「β1
と β2
を含むことによって、 \(R^2\) が十分に増えたか?」を検定
MLE
における尤度比検定
(LR test
) の解説と問題点
検定の方法:
→ 2 つのモデルを作る
(1) 無制限モデル (unrestricted model
) — β1
と
β2
を含むモデル
(2) 制限モデル (restricted model
) — β1
と
β2
を含まないモデル
→ それぞれの \(R^2\) を計算
→ 「β1
と β2
を含むことによって、
尤度が十分に増えたか?」を検定
尤度比検定の問題点
「モデル全体(説明変数の組み合わせが)無意味かどうか」というおおざっぱな評価しかできない
MLE
における疑似決定係数
(pseudo \(R^2\))の解説と問題点
- OLS
における決定係数 (\(R^2\)) に類似した概念として考案
\[pseudoR^2 =1 - \frac{無制約モデルの対数尤度}{ 制約モデルの対数尤度}\]
疑似決定係数 (pseudo \(R^2\)) の限界
解決策
AID: Akaike information criterion
)
を使う\[AIC = -2×対数尤度+2×パラメータ数\]
AIC
が最小のモデルが「最も良いモデル」とされる最尤推定法 (MLE) | 最小二乗法 (OLS) |
尤度 | 決定係数 (\(R^2\)) |
AIC | 調整済み決定係数 (Adjusted \(R^2\)) |
まとめ
MLE
における尤度は、OLS
における決定係数
(\(R^2\)) に相当MLE
における AIC
は、OLS
における調整済み決定係数 (Adjusted \(R^2\))に相当AIC
は MLE
におけるモデルの評価基準として最も広く使われているOLS
と MLE
の前提条件OLS
) を用いるMLE
) を用いるOLS
では推定できない非線形モデルでも MLE
は推定できるOLS
で前提としている仮定を MLE
では明示的にモデル中に取り込めるMLE
で分析すべきモデルを OLS
で分析するとどうなるかを示すhr96-17.csv
)RProject folder
内の data
フォルダに入れるdata
フォルダ内から read_csv
で読み取り
df
というデータフレーム名をつける<- read_csv("data/hr96-17.csv", na = ".") df
names(df)
[1] "year" "pref" "ku" "kun"
[5] "wl" "rank" "nocand" "seito"
[9] "j_name" "gender" "seshu_dummy" "jiban_seshu"
[13] "name" "previous" "...15" "age"
[17] "exp" "status" "vote" "voteshare"
[21] "eligible" "turnout" "castvotes" "...24"
[25] "...25" "nojiban_seshu" "mag"
df1
と名前を付ける<- df %>%
df1 filter(year == 2012) %>%
select(wl, seshu_dummy, exp, eligible, status)
wl = 1
は小選挙区当選者、wl = 2
は復活当選者、wl = 0
は落選者wl = 1
が当選者(小選挙区と比例復活),
wl = 0
が落選者<- mutate(df1, wl = as.numeric(wl == 1 | wl == 2)) df1
exp
と eligible
を使って、有権者一人あたりに使う選挙費用 (exppv
)
を作る<- mutate(df1, exppv = exp / eligible) # eligible は小選挙区ごとの有権者数 df1
summary(df1$exppv)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.00126 6.10793 14.86928 17.18456 23.65808 94.59168 14
status = 0
は新人、status = 1
は現職、
status = 2
は元職status = 0
がその他、status = 1
が現職<- mutate(df1, inc = as.numeric(status == 1 )) df1
<- df1 %>%
df1 select(wl, seshu_dummy, inc, exppv)
R-Markdown
で html
表示する際にはチャンクオプションで {r, results = “asis”}
と指定する。stargazer(as.data.frame(df1),
type ="html",
digits = 2)
Statistic | N | Mean | St. Dev. | Min | Max |
wl | 1,294 | 0.33 | 0.47 | 0 | 1 |
seshu_dummy | 1,294 | 0.10 | 0.30 | 0 | 1 |
inc | 1,294 | 0.31 | 0.46 | 0 | 1 |
exppv | 1,280 | 17.18 | 13.50 | 0.001 | 94.59 |
変数名 | 詳細 |
wl | 選挙の当落: 1 = 当選(小選挙区+復活当選)、0 = 落選 |
seshu_dummy | 世襲候補者ダミー: 1 = 世襲、0 = 非世襲(地盤世襲 or 非世襲) |
inc | 現職ステータス: 1 現職、0 = 非現職 |
exppv | 有権者一人あたりに費やす選挙費用(円) |
OLS モデル
と MLE モデル
の比較wl
)」が応答変数これに線形回帰を(無理矢理)当てはめ、\(\mathrm{\hat{Y} >
0.5}\) なら当選、その他の場合は落選と予測する
2 値の変数 (wl
) を OLS
による回帰に使うことは道理に叶っている
次のようなモデルを考える
線形回帰で得られる \(\mathrm{β_1,β_2, β_3}\) が \(\mathrm{Pr(当落|X)}\) の推定値
線形回帰 (OLS
)
を行うと、推定値が区間[0, 1]
から外れてしまうことがある
→ これでは「確率」とは言えない
それでも、この予測値は順序付けのために使うことができる
「確率」の大雑把な大雑把な推定値として使うことが可能
OLS
では誤差項 (ε
)
が正規分布しているという仮定がある
→OLS
では次の仮定を置いていることになる
\[「選挙の当落」は 「β_0 + β_1世襲+ β_2現職 + β_3選挙費用」を平均に正規分布している\]
wl
) の分布は次のとおりhist(df1$wl)
応答変数 (wl
) は 0, 1 の値をとる「二値変数」
この応答変数 (wl
) は上記の OLS
の仮定を満たさない
→ これはOLS
ではなく MLE
で分析すべき
「良いモデル」という観点から、MLE
で分析すべきモデルを OLS
で分析してみる
MLE
推定では「一般化線形モデル」(GLM: generalized linear model
)
の一つ である Logit モデル(ロジスティック回帰)を使う
モデル名 | 応答変数 | 説明変数 |
---|---|---|
OLS | 選挙の当落 (wl) | 世襲 (seshu_dummy), 現職 (inc), 選挙費 (exppv) |
MLE (Logit) | 選挙の当落 (wl) | 世襲 (seshu_dummy), 現職 (inc), 選挙費 (exppv) |
OLS モデル(重回帰): (lm 関数
)
<- lm(wl ~ seshu_dummy + inc + exppv,
ols data = df1)
Logit モデル(ロジスティック回帰)
(glm 関数
)
<- glm(wl ~ seshu_dummy + inc + exppv, data = df1,
logit family = binomial(link = "logit")) # 誤差を二項分布に指定
stargazer(ols, logit,
type = "html",
digits = 2)
Dependent variable: | ||
wl | ||
OLS | logistic | |
(1) | (2) | |
seshu_dummy | 0.35*** | 1.94*** |
(0.04) | (0.28) | |
inc | -0.01 | -0.12 |
(0.03) | (0.16) | |
exppv | 0.02*** | 0.09*** |
(0.001) | (0.01) | |
Constant | 0.04** | -2.53*** |
(0.02) | (0.14) | |
Observations | 1,280 | 1,280 |
R2 | 0.29 | |
Adjusted R2 | 0.29 | |
Log Likelihood | -607.20 | |
Akaike Inf. Crit. | 1,222.40 | |
Residual Std. Error | 0.40 (df = 1276) | |
F Statistic | 176.75*** (df = 3; 1276) | |
Note: | p<0.1; p<0.05; p<0.01 |
推定値の比較
OLS モデルの推定結果
\[選挙での当落 = 0.04 + 0.36世襲 - 0.01現職 + 0.02選挙費用\]
Intercept
の係数: 0.04
が意味すること seshu_dummy = 0, inc = 0, exppv = 0
の候補者が当選する値は 0.04seshu_dummy = 0, inc = 0, exppv = 0
の候補者が当選する値は 4%Logit モデルの推定結果
\[選挙での当落 = -2.51 + 2.04世襲 - 0.14現職 + 0.09選挙費用\]
logit (=Log Odds)
Odds
と当選確率を計算する
Intercept
の係数: -2.51
が意味すること seshu_dummy = 0, inc = 0, exppv = 0
の候補者の
Odds
はexp(-2.51)
[1] 0.08126824
Odds
の値が 1 であれば、当選する確率は 50 %Odds
の値が 0.08 なので当選確率は 50%
より遙かに小さいとわかるpredict(logit, type = "response",
newdata = data_frame(seshu_dummy = 0, inc = 0, exppv = 0))
1
0.07404419
logit
におけるseshu_dummy = 0, inc = 0, exppv = 0
の候補者の当選確率は 0.075 (= 7.5%)
OLS
における
seshu_dummy = 0, inc = 0, exppv = 0
の時の切片は 0.04 (= 4%)
当選回数と当落のプロット (OLS
)
<- ggplot(df1, aes(x = exppv, y = wl)) +
OLS geom_smooth(method = "lm", se = FALSE) +
labs(x = "選挙費用(円)", y = "選挙での当落", title = "回帰直線 (OLS)") +
geom_hline(yintercept = c(0, 1), color = "gray") +
geom_jitter(width = 0.05, height = 0.05) +
ylim(0,1) +
theme_minimal(base_family = "HiraKakuProN-W3")
print(OLS)
当選回数と当選確率のプロット
(Logit
)
<- margins::cplot(logit,
LOGIT x = "exppv",
what = "prediction") %>%
as_data_frame() %>%
ggplot(aes(x = xvals, y = yvals, ymin = lower, ymax = upper)) +
geom_ribbon(fill = "gray") +
geom_line() +
labs(x = "選挙費用(円)",
y = "予測当選確率の予測値",
title = "選挙費用と予測当選確率 (logit)") +
theme_minimal(base_family = "HiraKakuProN-W3")
- 二つのグラフを並べて表示させる
+ LOGIT OLS
seshu_dummy
) と現職
(inc
)
の値を平均値に固定した時に「有権者一人あたりに費やした選挙費用」とその「候補者の当選確率」の関係を示している predict(logit, type = "response",
newdata = data_frame(seshu_dummy = 0.09, inc = 0.31, exppv = 25))
1
0.470656
predict(logit, type = "response",
newdata = data_frame(seshu_dummy = 0.09, inc = 0.31, exppv = 50))
1
0.8961336
seshu_dummy = 1
、inc = 1
)
が、有権者一人あたりの選挙費用として
25円使うと、その候補者の当選確率は約 84 %だと予測できるpredict(logit, type = "response",
newdata = data_frame(seshu_dummy = 1, inc = 1, exppv = 25))
1
0.8269272
fit
) 比較OLS
モデル と Logit
モデルの AIC
を比較AIC(ols)
[1] 1263.786
AIC(logit)
[1] 1222.399
Logit
モデルの AIC
の値
(1223
) の方が OLS
モデルの AIC
の値 (1266
)より小さいLogit
モデルの方がよいモデルまとめ - 応答変数が 0, 1
の二値変数を OLS
モデルと Logit
モデルで分析
→ ほぼ同様の結果
- この分析では AIC
が小さい Logit
モデルの方がより良いモデルといえる
→ 質的な応答変数の場合には非線形回帰
(MLE
) を用いた方がより良い