A Simple Life Cycle Model

model
Author

Kazuharu Yanagimoto

Published

March 21, 2024

Model

This note examines the model of Parallel Computing by Rcpp.

For \(t = 1, \dots, T\), households solve

\[ \begin{aligned} V(t, e, x) =& \max_{c, x'} \frac{c^{1 - \sigma}}{1 - \sigma} + \beta \mathbb{E}V(t + 1, e', x') \\ &\text{s.t. } \\ & c + x' \le (1 + r)x + ew \\ & \text{Pr}(e' | e) = \Gamma(e) \\ & x' \ge 0 \end{aligned} \]

Code
# Grid for x
nx = 100
xmin = 0.1
xmax = 4.0

x_grid = seq(from = xmin, to = xmax, by = (xmax - xmin) / (nx - 1))

# Grid for e: parameters for Tauchen
ne = 15
ssigma_eps = 0.02058
llambda_eps = 0.99
m = 1.5

P = Rtauchen(ne, ssigma_eps, llambda_eps, m)
e_grid = exp(Tgrid(ne, ssigma_eps, llambda_eps, m))

# Utility function
ssigma = 2
bbeta = 0.97
T = 10

# Prices
r = 0.07
w = 5

Results

Code
V <- solve(nx, x_grid, ne, e_grid, P, ssigma, bbeta, T, r, w)

tibble(e = rep(1:ne, T * nx), v = V) |>
  mutate(t = (row_number() - 1) %/% (nx * ne) + 1) |>
  arrange(e, t) |>
  mutate(x = rep(x_grid, T * ne), e = factor(e)) |>
  filter(t %in% c(1, 4, 7, 10), e %in% c(1, 8, 15)) |>
  mutate(
    lbl_facet = factor(
      paste0("t = ", t),
      levels = c("t = 1", "t = 4", "t = 7", "t = 10")
    )
  ) |>
  ggplot(aes(x = x, y = v, color = e)) +
  geom_line() +
  scale_color_viridis_d(
    option = "rocket",
    end = 0.85,
    labels = ~latex2exp::TeX(sprintf("$e_{%s}$", .x))
  ) +
  facet_wrap(~lbl_facet) +
  labs(x = "x", y = NULL, title = "Value Function") +
  theme(legend.position = c(0.9, 0.1), panel.grid.major.x = element_blank())

Simulations

Code
simulate <- function(ssigma, bbeta) {
  V <- solve(nx, x_grid, ne, e_grid, P, ssigma, bbeta, T, r, w)

  tibble(ssigma = ssigma, bbeta = bbeta, e = rep(1:ne, T * nx), v = V) |>
    mutate(t = (row_number() - 1) %/% (nx * ne) + 1) |>
    arrange(e, t) |>
    mutate(x = rep(x_grid, T * ne))
}

ssigmas <- seq(2, 4, by = 0.1)
bbetas <- seq(0.92, 0.99, by = 0.01)
exgrid <- expand.grid(ssigmas, bbetas)

df_sim <- map2(exgrid$Var1, exgrid$Var2, simulate) |>
  list_rbind() |>
  filter(e %in% c(1, 8, 15)) |>
  mutate(lbl = recode_factor(e, `1` = "e₁", `8` = "e₈", `15` = "e₁₅"))

ojs_define(data = df_sim)