まず、必要なパッケージを読み込む(順番に注意:armをcoefplotより先に読む)。インストール済みでないパッケージある場合は、先に install.packages()
でインストールする。このクラスで今回初めて使うパッケージは、texreg、 interplot、jtools の3つである。
library("foreign")
library("texreg")
library("dplyr")
library("arm")
library("coefplot")
library("ggplot2")
# Macユーザは次の行も実行する
##theme_set(theme_gray(base_size = 12, base_family = "HiraKakuProN-W3"))
library("interplot")
library("jtools")
説明のために『Stataによる計量政治学』(浅野正彦, 矢内勇生. 2013)で使用されているデータ(hr96-09.dta) を使う。 まず、このデータを読み込む(データへのパスは各自の状況に応じて変えること。ここでは、R Studioのプロジェクトを利用していて、プロジェクトが存在するフォルダ内にdata という名前のフォルダがあり、その中にデータセットが保存されていると仮定している)。
## Observations: 5,614
## Variables: 16
## $ year <int> 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996...
## $ ku <chr> "aichi", "aichi", "aichi", "aichi", "aichi", "aichi"...
## $ kun <int> 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3...
## $ party <fct> NFP, LDP, DPJ, JCP, bunka, NP, msz, NFP, LDP, DPJ, J...
## $ name <chr> "KAWAMURA, TAKASHI", "IMAEDA, NORIO", "SATO, TAISUKE...
## $ age <int> 47, 72, 53, 43, 51, 51, 45, 51, 71, 30, 31, 44, 61, ...
## $ status <fct> incumbent, moto, incumbent, challenger, challenger, ...
## $ nocand <int> 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7...
## $ wl <fct> win, lose, lose, lose, lose, lose, lose, win, lose, ...
## $ rank <int> 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3...
## $ previous <int> 2, 3, 2, 0, 0, 0, 0, 2, 1, 1, 0, 0, 0, 0, 0, 1, 3, 1...
## $ vote <int> 66876, 42969, 33503, 22209, 616, 566, 312, 56101, 44...
## $ voteshare <dbl> 40.0, 25.7, 20.1, 13.3, 0.4, 0.3, 0.2, 32.9, 26.4, 2...
## $ eligible <int> 346774, 346774, 346774, 346774, 346774, 346774, 3467...
## $ turnout <dbl> 49.22, 49.22, 49.22, 49.22, 49.22, 49.22, 49.22, 51....
## $ exp <int> 9828097, 9311555, 9231284, 2177203, NA, NA, NA, 1294...
このデータセットで、得票率は voteshare である。 2009年の選挙について、得票率を説明するモデルを考えてみよう。
2009年のデータだけ取り出す(欠測がある観測を除外しておく)。
2009年の選挙において、各候補者の得票率は、その候補者が有権者1人につき、選挙費用をいくら投じたかによって決まったと想定しよう。 つまり、\(\mbox{得票率} = \beta_0 + \beta_1 \mbox{一人あたり選挙費用} + 誤差\) という回帰モデルを検討する。
データセットに、「一人あたり選挙費用」という変数はないが、選挙費用 (exp) と 有権者数 (eligible) という変数があるので、exppp という名前で一人当たり選挙費用という変数を作ろう。
この変数の分布を確認してみよう。
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0258 5.3290 13.9190 18.4032 27.3219 100.8919
ggplot(HR_2009, aes(x = exppp)) +
geom_histogram(fill = "black") +
labs(x = "一人当たり選挙費用(円)", y = "度数")
選挙費用は0を取らないことがわかる。 中心かした変数も作っておこう。
この中心化した変数を使って、回帰式を推定してみよう。
## lm(formula = voteshare ~ c_exppp, data = HR_2009)
## coef.est coef.se t value Pr(>|t|)
## (Intercept) 26.53 0.49 53.70 0.00
## c_exppp 0.93 0.03 29.92 0.00
## ---
## n = 1124, k = 2
## residual sd = 16.56, R-Squared = 0.44
有権者一人当たりに使う選挙費用が1円増えるごとに、得票率が0.93ポイント上がるという関係がありそうだ。
しかし、一人あたり選挙費用が得票率に与える影響は、すべての候補者で同じとは限らないだろう。たとえば、政党による違いがあるかもしれない。2009年選挙では民主党が勝利して政権の座をとった。この選挙では民主党の人気が強かったので、民主党の候補者は、選挙費用の額にかかわらず、 高い得票率を得たかもしれない。「民主党議員であるかどうか(ダミー変数)」が「選挙費用(連続変数)」の影響力を変えた可能性があるということである。
言い換えると、選挙費用の影響力の強さは、民主党議員であるかどうかという別の要因(説明変数)に依存しているかもしれない。このように、1つの説明変数の影響力の大きさが、他の説明変数の値によって変わることを相互作用(interaction effect; 交互作用)と呼ぶ。
この相互作用を検討してみよう。 回帰モデルは、 \[\mbox{得票率} = \beta_0 + \beta_1 一人当たり選挙費用 + \beta_2 民主党 + \beta_3 一人当たり選挙費用 \cdot 民主党 + 誤差\] と表される。ここで、\(一人当たり選挙費用 \cdot 民主党\) の部分を相互作用項(interaction term; 交互作用項、交差項)と呼ぶ。
このモデルの回帰係数をRで推定してみよう。 まず、民主党ダミーを作る必要がある。 政党 party 変数を表にしてみる。
##
## msz JCP LDP CGP oki tai saki NFP DPJ SDP LF NJSP
## 60 152 290 6 0 0 0 0 268 31 0 0
## DRF kobe nii sei JNFP bunka green LP RC muk CP NCP
## 0 0 0 0 0 0 0 0 0 0 0 0
## ND son sek NP NNP NPJ NPD minna R H sho
## 0 0 0 0 9 2 0 14 1 291 0
民主党は DPJ(Democratic Party of Japan)なので、party 変数が “DPJ”のときは1、それ以外のときは 0 をとる dpj という名前のダミー変数を作る。
ダミー変数がちゃんと作れたか確認する。
##
## 0 1
## 856 268
思いどおりのダミー変数ができた。
この変数を使って回帰係数を推定する。相互作用項とその相互作用に関係する変数そのものをすべて説明変数として含む重回帰分析をRで行う場合、以下のように * を使って式を表すことができる。
## lm(formula = voteshare ~ c_exppp * dpj, data = HR_2009)
## coef.est coef.se t value Pr(>|t|)
## (Intercept) 20.04 0.37 54.40 0.00
## c_exppp 0.91 0.02 41.49 0.00
## dpj 31.42 0.80 39.31 0.00
## c_exppp:dpj -0.83 0.06 -14.36 0.00
## ---
## n = 1124, k = 4
## residual sd = 10.73, R-Squared = 0.77
この結果は、どのように解釈すべきだろうか。まず、 切片の係数である20.04 は何を示しているだろうか。 これは、説明変数の値がすべて0のときの結果変数の予測値である。 つまり、「中心化された一人あたり選挙費用」が0(すなわち、一人当たり選挙費用が平均値)で、「民主党ダミー」が0(すなわち、民主党以外の候補者)の得票率の予測値は、20.04パーセントということである。
次に、選挙費用の係数である0.91 は何を示しているだろうか。この数値は、他の説明変数の値が等しければ、一人当たり選挙費用が一円増えるごとに、得票率は0.91 ポイント増加するという意味である。しかし、一人あたり選挙費用だけを増やすことは(一般ん的には)できない。なぜなら、一人当たり選挙費用の値を変えると、「一人当たり選挙費用 \(\times\) 民主党」の値も変わってしまうからだ(すぐに明らかになるが、民主党ダミーが0であれば選挙費用だけ動かせる)。
同様に、民主党ダミーの係数である 31.42 も、そのままでは解釈できない。
したがって、相互作用を考慮するときには、解釈に工夫が必要である。 今考えているモデルのように、相互作用を構成する変数の1つがダミー変数のときは、場合分けして考えるのが簡単である。
民主党ダミーが0の場合、つまり、民主党以外の候補者については、民主党ダミーに0を代入して考えればいいので、回帰式は、 \[\widehat{得票率} = 20.04 + 0.91 一人当たり選挙費用 + 31.42 民主党 -0.83 一人あたり選挙費用 \cdot 民主党\\ = 20.04 + 0.91 一人当たり選挙費用 + 31.42 \cdot 0 -0.83 一人あたり選挙費用 \cdot 0\\ = 20.04 + 0.91 一人当たり選挙費用\] となる。 この式から、民主党以外の候補者に関しては、一人あたり選挙費用が一円増えるごとに、得票率が0.91ポイント増えることが期待される。
民主党ダミーが1の場合、つまり、民主党の候補者については、民主党ダミーに1を代入して考えればいいので、回帰式は、 \[\widehat{得票率} = 20.04 + 0.91 一人当たり選挙費用 + 31.42 民主党 -0.83 一人あたり選挙費用 \cdot 民主党\\ = 20.04 + 0.91 一人当たり選挙費用 + 31.42 \cdot 1 -0.83 一人あたり選挙費用 \cdot 1\\ = (20.04 + 31.42) + (0.91 - 0.83) 一人当たり選挙費用\\ = 51.46 + 0.08 一人当たり選挙費用\] となる。この式から、民主党の候補者に関しては、一人あたり選挙費用が一円増えるごとに、得票率が0.08ポイント増えることが期待される。
以上の結果は、ggplot()
で簡単に図示できる。
int_1 <- ggplot(HR_2009, aes(x = c_exppp, y = voteshare, color = as.factor(dpj))) +
geom_smooth(method = "lm") +
geom_point() +
labs(x = "一人当たり選挙費用の偏差(円)", y = "得票率 (%)") +
scale_color_discrete(name = "政党", labels = c("民主党以外", "民主党"))
print(int_1)
以上の結果から、2009年の総選挙における選挙費用の影響は、民主党の候補者とそれ以外の候補者で異なるように見える。しかし、本当に相互作用はある(統計的に有意)なのだろうか。それを確かめるために、interplot::interplot()
を使う。この関数を使うときは、相互作用を含む回帰モデルと、注目する変数(ここでは選挙費用)、相互作用する変数(ここでは民主党ダミー)を指定する。ただし、変数は引用符で囲む。
res_int_2 <- interplot(fit_2, var1 = "c_exppp", var2 = "dpj") +
labs(x = "民主党ダミー", y = "選挙費用が得票率に与える影響")
print(res_int_2)
図中の点は、民主党ダミーが0と1の場合それぞれの選挙費用の影響の点推定値である。また、点についている線分は、係数の95%信頼区間である。2つの信頼区間が重なっていないことから、私たちが想定した相互作用は実際にありそうだということがわかる。
一人当たり選挙費用の影響は、候補者の年齢 (age) によっても変わるかもしれない。 そこで、以下の回帰モデルを考えよう。 \[\mbox{得票率} = \beta_0 + \beta_1 一人当たり選挙費用 + \beta_2 年齢 + \beta_3 一人当たり選挙費用 \cdot 年齢 + 誤差\] つまり、選挙費用と年齢の相互作用が存在するモデルを考える。ただし、年齢は中心化してから回帰係数を推定する。
HR_2009 <- mutate(HR_2009, c_age = age - mean(age))
fit_3 <- lm(voteshare ~ c_exppp*c_age, data = HR_2009)
display(fit_3, detail = TRUE)
## lm(formula = voteshare ~ c_exppp * c_age, data = HR_2009)
## coef.est coef.se t value Pr(>|t|)
## (Intercept) 27.41 0.51 54.07 0.00
## c_exppp 0.97 0.03 29.57 0.00
## c_age 0.03 0.05 0.60 0.55
## c_exppp:c_age -0.02 0.00 -6.16 0.00
## ---
## n = 1124, k = 4
## residual sd = 16.30, R-Squared = 0.46
この結果はどのように解釈したらいいだろうか。上で推定したモデル (fit_2) とは異なり、年齢はダミー変数ではないので、場合分けして考えるの困難である。
そこで、interplot::interplot()
を使って結果を解釈してみよう。
res_int_3 <- interplot(fit_3, var1 = "c_exppp", var2 = "c_age") +
labs(x = "年齢の偏差", y = "選挙費用が得票率に与える影響")
print(res_int_3)
この図で示されている直線は、「一人当たり選挙費用が得票率に与える影響」の点推定値である。影響の大きささ年齢によって変わる(年齢が上がると影響が小さくなる)ことがわかる。また、線の周りのグレーの領域は95%信頼区間である。この図の縦軸は得票率ではないことに注意してほしい。
このように、相互作用は interplot()
で調べることができる。では、相互作用によって、得票率はどう変化するのだろうか。 それを知るためには、jtools::interact_plot()
が便利である。
interact_plot(fit_3, pred = c_exppp, modx = c_age,
plot.point = TRUE,
legend.main = "年齢") +
# theme_bw(base_family = "HiraKakuProN-W3") + # Mac ユーザはこの行も実行
labs(x = "一人あたり選挙費用の偏差(円)", y = "得票率") +
ylim(0, 100)
この図は、年齢が平均値 (mean) の場合、平均値より1標準偏差大きい場合 (+ 1 SD)、平均値より1標準偏差小さい場合 (- 1 SD) のそれぞれについて、選挙費用と得票率の関係を図示している。
分析結果を表にする方法の1例を示す。今回は3つのモデルを推定した。texreg::htmlreg()
を使って、3つの結果を1つの表にまとめる(図の方がよいが、表の作り方も覚えておいて損はない)。
htmlreg(list(fit_1, fit_2, fit_3),
single.row = FALSE,
stars = numeric(0),
custom.model.names = c("モデル 1","モデル 2", "モデル 3"),
custom.coef.names = c("切片", "一人あたり選挙費用", "民主党ダミー",
"一人あたり選挙費用 x 民主党ダミー",
"年齢", "一人あたり選挙費用 x 年齢"),
custom.note = "注:括弧内は標準誤差",
include.rmse = FALSE,
custom.gof.names = c("決定係数", "自由度調整済み決定係数", "観測数"),
caption = "2009年総選挙の得票率を説明するモデルの推定結果",
caption.above = TRUE,
doctype = FALSE)
モデル 1 | モデル 2 | モデル 3 | ||
---|---|---|---|---|
切片 | 26.53 | 20.04 | 27.41 | |
(0.49) | (0.37) | (0.51) | ||
一人あたり選挙費用 | 0.93 | 0.91 | 0.97 | |
(0.03) | (0.02) | (0.03) | ||
民主党ダミー | 31.42 | |||
(0.80) | ||||
一人あたり選挙費用 x 民主党ダミー | -0.83 | |||
(0.06) | ||||
年齢 | 0.03 | |||
(0.05) | ||||
一人あたり選挙費用 x 年齢 | -0.02 | |||
(0.00) | ||||
決定係数 | 0.44 | 0.77 | 0.46 | |
自由度調整済み決定係数 | 0.44 | 0.77 | 0.46 | |
観測数 | 1124 | 1124 | 1124 | |
注:括弧内は標準誤差 |
今回は HTML の表を作るので texreg::htmlreg()
を利用したが、LaTeX で使う表を作りたいときは、texreg::texreg()
を使えばよい(課題3の解答例を参照)。texreg()
の tex は LaTeX の TeX である。