準備

まず、必要なパッケージを読み込む。インストールが必要なら先にインストールする。

説明のために『Rによる計量政治学』(浅野正彦, 矢内勇生. 2018)で使用されているデータ(hr-data.csv を使う。

まず、このデータをダウンロードして読み込む(データへのパスは各自の状況に応じて変えること。ここでは、RStudioのプロジェクトを利用していて、プロジェクトが存在するフォルダ内にdata という名前のフォルダがあり、その中にデータセットが保存されていると仮定している)。download.file() でダウンロードしたデータが読み込めない(「データが破損している」などの警告がでる)場合は、Webブラウザを使ってデータをダウンロードすること。

## Observations: 8,803
## Variables: 22
## $ 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,…
## $ status     <chr> "現職", "元職", "現職", "新人", "新人", "新人", "新人", "現職", "元職",…
## $ name       <chr> "KAWAMURA, TAKASHI", "IMAEDA, NORIO", "SATO, TAISUKE"…
## $ party      <chr> "NFP", "LDP", "DPJ", "JCP", "others", "kokuminto", "i…
## $ party_code <int> 8, 1, 3, 2, 100, 22, 99, 8, 1, 3, 2, 10, 100, 99, 22,…
## $ previous   <int> 2, 3, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 3, 1,…
## $ wl         <chr> "当選", "落選", "落選", "落選", "落選", "落選", "落選", "当選", "落選",…
## $ voteshare  <dbl> 40.0, 25.7, 20.1, 13.3, 0.4, 0.3, 0.2, 32.9, 26.4, 25…
## $ age        <int> 47, 72, 53, 43, 51, 51, 45, 51, 71, 30, 31, 44, 61, 4…
## $ nocand     <int> 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7,…
## $ rank       <int> 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3,…
## $ vote       <int> 66876, 42969, 33503, 22209, 616, 566, 312, 56101, 449…
## $ eligible   <int> 346774, 346774, 346774, 346774, 346774, 346774, 34677…
## $ turnout    <dbl> 49.2, 49.2, 49.2, 49.2, 49.2, 49.2, 49.2, 51.8, 51.8,…
## $ exp        <int> 9828097, 9311555, 9231284, 2177203, NA, NA, NA, 12940…
## $ expm       <dbl> 9.828097, 9.311555, 9.231284, 2.177203, NA, NA, NA, 1…
## $ vs         <dbl> 0.400, 0.257, 0.201, 0.133, 0.004, 0.003, 0.002, 0.32…
## $ exppv      <dbl> 28.341505, 26.851941, 26.620462, 6.278449, NA, NA, NA…
## $ smd        <chr> "当選", "落選", "落選", "落選", "落選", "落選", "落選", "当選", "落選",…
## $ party_jpn  <chr> "新進党", "自民党", "民主党", "共産党", "その他", "国民党", "無所属", "新進党…

衆議院議員経験があることを表すダミー変数と選挙費用を100万円単位で測定する変数を作る。 新しい変数は dplyr::mutate() で作る。

%>% はパイプ演算子と呼ばれるのもので、%>% の左側で評価した内容を、%>% の右側にある関数の第1引数として使う。単純な例として、sqrt(4)4 %>% sqrt() と書くことができる。試してみよう。

## [1] 2
## [1] 2

実際には、このように単純な計算でパイプを使う必要はないが、プログラムが複雑になると、パイプを使ったほうが楽なことが多くなる。

次に、データから2009年の結果だけ抜き出し、HR09として保存する。特定の条件に合致するデータを抜き出したいときは、dplyr::filter() を使う。


Rで線形回帰分析を行う

説明変数が二値しかとらないとき(モデル1)

得票率(結果変数)を議員経験(説明変数)で説明するモデルを考えよう。 議員経験は、現職または元職の候補者なら1、そうでなければ0をとる二値 (binary) 変数(ダミー変数)である。 このモデルを式で表すと、 \[得票率_i \sim \mathrm{N}(\beta_1 + \beta_2 \cdot 議員経験_i, \sigma^2)\] と、なる。

Rでは、lm() で回帰式を推定する。

これで、fit_1 に推定結果(係数の推定値など)が保存される。

基本的な結果は、summary() で見ることができる。

## 
## Call:
## lm(formula = voteshare ~ experience, data = HR09)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -43.867 -12.072  -5.567   8.583  52.123 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  13.8772     0.6203   22.37   <2e-16
## experience   30.9898     0.9783   31.68   <2e-16
## 
## Residual standard error: 16.19 on 1137 degrees of freedom
## Multiple R-squared:  0.4688, Adjusted R-squared:  0.4684 
## F-statistic:  1004 on 1 and 1137 DF,  p-value: < 2.2e-16

この結果は少し読みにくいので、代わりに brrom:tidy() を利用しよう。

## # A tibble: 2 x 5
##   term        estimate std.error statistic   p.value
##   <chr>          <dbl>     <dbl>     <dbl>     <dbl>
## 1 (Intercept)     13.9     0.620      22.4 3.78e- 92
## 2 experience      31.0     0.978      31.7 2.18e-158

この出力の、estimate の列に係数の推定値 (coefficient estimates) が示されている。 これにより、\(\hat{\beta}_1=\) 13.88, \(\hat{\beta}_2=\) 30.99, \(\hat{\sigma}=\) 16.19 が得られた。 したがって、 \[\widehat{得票率} = 13.88 + 30.99 \cdot 議員経験\] と、なる。

この結果を図示しよう。

この図に推定の不確実性を示すには、geom_smooth(method = 'lm', se = TRUE) とすればよい(が、 se = TRUE はデフォルトなので、seを指定する必要はない)。 デフォルトでは、95パーセント信頼区間が回帰直線の周りに表示される(この例では、区間が狭すぎてよく見えない)。

信頼度を変えたいとき、例えば50パーセント信頼区間を表示したいときは、次のようにlevelを指定する。

この直線の切片である13.88は、議員経験がない候補者の平均得票率(予測得票率)である。 予測値の式の「議員経験」に0を代入すれば、これは明らかである。 議員経験がある候補者の平均得票率(予測得票率)は、「議員経験」に1を代入することで得られる。 代入してみると、 \(13.88 +30.99 \cdot 1 = 44.87\) となる。

Rで議員経験ごとに平均得票率を求め、上の式から求めた予測値と一致するか確かめよう。 dplyr::group_by() を使うと、指定した変数の値が同じグループを作ることができる。

## # A tibble: 2 x 2
##   experience voteshare
##        <dbl>     <dbl>
## 1          0      13.9
## 2          1      44.9

このように、予測値は説明変数の値を与えられたときの、結果変数の平均値であることがわかる。


説明変数が連続値をとるとき(モデル2)

同様に、得票率を選挙費用(測定単位:100万円)で説明するモデルは、次のように推定できる。

## # A tibble: 2 x 5
##   term        estimate std.error statistic   p.value
##   <chr>          <dbl>     <dbl>     <dbl>     <dbl>
## 1 (Intercept)     7.74    0.757       10.2 1.61e- 23
## 2 expm            3.07    0.0958      32.1 1.14e-160

回帰直線を図示する。

95パーセント信頼区間を加える。

複数のモデルで回帰分析を実行し、結果を一つの表にまとめたいときは、texreg::screenreg() が便利である(HTMLに出力するなら htmlreg()、LaTeX用には texreg()を使う)。

## 
## ===============================
##              Model 1   Model 2 
## -------------------------------
## (Intercept)    13.88      7.74 
##                (0.62)    (0.76)
## experience     30.99           
##                (0.98)          
## expm                      3.07 
##                          (0.10)
## -------------------------------
## R^2             0.47      0.48 
## Adj. R^2        0.47      0.48 
## Num. obs.    1139      1124    
## RMSE           16.19     16.04 
## ===============================

HTMLに出力する場合。

Statistical models
Model 1 Model 2
(Intercept) 13.88 7.74
(0.62) (0.76)
experience 30.99
(0.98)
expm 3.07
(0.10)
R2 0.47 0.48
Adj. R2 0.47 0.48
Num. obs. 1139 1124
RMSE 16.19 16.04


授業の内容に戻る