The Grossman Model

Health as capital

Most goods are consumed and gone. Health is different — it is a stock that provides a flow of services over time. You start life with some endowment of health, it depreciates (you age, get sick, suffer wear and tear), and you can invest in it through medical care, diet, exercise, and other health inputs.

Michael Grossman (1972) formalized this idea. In his model:

  • \(H_t\) = health stock at age \(t\)
  • \(\delta_t\) = depreciation rate at age \(t\) (increases with age)
  • \(I_t\) = gross investment in health (medical care, etc.)
  • Health evolves as: \(H_{t+1} = H_t - \delta_t H_t + I_t\)

The health stock produces healthy time — days free from illness or disability. Healthy time has value both directly (you enjoy being healthy) and indirectly (you can work and earn income). You are “dead” when \(H_t\) falls below some minimum threshold \(H_{\min}\).

Key predictions

  1. Health declines with age because depreciation accelerates. Even with constant investment, the stock falls over time. Eventually it hits \(H_{\min}\) and you die.

  2. Richer people invest more in health. The return to health includes both market productivity (lost wages from sick days) and direct utility. Higher wages raise the opportunity cost of illness, increasing the optimal health stock.

  3. More educated people are more efficient producers of health. Education raises the marginal product of health inputs — a college graduate may get more health per dollar spent on medical care (perhaps through better adherence, better information processing, or healthier behaviors). This predicts the well-documented education gradient in health.

  4. Medical spending rises with age — not because old people “like” medical care, but because depreciation is rising and it takes ever more investment to maintain the stock above \(H_{\min}\).

The lifecycle of health

#| standalone: true
#| viewerHeight: 680

library(shiny)

