19.5 Example: Insurance takeup

  • rural China
  • households randomly informed about insurance
    • default 1: only information
    • default 2: information & buy insurance

How much does your friends buying insurance affect your own takeup of insurance?

  • adding FE
    • easy with fixest
    • more difficult with gmm –> add as factor

19.5.1 2SLS

# There are many ways to run 2SLS; 
# the most common is ivreg from the AER package. 
# But we'll use feols from fixest for speed and ease 
# of fixed-effects additions later
library(tidyverse); library(modelsummary); library(fixest)
d <- causaldata::social_insure

# Include just the outcome and controls first, then endogenous ~ instrument 
# in the second part, and for this study we cluster on address
m <- feols(takeup_survey ~ male + age + agpop + ricearea_2010 +
            literacy + intensive + risk_averse + disaster_prob +
            factor(village) | pre_takeup_rate ~ default, 
            cluster = ~address, data = d)

# Show the first and second stage, omitting all
# the controls for ease of visibility
msummary(list('First Stage' = m$iv_first_stage[[1]],
                'Second Stage' = m),
                coef_map = c(default = 'First Round Default',
                fit_pre_takeup_rate = 'Friends Purchase Behavior'),         
                stars = c('*' = .1, '**' = .05, '***' = .01))
First Stage Second Stage
* p < 0.1, ** p < 0.05, *** p < 0.01
First Round Default 0.118***
(0.034)
Friends Purchase Behavior 0.791***
(0.273)
Num.Obs. 1378 1378
R2 0.469 0.127
R2 Adj. 0.448 0.092
AIC -775.7 1911.4
BIC -498.6 2188.5
RMSE 0.18 0.47
Std.Errors by: address by: address

19.5.2 GMM

library(modelsummary); library(gmm)
d <- causaldata::social_insure
# Remove all missing observations ourselves
d <- d %>%
    select(takeup_survey, male, age, agpop, ricearea_2010,
           literacy, intensive, risk_averse, disaster_prob,
           village, address, pre_takeup_rate, default) %>%
    na.omit()

m <- gmm(takeup_survey ~ male + age + agpop + ricearea_2010 +
         literacy + intensive + risk_averse + disaster_prob +
         factor(village) + pre_takeup_rate,
         ~ male + age + agpop + ricearea_2010 +
         literacy + intensive + risk_averse + disaster_prob +
         factor(village) + default, data = d)

# We can apply the address clustering most easily in msummary
msummary(m, 
         vcov =  ~address, 
         stars = c('*' = .1, '**' = .05, '***' = .01),
         coef_map = "pre_takeup_rate")
(1)
* p < 0.1, ** p < 0.05, *** p < 0.01
pre_takeup_rate 0.791***
(0.251)
Num.Obs. 1378
Std.Errors by: address