plm パッケージの Labor Supply データを使って、賃金が子供の数に及ぼす影響を推測するために、固定効果モデルを推定しなさい。
子供数が賃金を高める可能性がある一方、逆に賃金が高いと子供を生み育てやすい、という可能性も考えられる。以下では、LaborSupply データを使って賃金が子供数に及ぼす影響を検討していく。
LaborSupply データは 1979~1988年の間に行われたパネル調査の結果(有効対象者数が 532人のバランスのとれたパネルデータ)であるが、対象者は男性で 22~60 歳である。
同居している子供数がデータに含まれているが、子供数は図1の右側のグラフのように、30歳代後半までは増加するがその後減少する。これは大学に入学したり、仕事についたり、結婚した子供が親と別居するようになるからであると考えられる。これは親の賃金が減少したからだとは考えにくい。賃金は生むか生まないかを決定するときに影響があるかもしれないが、その後賃金が下がったからといって、自由に子供の数を減らすことはできない。それゆえ、賃金が影響するのは、子供が増えるときであって、減るときではないだろう。このように考えるならば、固定効果モデルで推定して意味があるのは、子供の平均的な数が増加する 22~34歳程度のあいだであろう。
以下ではポアソン回帰と負二項回帰の固定効果モデルを使って、賃金が子供数に及ぼす影響を検討する。主なコントロール変数は年齢で、労働時間や障害の有無も最初のモデルには投入したが、まったく光華がないので、その後のモデルには投入していない。分析はすべてのサンプルと35歳未満のサンプルで行った。
library(plm)
data("LaborSupply")
summary(LaborSupply[, 1:5])
## lnhr lnwg kids age disab
## Min. :2.770 Min. :-0.260 Min. :0.000 Min. :22.00 Min. :0.0000
## 1st Qu.:7.580 1st Qu.: 2.370 1st Qu.:1.000 1st Qu.:32.00 1st Qu.:0.0000
## Median :7.650 Median : 2.640 Median :2.000 Median :38.00 Median :0.0000
## Mean :7.657 Mean : 2.609 Mean :1.556 Mean :38.92 Mean :0.0609
## 3rd Qu.:7.780 3rd Qu.: 2.860 3rd Qu.:2.000 3rd Qu.:45.00 3rd Qu.:0.0000
## Max. :8.560 Max. : 4.690 Max. :6.000 Max. :60.00 Max. :1.0000
table(LaborSupply$year)
##
## 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988
## 532 532 532 532 532 532 532 532 532 532
par(mfrow=c(1,2))
plot(jitter(kids) ~ jitter(year), data = LaborSupply)
lm1 <- lm(kids ~ year + I(year^2), LaborSupply)
pred1 <- predict(lm1, data.frame(year=1979:1988))
lines(1979:1988, pred1, col="red") # 二次曲線は予測値を計算してから lines() で描画
plot(jitter(kids) ~ jitter(age), data=LaborSupply)
lm2 <- lm(kids ~ age + I(age^2), LaborSupply)
pred2 <- predict(lm2, data.frame(age=22:60))
lines(22:60, pred2, col="red")
下の表の最初のモデルは、すべてのサンプルでポアソン回帰の固定効果モデルを推定した結果である。対数時給の係数は予測通り正の値を示しているが、有意ではない。サンプルを35歳未満に限定し、まったく効果のなかった障害の有無と労働時間はモデルから取り除いたのが、2番目のモデルである。このモデルでは賃金の係数は高まり、有意になっている。同じモデルを負二項回帰モデルでも推定したが、dispersion parameter の推定が収束しなかった。
ポアソン回帰の結果だけでは、標準誤差の正しさに不安が残るので、ブートストラップで賃金の係数の 95% 信頼区間を計算した。confint() 関数は method=“boot” を引数に指定すればブートストラップ法で区間推定してくれるが、パラメトリック・ブートストラップなので、本当にポアソン分布しているかどうか不安な状態ではあまり意味がない。固定効果モデルの結果を Boot() で推定してみると、賃金の係数の標準誤差は 0.056 で有意になるが、これも抽出単位が個人ではない(パーソン・イヤーが抽出単位になる)ので、あまり意味が無いと思う。そこで、自分で個人をリサンプリングするプログラムを書いてブートストラップ推定してみたところ、賃金の係数の95% 信頼区間は、0.101~0.348 で有意である。標準誤差は 0.075 でむしろポアソン回帰の結果よりも小さくなった。ポアソン分布よりもむしろ残差のバラつきは小さいのかもしれない。固定効果モデルで、年齢もモデルに投入しているので、かなり残差は小さいはずである。
以上を総合すると、少なくとも35歳未満の時期には、賃金が子供の数を増やす効果は、統計的に有意であるといえる。
pois1 <- glm(kids ~ -1 + factor(id) + age + I(age^2) + lnwg + disab + lnhr,
data=LaborSupply, family = poisson)
d0 <- subset(LaborSupply, age < 35) # 35歳未満にデータを限定
valid.id <- unique(d0$id)[table(d0$id) > 1] # 2時点以上データがある個人IDを取り出す
d1 <- d0[is.element(d0$id, valid.id), ] # 2時点以上データがある個人だけのデータを作る
# table(d1$id)
table(d1$year)
##
## 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988
## 285 285 267 237 204 166 142 119 93 63
pois2 <- update(pois1, ~-1 + factor(id) + age + I(age^2) + lnwg, data = d1)
library(MASS)
nb1 <- glm.nb(kids ~ -1 + factor(id) + age + I(age^2) + lnwg, data=d1)
## Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace > : iteration limit
## reached
## Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace = control$trace > : iteration limit
## reached
nb1$theta
## [1] 75019.58
nb1$SE.theta
## [1] 208050.9
# ハイブリッド・モデルのためのスクリプト
d1$age.sq <- (d1$age/10) ^ 2
d1$m.age <- ave(d1$age/10, d1$id)
d1$m.age.sq <- ave(d1$age.sq, d1$id)
d1$m.lnwg <- ave(d1$lnwg, d1$id)
d1$d.age <- d1$age/10 - d1$m.age
d1$d.age.sq <- d1$age.sq - d1$m.age.sq
d1$d.lnwg <- d1$lnwg - d1$m.lnwg
# head(d1, 20)
library(lme4)
poisr1 <- glmer(kids ~ d.age + d.age.sq + d.lnwg + (1 | id),
data=d1, family=poisson)
library(texreg)
screenreg(list(pois1, pois2, nb1), omit.coef = "id", digits=3,
custom.model.names = c("ポアソン全サンプル", "ポアソン35歳未満","負二項35歳未満"))
##
## ===========================================================
## ポアソン全サンプル ポアソン35歳未満 負二項35歳未満
## -----------------------------------------------------------
## age 0.536 *** 0.647 *** 0.647 ***
## (0.024) (0.131) (0.131)
## I(age^2) -0.007 *** -0.009 *** -0.009 ***
## (0.000) (0.002) (0.002)
## lnwg 0.091 0.236 * 0.236 *
## (0.065) (0.115) (0.115)
## disab 0.034
## (0.067)
## lnhr 0.002
## (0.049)
## -----------------------------------------------------------
## AIC 12757.061 5047.942 5049.980
## BIC 16290.107 6645.785 6653.352
## Log Likelihood -5841.531 -2234.971 -2234.990
## Deviance 1321.767 372.144 372.139
## Num. obs. 5320 1861 1861
## ===========================================================
## *** p < 0.001, ** p < 0.01, * p < 0.05
# 負二項回帰の推定が収束しなかったので、ポアソン回帰の係数をブートストラップで再推定
# (cf1 <- confint(poisr1, method="boot")) # 推定はできたがあまり意味なし
# confint(poisr1, method="boot", type="semiparametric", use.u=TRUE) # 意味はあるがエラーが出る
# (cf2 <- Boot(pois2)) # あまり意味が無いがやってみた
##### ブートストラップのためのプログラム ######
# b <- numeric(1000) # 計算結果の係数を格納するベクトル
# for(i in 1:1000){ # 1000回繰り返しのブートストラップ
# id1 <- sample(unique(d1$id), 310, replace=TRUE) # 個人を抽出
# d2 <- NULL # 空のオブジェクト、リサンプリングしたデータフレーム
# for(j in 1:310){
# d2 <- rbind(d2, d1[d1$id == id1[j], ]) # 抽出した個人をデータに加える
# }
# poisr2 <- update(poisr1, data=d2) # リサンプリングしたデータ d2 で poisr1 と同じ分析
# b[i] <- fixef(poisr2)[4] # 賃金の係数だけ取り出す
# }
# sd(b)
# quantile(b, c(0.05, 0.95))
思い起してみるに、問題やデータの性質を考えると、イベント・ヒストリー分析のほうが適切なので、ここまで頑張ってブートストラップのプログラムを書くぐらいならば、イベント・ヒストリー分析したほうが生産的だった。まあ、ブートストラップの勉強にはなったが。
plm パッケージの Males データを使って、賃金が結婚に及ぼす影響を固定効果モデルで検討しなさい。