ui <- fluidPage(
  tags$head(tags$style(HTML("
    .stats-box {
      background: #f0f4f8; border-radius: 6px; padding: 14px;
      margin-top: 12px; font-size: 14px; line-height: 1.9;
    }
    .stats-box b { color: #2c3e50; }
    .good { color: #27ae60; font-weight: bold; }
    .bad  { color: #e74c3c; font-weight: bold; }
  "))),

  sidebarLayout(
    sidebarPanel(
      width = 3,

      sliderInput("H0", "Initial health stock:",
                  min = 50, max = 150, value = 100, step = 5),

      sliderInput("dep_base", "Base depreciation rate (%):",
                  min = 0.5, max = 5, value = 1.5, step = 0.25),

      sliderInput("dep_accel", "Depreciation acceleration:",
                  min = 0, max = 0.1, value = 0.03, step = 0.005),

      sliderInput("invest", "Medical care investment:",
                  min = 0.5, max = 5, value = 2, step = 0.25),

      sliderInput("educ", "Education (efficiency multiplier):",
                  min = 0.5, max = 2, value = 1, step = 0.1),

      sliderInput("wage", "Wage rate ($1000s):",
                  min = 20, max = 150, value = 50, step = 10),

      tags$hr(),
      uiOutput("info_box")
    ),

    mainPanel(
      width = 9,
      plotOutput("lifecycle_plot", height = "520px")
    )
  )
)

server <- function(input, output, session) {

  sim <- reactive({
    H0        <- input$H0
    dep_base  <- input$dep_base / 100
    dep_accel <- input$dep_accel
    invest    <- input$invest
    educ      <- input$educ
    wage      <- input$wage

    ages <- 20:90
    n    <- length(ages)

    H      <- numeric(n)
    I_t    <- numeric(n)
    dep    <- numeric(n)
    spend  <- numeric(n)

    H[1]   <- H0
    H_min  <- 10  # death threshold

    death_age <- 90

    for (i in 1:n) {
      age <- ages[i]
      t   <- age - 20

      # Depreciation rate increases with age
      dep[i] <- dep_base + dep_accel * t

      # Optimal investment: increases with age (to offset depreciation)
      # Also increases with wage (higher opportunity cost of illness)
      # and education (more efficient producer)
      wage_factor <- wage / 50
      base_invest <- invest * educ * wage_factor

      # Investment increases as health falls (you spend more to maintain it)
      health_urgency <- max(0.5, (H0 / max(H[i], 1))^0.5)
      I_t[i] <- base_invest * health_urgency

      # Spending = investment / efficiency
      spend[i] <- I_t[i] / educ * 10  # in $1000s

      # Health transition
      if (i < n) {
        H[i + 1] <- H[i] * (1 - dep[i]) + I_t[i]
        if (H[i + 1] < H_min) {
          H[i + 1] <- H_min
          death_age <- ages[i + 1]
          # Fill remaining with H_min
          if (i + 2 <= n) {
            H[(i + 2):n] <- H_min
            I_t[(i + 2):n] <- 0
            spend[(i + 2):n] <- 0
            dep[(i + 2):n] <- dep[i]
          }
          break
        }
      }
    }

    alive <- ages <= death_age
    total_spend <- sum(spend[alive])

    list(ages = ages, H = H, I_t = I_t, dep = dep, spend = spend,
         death_age = death_age, alive = alive, H_min = H_min,
         total_spend = total_spend, H0 = H0)
  })

  output$lifecycle_plot <- renderPlot({
    s <- sim()

    par(mfrow = c(1, 2), mar = c(5, 5, 3, 2))

    # Panel 1: Health stock over the lifecycle
    cols <- ifelse(s$alive, "#2c3e50", "#bdc3c7")
    plot(s$ages, s$H, type = "l", lwd = 3, col = "#2c3e50",
         xlab = "Age", ylab = "Health stock",
         main = "Health Stock Over the Lifecycle",
         ylim = c(0, max(s$H) * 1.15),
         cex.lab = 1.1)

    # Death threshold
    abline(h = s$H_min, lty = 2, lwd = 2, col = "#e74c3c")
    text(25, s$H_min + max(s$H) * 0.03, expression(H[min] ~ "(death threshold)"),
         col = "#e74c3c", cex = 0.85, adj = 0)

    # Shade area under the curve (healthy life)
    alive_idx <- which(s$alive)
    if (length(alive_idx) > 1) {
      polygon(c(s$ages[alive_idx], rev(s$ages[alive_idx])),
              c(s$H[alive_idx], rep(0, length(alive_idx))),
              col = adjustcolor("#27ae60", 0.15), border = NA)
    }

    # Mark death
    if (s$death_age < 90) {
      abline(v = s$death_age, lty = 3, col = "#e74c3c", lwd = 1.5)
      text(s$death_age + 1, max(s$H) * 0.5,
           paste0("Death at ", s$death_age), col = "#e74c3c",
           cex = 0.85, adj = 0, srt = 90)
    }

    # Depreciation curve (inset)
    dep_pct <- s$dep * 100
    lines(s$ages, dep_pct * max(s$H) / max(dep_pct) * 0.3,
          lty = 3, col = "#9b59b6", lwd = 1.5)
    text(75, max(s$H) * 0.32, expression(delta[t] ~ "(depreciation)"),
         col = "#9b59b6", cex = 0.75)

    # Panel 2: Medical spending over the lifecycle
    plot(s$ages, s$spend, type = "l", lwd = 3, col = "#e67e22",
         xlab = "Age", ylab = "Medical spending ($1000s)",
         main = "Medical Spending Over the Lifecycle",
         ylim = c(0, max(s$spend) * 1.15),
         cex.lab = 1.1)

    # Shade spending
    if (length(alive_idx) > 1) {
      polygon(c(s$ages[alive_idx], rev(s$ages[alive_idx])),
              c(s$spend[alive_idx], rep(0, length(alive_idx))),
              col = adjustcolor("#e67e22", 0.2), border = NA)
    }

    text(30, max(s$spend) * 0.9,
         paste0("Total: $", format(round(s$total_spend), big.mark = ",")),
         col = "#e67e22", cex = 1, adj = 0, font = 2)
  })

  output$info_box <- renderUI({
    s <- sim()
    yrs <- s$death_age - 20
    h65 <- s$H[which(s$ages == 65)]

    tags$div(class = "stats-box",
      HTML(paste0(
        "<b>Years of life:</b> <span class='good'>", yrs,
        " (age ", s$death_age, ")</span><br>",
        "<b>Health at 65:</b> ", round(h65, 1),
        " / ", s$H0, "<br>",
        "<b>Total medical spending:</b><br>",
        "$", format(round(s$total_spend), big.mark = ","), "K<br>",
        "<hr style='margin:8px 0'>",
        "<b>Initial stock:</b> ", s$H0, "<br>",
        "<b>Peak depreciation:</b> ",
        round(max(s$dep[s$alive]) * 100, 1), "%/yr"
      ))
    )
  })
}

shinyApp(ui, server)

Things to try

  • Increase depreciation acceleration: health falls faster and death comes earlier. Watch medical spending spike at older ages as the body requires more maintenance.
  • Increase education efficiency from 0.5 to 2.0: same investment produces more health, extending life and reducing total spending. This is the efficiency channel.
  • Increase wage rate: the value of healthy time rises, so optimal investment rises, and health is maintained at a higher level.
  • Set investment very low: health declines rapidly and death comes early. This illustrates the Grossman prediction that access to medical care extends life.
  • Compare high initial stock (150) vs low (50): even with identical depreciation and investment, the person who starts healthier lives longer — the health endowment matters.

Empirical evidence

The Grossman model organizes several well-documented empirical patterns:

The SES-health gradient. At every age, wealthier and more educated people are healthier. The gradient is remarkably steep — in the US, men in the top income quintile live about 15 years longer than men in the bottom quintile (Chetty et al., 2016). The Grossman model explains this through both the wage channel (higher wages increase the return to health) and the education channel (more educated people produce health more efficiently).

Rising medical spending with age. In the US, per-capita healthcare spending for people age 65+ is about 3x spending for working-age adults. The Grossman model says this is optimal: as depreciation accelerates, maintaining the stock requires ever more investment.

The education gradient. Even controlling for income, more educated people are healthier. Grossman’s model attributes this to productive efficiency: education makes you better at converting health inputs into health. Empirically, education is associated with lower smoking rates, better diet, and higher medication adherence.

Critiques

The model has been criticized on several grounds:

  • It assumes people make fully rational, forward-looking decisions about health — unrealistic given the prevalence of smoking, poor diet, and non-adherence to medications
  • It treats medical care as productive (investment) rather than restorative (repair) — in reality, much medical care occurs after health shocks, not as preventive investment
  • Deaton (2003) argued that the SES-health gradient may run partly from health to income (healthy people earn more) rather than solely from income to health as the Grossman model implies

Did you know?

  • Michael Grossman published his health capital model in 1972 as part of the NBER’s Human Capital and Health project. It remains the most cited theoretical framework in health economics, despite being over 50 years old.

  • The SES-health gradient is one of the most robust findings in social science. It appears in every country, for nearly every health measure, and has persisted for centuries. Yet its causal mechanisms remain debated — the Grossman model offers one explanation, but others include stress, social status, environmental exposures, and access to care.

  • Angus Deaton (Nobel Prize 2015) has argued that the relationship between income and health is largely driven by institutional factors (clean water, sanitation, public health systems) rather than individual investment decisions. At the country level, the income-health relationship flattens above moderate income levels — the “Preston curve.”