Chapter 15 パネルデータ分析(作成中)

本章では、パネルデータ分析の基礎について説明する。

内容に入る前に、右上のプロジェクトのボックスの横が、前章で作成したプロジェクトの名前(たとえば、seminar_sociology_r)になっているかどうかを確認しておこう。なっていない場合は、右上のボックスをクリックして、「Open Project…」を選択し、前章で作成したRprojファイル(たとえば、seminar_sociology_r.Rprojといったような名前になっている)を選んで、プロジェクトを切り替えよう。

さらに、これまでの章で説明した以下のパッケージを読み込んだ上で、第4章で作成したデータを読み込んでpiaacというデータフレームに入れていることを前提とする。具体的には、以下のコードを実行しておく必要がある。

library(tidyverse)
library(gtsummary)
library(flextable)
library(haven)

本章では新たに以下のパッケージを利用する。あらかじめインストールしておくこと。

install.packages("fixest") # 固定効果モデルを推定するためのパッケージ

パッケージを読み込んでおく。

library(fixest)

15.1 パネルデータとは

15.1.1

アメリカ労働統計局が実施しているNational Longitudinal Survey of Youth(NLSY)のデモデータを利用する。このデータには、1969年時点で14歳から26歳の女性が含まれている。

nls <- read_dta("https://www.stata-press.com/data/r9/nlswork.dta")
nls %>% glimpse()
## Rows: 28,534
## Columns: 21
## $ idcode   <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2…
## $ year     <dbl> 70, 71, 72, 73, 75, 77, 78, 80, 83, 85, 87, 88, 71, 72, 73, 7…
## $ birth_yr <dbl> 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 5…
## $ age      <dbl> 18, 19, 20, 21, 23, 25, 26, 28, 31, 33, 35, 37, 19, 20, 21, 2…
## $ race     <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2…
## $ msp      <dbl> 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ nev_mar  <dbl> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ grade    <dbl> 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1…
## $ collgrad <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ not_smsa <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ c_city   <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ south    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ ind_code <dbl> 6, 4, 4, 4, 5, 12, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, …
## $ occ_code <dbl> 3, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 3, 3, 6, 6, 6, 6, 6, 6, 6…
## $ union    <dbl> NA, NA, 1, NA, NA, 0, NA, 1, 1, 1, 1, 1, 0, NA, NA, NA, 1, 1,…
## $ wks_ue   <dbl> 2, 22, 0, 0, 0, 0, 7, 0, NA, 0, 0, 0, 19, 6, 35, 0, 0, 0, NA,…
## $ ttl_exp  <dbl> 1.0833333, 1.2756410, 2.2564101, 2.3141024, 2.7756410, 3.7756…
## $ tenure   <dbl> 0.08333334, 0.08333334, 0.91666669, 0.08333334, 0.16666667, 1…
## $ hours    <dbl> 20, 44, 40, 40, 10, 32, 52, 45, 49, 42, 45, 48, 40, 40, 40, 4…
## $ wks_work <dbl> 27, 10, 51, 3, 24, 52, 4, 75, 101, 97, 95, 70, 13, 22, 17, 39…
## $ ln_wage  <dbl> 1.451214, 1.028620, 1.589977, 1.780273, 1.777012, 1.778681, 2…

15.1.2 パネルデータの特徴

nls %>% 
  select(idcode, age, ln_wage) %>% 
  head(n = 20)
## # A tibble: 20 × 3
##    idcode   age ln_wage
##     <dbl> <dbl>   <dbl>
##  1      1    18    1.45
##  2      1    19    1.03
##  3      1    20    1.59
##  4      1    21    1.78
##  5      1    23    1.78
##  6      1    25    1.78
##  7      1    26    2.49
##  8      1    28    2.55
##  9      1    31    2.42
## 10      1    33    2.61
## 11      1    35    2.54
## 12      1    37    2.46
## 13      2    19    1.36
## 14      2    20    1.21
## 15      2    21    1.55
## 16      2    23    1.83
## 17      2    25    1.73
## 18      2    26    1.69
## 19      2    28    1.73
## 20      2    30    1.81
model_ols <- lm(data = nls, ln_wage ~ age + race + collgrad + union)
model_fe <- feols(data = nls, ln_wage ~ age + race + collgrad + union | idcode)
## NOTES: 9,305 observations removed because of NA values (RHS: 9,305).
##        665 fixed-effect singletons were removed (665 observations).
## The variables 'race' and 'collgrad' have been removed because of collinearity
## (see $collin.var).
modelsummary(list(model_ols, model_fe), stars = TRUE)
(1) (2)
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
(Intercept) 1.470***
(0.018)
age 0.010*** 0.015***
(0.000) (0.000)
race -0.108***
(0.006)
collgrad 0.379***
(0.008)
union 0.209*** 0.106***
(0.007) (0.007)
Num.Obs. 19229 18564
R2 0.188 0.741
R2 Adj. 0.188 0.682
R2 Within 0.096
R2 Within Adj. 0.096
AIC 21351.2 6083.5
BIC 21398.4 33383.1
Log.Lik. -10669.608
RMSE 0.42 0.24
Std.Errors IID
FE: idcode X
model1 <- lm(data = nls, ln_wage ~ age + race + collgrad + union)
model2 <- feols(data = nls, ln_wage ~ age + race + collgrad + union,
                panel.id = "idcode", vcov = "cluster")
## NOTE: 9,305 observations removed because of NA values (RHS: 9,305).
model3 <- feols(data = nls, ln_wage ~ age + race + collgrad + union | idcode,
                panel.id = "idcode", vcov = "cluster")
## NOTES: 9,305 observations removed because of NA values (RHS: 9,305).
##        665 fixed-effect singletons were removed (665 observations).
## The variables 'race' and 'collgrad' have been removed because of collinearity
## (see $collin.var).
modelsummary(list(model1, model2, model3), stars = TRUE)
(1) (2) (3)
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
(Intercept) 1.470*** 1.470***
(0.018) (0.027)
age 0.010*** 0.010*** 0.015***
(0.000) (0.001) (0.001)
race -0.108*** -0.108***
(0.006) (0.013)
collgrad 0.379*** 0.379***
(0.008) (0.015)
union 0.209*** 0.209*** 0.106***
(0.007) (0.013) (0.010)
Num.Obs. 19229 19229 18564
R2 0.188 0.188 0.741
R2 Adj. 0.188 0.188 0.682
R2 Within 0.096
R2 Within Adj. 0.096
AIC 21351.2 21349.2 6083.5
BIC 21398.4 21388.5 33383.1
Log.Lik. -10669.608
RMSE 0.42 0.42 0.24
Std.Errors by: idcode by: idcode
FE: idcode X