## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>",
                      fig.width = 6, fig.height = 4)

## ----setup--------------------------------------------------------------------
library(panglm)

## ----iv-data------------------------------------------------------------------
set.seed(1)
N <- 300; TT <- 4
d <- data.frame(id = rep(seq_len(N), each = TT), wave = rep(seq_len(TT), N))
alpha <- rep(rnorm(N), each = TT)      # unobserved frailty
s0 <- rep(rnorm(N), each = TT)         # family background
need <- rnorm(N * TT)                  # time-varying health shock
d$school <- round(12 + 2 * s0 + alpha)
d$female <- rep(rbinom(N, 1, 0.5), each = TT)
d$offer <- rbinom(N * TT, 1, plogis(s0))
d$income <- rnorm(N * TT) + 0.5 * alpha
d$insured <- as.numeric(d$offer + need + rnorm(N * TT) > 0.5)
d$visits <- 1 + 0.6 * d$insured + 0.2 * d$income + alpha + need +
  rnorm(N * TT)

## ----fe2sls-------------------------------------------------------------------
coef(panglm(visits ~ insured + income, data = d, index = c("id", "wave"),
            model = "within"))
fe2sls <- paniv(visits ~ insured + income | offer + income, data = d,
                index = c("id", "wave"), model = "within", vcov = "cluster")
summary(fe2sls)

## ----ht-----------------------------------------------------------------------
d$cost <- 2 + 0.4 * d$offer + 0.2 * d$income + 0.3 * d$female +
  0.1 * d$school + alpha + rnorm(N * TT)
ht <- paniv(cost ~ offer + income + female + school | offer + female,
            data = d, index = c("id", "wave"), model = "hausmantaylor")
summary(ht)
coef(panglm(cost ~ offer + income + female + school, data = d,
            index = c("id", "wave"), model = "random"))

## ----gmm-data-----------------------------------------------------------------
set.seed(1)
N <- 300; TT <- 7
g <- data.frame(id = rep(seq_len(N), each = TT), wave = rep(seq_len(TT), N))
propensity <- rnorm(N)
g$price <- rnorm(N * TT)
g$cigs <- NA
for (i in seq_len(N)) {
  r <- (i - 1) * TT + seq_len(TT)
  y <- propensity[i] / 0.5 + rnorm(1)
  for (t in seq_len(TT)) {
    y <- 0.5 * y - 0.3 * g$price[r[t]] + propensity[i] + rnorm(1)
    g$cigs[r[t]] <- y
  }
}

## ----gmm----------------------------------------------------------------------
ab <- pangmm(cigs ~ lag(cigs, 1) + price | lag(cigs, 2:99), data = g,
             index = c("id", "wave"), model = "twostep")
summary(ab)
bb <- pangmm(cigs ~ lag(cigs, 1) + price | lag(cigs, 2:99), data = g,
             index = c("id", "wave"), transformation = "ld",
             model = "twostep", collapse = TRUE, maxlag = 4)
summary(bb)

## ----gmm-bounds---------------------------------------------------------------
g$cigs_lag <- ave(g$cigs, g$id, FUN = function(v) c(NA, head(v, -1)))
gl <- g[!is.na(g$cigs_lag), ]
ols <- panglm(cigs ~ cigs_lag + price, data = gl, index = c("id", "wave"),
              model = "pooling")
fe <- panglm(cigs ~ cigs_lag + price, data = gl, index = c("id", "wave"),
             model = "within")
c(fixed_effects = coef(fe)[["cigs_lag"]],
  difference_gmm = coef(ab)[["lag(cigs, 1)"]],
  system_gmm = coef(bb)[["lag(cigs, 1)"]],
  pooled_ols = coef(ols)[["cigs_lag"]])

## ----sel-data-----------------------------------------------------------------
set.seed(1)
N <- 300; TT <- 4
s <- data.frame(id = rep(seq_len(N), each = TT), wave = rep(seq_len(TT), N))
alpha <- rep(rnorm(N), each = TT)
s$treat <- rnorm(N * TT) + 0.5 * alpha
s$reminder <- rnorm(N * TT)
v <- rnorm(N * TT)
u <- 0.7 * v + rnorm(N * TT, sd = 0.7)
s$respond <- as.numeric(0.3 + 0.5 * s$treat + s$reminder + 0.3 * alpha +
                          v > 0)
s$qol <- ifelse(s$respond == 1, 1 + 0.5 * s$treat + alpha + u, NA)

## ----panselect----------------------------------------------------------------
coef(panglm(qol ~ treat, data = s[s$respond == 1, ],
            index = c("id", "wave"), model = "within"))
sel <- panselect(respond ~ treat + reminder, qol ~ treat, data = s,
                 index = c("id", "wave"), model = "within",
                 boot = 49, seed = 2)
summary(sel)

