Load Packages
library(broom)
library(foreign)
library(ggstance)
library(haven)
library(Hmisc)
library(nnet)
library(reshape2)
library(stargazer)
library(tidyverse)
anes1992.POR
は統計ソフト SPSS で使われるデータHmisc パッケージ
をダウンロードしてから RSdutio
でロードlibrary(Hmisc)
→ データを読み込む
<- spss.get("data/anes1992.POR",
anes use.value.labels = FALSE) #変数の値に付けられたラベルをオリジナルの数字として読み込むコマンド
dim(anes)
[1] 2485 2105
vote
: 投票選択(1: Perot, 2: Bush, 3: Clionton)econ
: 経済悪化認識
1: 良くなった
2: 変わらない
3: 悪くなった
repub
: 共和党支持
1: 共和党支持
0: それ以外
dem
: 民主党支持
1: 民主党支持
0: それ以外
edu
: 教育程度
1-17 (教育を受けた年数)
<- anes %>%
anes select(V925609, V923535, V900317, V900554)
<- anes %>%
anes mutate(vote = NA) %>%
mutate(econ = NA) %>%
mutate(repub = NA) %>%
mutate(dem = NA) %>%
mutate(edu = NA)
$vote[anes$V925609 == 1] <- "Bush"
anes$vote[anes$V925609 == 2] <- "Clinton"
anes$vote[anes$V925609 == 3] <- "Perot" anes
1: 良くなった => 1 に変更
3: 変わらない => 2 に変更
5: 悪くなった => 3 に変更
$econ[anes$V923535 == 1] <- 1
anes$econ[anes$V923535 == 3] <- 2
anes$econ[anes$V923535 == 5] <- 3 anes
変数 V900317 に含まれている値は 1, 3, 4, 5 の 5 種類
1: 共和党支持者
2: 無党派
3: 支持なし
4: その他の政党
5: 民主党支持
この変数から二つの変数 (repub, dem) を作る
V900317 の中身を確認
table(anes$V900317)
1 2 3 4 5
330 386 94 3 540
$repub[anes$V900317 == 1] <- 1
anes$repub[anes$V900317 >= 2 & anes$V900317 <=5] <- 0 anes
変数 V900317 に含まれている値は 1, 3, 4, 5 の 5 種類
1: 共和党支持者
2: 無党派
3: 支持なし
4: その他の政党
5: 民主党支持
この変数から二つの変数 (repub, dem) を作る
V900317 の中身を確認
table(anes$V900317)
1 2 3 4 5
330 386 94 3 540
$dem[anes$V900317 == 5] <- 1
anes$dem[anes$V900317 >= 1 & anes$V900317 <= 4] <- 0 anes
unique(anes$V900554)
[1] NA 14 8 12 16 11 17 9 13 7 15 10 6 2 5 3 0 4 1
$edu <- anes$V900554 anes
<- anes %>%
anes select(vote, econ, repub, dem, edu)
summary(anes)
vote econ repub dem
Length:2485 Min. :1.000 Min. :0.0000 Min. :0.0000
Class :character 1st Qu.:3.000 1st Qu.:0.0000 1st Qu.:0.0000
Mode :character Median :3.000 Median :0.0000 Median :0.0000
Mean :2.772 Mean :0.2439 Mean :0.3991
3rd Qu.:3.000 3rd Qu.:0.0000 3rd Qu.:1.0000
Max. :3.000 Max. :1.0000 Max. :1.0000
NA's :217 NA's :1132 NA's :1132
edu
Min. : 0.00
1st Qu.:12.00
Median :12.00
Mean :12.56
3rd Qu.:14.25
Max. :17.00
NA's :1129
anes
から欠損値 (NA
)
を削除する= na.omit(anes) anes
::datatable(anes) DT
str(anes)
'data.frame': 786 obs. of 5 variables:
$ vote : chr "Perot" "Clinton" "Bush" "Clinton" ...
$ econ : num 3 3 3 3 3 3 3 2 3 3 ...
$ repub: num 0 0 1 0 0 0 0 1 0 0 ...
$ dem : num 1 1 0 1 1 0 0 0 0 1 ...
$ edu : 'labelled' int 14 14 8 12 12 16 12 8 12 11 ...
..- attr(*, "label")= Named chr "EDUCATION: R"
.. ..- attr(*, "names")= chr "V900554"
- attr(*, "na.action")= 'omit' Named int [1:1699] 1 2 3 4 5 6 7 8 9 10 ...
..- attr(*, "names")= chr [1:1699] "1" "2" "3" "4" ...
vote
の型を character
から
factor
に変更する$vote <- as.factor(anes$vote) anes
nnet
packageを使うrelevel
function を使って応答変数
vote
のベースラインを決める$vote <- relevel(anes$vote, ref = "Perot") anes
multinom
関数を使って多項ロジットを実行する<- multinom(vote ~ econ +
model_1 +
repub +
dem
edu,data = anes)
# weights: 18 (10 variable)
initial value 863.509259
iter 10 value 672.629849
final value 670.413362
converged
stargazer(model_1, type="html")
Dependent variable: | ||
Bush | Clinton | |
(1) | (2) | |
econ | -0.593*** | 0.196 |
(0.204) | (0.223) | |
repub | 0.776*** | -1.036*** |
(0.247) | (0.294) | |
dem | -0.417 | 1.240*** |
(0.284) | (0.234) | |
edu | 0.003 | -0.023 |
(0.042) | (0.039) | |
Constant | 1.857** | 0.258 |
(0.774) | (0.798) | |
Akaike Inf. Crit. | 1,360.827 | 1,360.827 |
Note: | p<0.1; p<0.05; p<0.01 |
出力された係数は log odds
(=
logit
)
従属変数 vote の baseline = Perot
econ (Bush) の係数 (-0.593) の意味
→ 経済が悪化したと認識する有権者ほど、Bush ではなく Perot
に投票する
repub (Bush) の係数 (0.776) の意味
→ 無党派に比べて共和党支持者ほど、Perot ではなく Bush
に投票する
repub (Clinton) の係数 (-1.036) の意味
→ 無党派に比べて共和党支持者ほど、Clinton ではなく Perot
に投票する
dem (Clinton) の係数 (1.240) の意味
→ 無党派に比べて民主党支持者ほど、Perot ではなく Clinton
に投票する
ここで推定するモデルは次のとおり
\[ln(\frac{P(vote = Bush)}{P(vote = Perot)}) = 1.857 -0.593econ + 0.776repub - 0.417dem + 0.003edu\]
\[ln(\frac{P(vote = Clinton)}{P(vote = Perot)}) = 0.258 + 0.196econ - 1.036repub + 1.240dem -0.023edu\]
multinom
関数には p
値を出力する機能が付いていない<- summary(model_1)$coefficients/summary(model_1)$standard.errors
z z
(Intercept) econ repub dem edu
Bush 2.3982571 -2.9104878 3.144169 -1.467071 0.07291528
Clinton 0.3236059 0.8761285 -3.521014 5.310532 -0.58033862
# 2-tailed z model_1
<- (1 - pnorm(abs(z), 0, 1)) * 2
p p
(Intercept) econ repub dem edu
Bush 0.0164733 0.003608651 0.0016655907 1.423569e-01 0.9418735
Clinton 0.7462364 0.380960168 0.0004299004 1.093056e-07 0.5616863
<- tidy(model_1) %>%
pres_mlogit filter(term != "(Intercept)") %>%
mutate(
upr95 = estimate + 1.96 * `std.error`,
lwr95 = estimate - 1.96 * `std.error`,
y.level = if_else(y.level == "Bush", "Bush", "Clinton"),
term = factor(term, c("econ", "repub", "dem", "edu"))
)
<- c("econ" = "経済悪化認識",
coef_label "repub" = "共和党支持",
"dem" = "民主党支持",
"edu" = "教育程度")
<- pres_mlogit %>%
pres_mlogit mutate(
y.level = fct_rev(fct_inorder(y.level)),
term = fct_rev(term)
%>%
) ggplot(aes(x = estimate, y = term)) +
geom_vline(xintercept = 0, size = .7, colour = "lightgreen") +
geom_pointrangeh(aes(xmin = lwr95, xmax = upr95,
col = y.level, shape = y.level),
size = .6, position = position_dodgev(height = .75)) +
labs(x = "Estimate (Log Odds)", y = NULL) +
geom_text(aes(x = 1.1, y = 0.6), label = "(Base category = Perot)") +
scale_y_discrete(labels = coef_label) +
scale_color_manual(name = "Candidates",
values = c(`Bush` = "red",
`Clinton` = "blue"),
guide = guide_legend(reverse = TRUE)) +
scale_shape_manual(name = "Candidates",
values = c(`Bush` = 16,
`Clinton` = 15),
guide = guide_legend(reverse = TRUE)) +
theme(legend.position = c(.5, .5),
legend.box.background = element_rect(color = "black"),
legend.box.margin = margin(t = 1, l = 1)) +
theme_bw(base_family = "HiraKakuProN-W3")
pres_mlogit
fitted
関数を使って、予測確率を計算できるhead(fitted(model_1))
Perot Bush Clinton
1127 0.1312976 0.09755898 0.7711434
1128 0.1312976 0.09755898 0.7711434
1129 0.2441778 0.58729487 0.1685273
1130 0.1268679 0.09369150 0.7794406
1131 0.1268679 0.09369150 0.7794406
1132 0.2660521 0.30182754 0.4321204
summary(fitted(model_1))
Perot Bush Clinton
Min. :0.1055 Min. :0.07610 Min. :0.04019
1st Qu.:0.1291 1st Qu.:0.09756 1st Qu.:0.16172
Median :0.1688 Median :0.28750 Median :0.45595
Mean :0.1896 Mean :0.31679 Mean :0.49364
3rd Qu.:0.2478 3rd Qu.:0.59889 3rd Qu.:0.77114
Max. :0.2684 Max. :0.85432 Max. :0.81764
dvote
) を作り、その中に変数の平均値を入れる<- data.frame(vote = c("Perot", "Bush", "Clinton"),
dvote econ = mean(anes$econ),
repub = mean(anes$repub),
dem = mean(anes$dem),
edu = mean(anes$edu))
dvote
vote econ repub dem edu
1 Perot 2.774809 0.264631 0.4427481 13.09669
2 Bush 2.774809 0.264631 0.4427481 13.09669
3 Clinton 2.774809 0.264631 0.4427481 13.09669
predict(model_1,
newdata = dvote,
"probs")
Perot Bush Clinton
1 0.222399 0.2917931 0.4858079
2 0.222399 0.2917931 0.4858079
3 0.222399 0.2917931 0.4858079
summary(anes)
vote econ repub dem edu
Perot :149 Min. :1.000 Min. :0.0000 Min. :0.0000 Min. : 2.0
Bush :249 1st Qu.:3.000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:12.0
Clinton:388 Median :3.000 Median :0.0000 Median :0.0000 Median :13.0
Mean :2.775 Mean :0.2646 Mean :0.4427 Mean :13.1
3rd Qu.:3.000 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:16.0
Max. :3.000 Max. :1.0000 Max. :1.0000 Max. :17.0
econ
) を 1(最善)から
3(最悪)に 1 単位ずつ変化させたデータフレーム (decon
)
を作る<- data.frame(repub = rep(c("0", "1"), each = 9),
decon econ = rep(c(1:3), 3)) %>%
mutate(dem = 0.4427,
edu = 13.1,
repub = 0.2646)
::datatable(decon) DT
decon
) と model_1
で得られた推定された平均予測確率をマージする## store the predicted probabilities for each value of econ
<- cbind(decon,
pp.econ predict(model_1,
newdata = decon,
type = "probs",
se = TRUE))
pp.econ
repub econ dem edu Perot Bush Clinton
1 0.2646 1 0.4427 13.1 0.1586363 0.5965452 0.2448186
2 0.2646 2 0.4427 13.1 0.2018341 0.4193494 0.3788165
3 0.2646 3 0.4427 13.1 0.2257065 0.2590993 0.5151942
4 0.2646 1 0.4427 13.1 0.1586363 0.5965452 0.2448186
5 0.2646 2 0.4427 13.1 0.2018341 0.4193494 0.3788165
6 0.2646 3 0.4427 13.1 0.2257065 0.2590993 0.5151942
7 0.2646 1 0.4427 13.1 0.1586363 0.5965452 0.2448186
8 0.2646 2 0.4427 13.1 0.2018341 0.4193494 0.3788165
9 0.2646 3 0.4427 13.1 0.2257065 0.2590993 0.5151942
10 0.2646 1 0.4427 13.1 0.1586363 0.5965452 0.2448186
11 0.2646 2 0.4427 13.1 0.2018341 0.4193494 0.3788165
12 0.2646 3 0.4427 13.1 0.2257065 0.2590993 0.5151942
13 0.2646 1 0.4427 13.1 0.1586363 0.5965452 0.2448186
14 0.2646 2 0.4427 13.1 0.2018341 0.4193494 0.3788165
15 0.2646 3 0.4427 13.1 0.2257065 0.2590993 0.5151942
16 0.2646 1 0.4427 13.1 0.1586363 0.5965452 0.2448186
17 0.2646 2 0.4427 13.1 0.2018341 0.4193494 0.3788165
18 0.2646 3 0.4427 13.1 0.2257065 0.2590993 0.5151942
econ
) の値ごとの Perot, Bush,
Clinton それぞれの平均予測確率は異なるwide
形式のデータを long
形式のデータに melt
関数を使って変換し lpp
と名前を付ける## melt data set to long for ggplot2
<- melt(pp.econ,
lpp id.vars = "econ",
value.name = "probability")
::datatable(lpp) DT
variable
の値を確認するunique(lpp$variable)
[1] repub dem edu Perot Bush Clinton
Levels: repub dem edu Perot Bush Clinton
<- lpp %>%
lpp ::filter(variable !="repub") %>%
dplyr::filter(variable !="dem") %>%
dplyr::filter(variable !="edu") dplyr
::datatable(lpp) DT
theme_set(theme_bw(base_family = "HiraKakuProN-W3"))
## plot predicted probabilities across Margin values for each level of pcr
## facetted by program type
<- ggplot(lpp,
line_repub aes(x = econ,
y = probability,
color = variable)) +
geom_line() +
labs(x = "経済悪化の認識",
y = "投票",
fill = "候補者") +
ggtitle("経済悪化の認識が投票に与える影響: 1992年米國大統領選挙")
line_repub
結果の解釈 ・経済の悪化を認識している人ほど現職の大統領である
Bush に投票しない
・経済の悪化を認識している人ほど野党候補者である
Clinton に投票する
econ
) を 1(最善)から
3(最悪)に 1
単位ずつ変化させた時の「共和党支持者と民主党支持者ごとの」平均予測確率を可視化するdecon_2
) を作る<- data.frame(repub = rep(c("0", "1"), each = 9),
decon_2 econ = rep(c(1:3), 3)) %>%
mutate(dem = 0.4427,
edu = 13.1,
repub = as.numeric(repub)) # 平均値を指定しないことに注意
::datatable(decon_2) DT
## store the predicted probabilities for each value of pcr and Margin
<- cbind(decon_2,
pp.econ_2 predict(model_1,
newdata = decon_2,
type = "probs",
se = TRUE))
pp.econ_2
repub econ dem edu Perot Bush Clinton
1 0 1 0.4427 13.1 0.1641394 0.5026687 0.33319187
2 0 2 0.4427 13.1 0.1937695 0.3278652 0.47836528
3 0 3 0.4427 13.1 0.2025416 0.1893498 0.60810852
4 0 1 0.4427 13.1 0.1641394 0.5026687 0.33319187
5 0 2 0.4427 13.1 0.1937695 0.3278652 0.47836528
6 0 3 0.4427 13.1 0.2025416 0.1893498 0.60810852
7 0 1 0.4427 13.1 0.1641394 0.5026687 0.33319187
8 0 2 0.4427 13.1 0.1937695 0.3278652 0.47836528
9 0 3 0.4427 13.1 0.2025416 0.1893498 0.60810852
10 1 1 0.4427 13.1 0.1194127 0.7945580 0.08602932
11 1 2 0.4427 13.1 0.1800987 0.6621042 0.15779711
12 1 3 0.4427 13.1 0.2440938 0.4958077 0.26009847
13 1 1 0.4427 13.1 0.1194127 0.7945580 0.08602932
14 1 2 0.4427 13.1 0.1800987 0.6621042 0.15779711
15 1 3 0.4427 13.1 0.2440938 0.4958077 0.26009847
16 1 1 0.4427 13.1 0.1194127 0.7945580 0.08602932
17 1 2 0.4427 13.1 0.1800987 0.6621042 0.15779711
18 1 3 0.4427 13.1 0.2440938 0.4958077 0.26009847
by(pp.econ_2[, 5:7], pp.econ_2$repub, colMeans)
pp.econ_2$repub: 0
Perot Bush Clinton
0.1868169 0.3399612 0.4732219
------------------------------------------------------------
pp.econ_2$repub: 1
Perot Bush Clinton
0.1812018 0.6508233 0.1679750
非共和党支持者 (repub = 0) よりも共和党支持者 (repub = 1) の方が
Bush に投票する (65.1% vs 34%)
共和党支持者 (repub = 1) よりも共和党支持者 (repub = 0) の方が Clinton に投票する (47.3% vs 16.8%)
経済悪化の認識の度合い (econ
) の値ごとの Perot,
Bush, Clinton それぞれの平均予測確率は異なる
→ 可視化するため、wide
形式のデータを long
形式のデータに melt
関数を使って変換し lpp_2
と名前を付ける
## melt data set to long for ggplot2
<- melt(pp.econ_2,
lpp_2 id.vars = c("repub", "econ"), # repub と econ の二つの変数を残す
value.name = "probability")
unique(lpp_2$variable)
[1] dem edu Perot Bush Clinton
Levels: dem edu Perot Bush Clinton
<- lpp_2 %>%
lpp_2 ::filter(variable !="dem") %>%
dplyr::filter(variable !="edu") dplyr
::datatable(lpp_2) DT
theme_set(theme_bw(base_family = "HiraKakuProN-W3"))
## plot predicted probabilities across Margin values for each level of pcr
## facetted by program type
<- ggplot(lpp_2,
line_repub_2 aes(x = econ,
y = probability,
colour = variable)) +
facet_grid(repub ~., scales = "free") +
geom_line() +
labs(x = "経済悪化の認識",
y = "投票確率",
fill = "候補者") +
ggtitle("経済悪化の認識が投票に与える影響(共和党支持=1):92年米国大統領選挙")
line_repub_2
library(MNP)
<- mnp(as.factor(vote) ~ econ +
model_2 +
repub +
dem
edu, data = anes)
summary(model_2)
Call:
mnp(formula = as.factor(vote) ~ econ + repub + dem + edu, data = anes)
Coefficients:
mean std.dev. 2.5% 97.5%
(Intercept):Bush 0.783831 0.436876 0.030191 1.706
(Intercept):Clinton -0.438091 0.569316 -1.640787 0.522
econ:Bush -0.365981 0.153291 -0.679231 -0.114
econ:Clinton 0.243452 0.156397 -0.023275 0.578
repub:Bush 0.630262 0.268810 0.183406 1.156
repub:Clinton -0.766057 0.322686 -1.380980 -0.148
dem:Bush -0.506920 0.278020 -1.013459 -0.001
dem:Clinton 0.801020 0.286052 0.260367 1.309
edu:Bush 0.003215 0.021928 -0.038680 0.052
edu:Clinton -0.017639 0.021607 -0.065060 0.021
Covariances:
mean std.dev. 2.5% 97.5%
Bush:Bush 0.9809 0.5123 0.1630 1.794
Bush:Clinton -0.1564 0.3970 -0.9052 0.527
Clinton:Clinton 1.0191 0.5123 0.2062 1.837
Base category: Perot
Number of alternatives: 3
Number of observations: 786
Number of estimated parameters: 12
Number of stored MCMC draws: 5000
pres_mlogit