Externalities

ECON2120G-M02 — Principles of Microeconomics | Episode 6: The White Whale

Dr. Meghan Downes

2026-03-20

The White Whale

Note🏴‍☠️ Captain’s Log — Pirate Pete’s Tales of Misadventure

The Salty Barnacle, North Atlantic, somewhere between 1820 and infinity. The fog is thick. Socks is at the helm. Stella Starlight is at the bow, staring out to sea.

The crew spots something extraordinary. The ocean’s surface parts, and there she is — a Great White Whale, magnificent and ancient, her flanks gleaming like a pearl. Stella gasps.

But then Stella sees something else. Three ships emerge from the fog — whaling ships, with harpoons raised.

“They’re going to kill her!” Stella cries, spinning to face Socks. “That whale is the last of her kind! You can’t put a price on that!”

Socks looks up from his navigational charts, a piece of seaweed dangling from his lip. “Ahh,” he says slowly. “That’s exactly the problem.”

“What do you mean?” says Stella. “She’s priceless!”

“Yes,” Socks says, with the weight of every economics textbook ever written. “Priceless means no price. No price means no market. No market means no signal. No signal means… she gets harpooned.”

Stella stares. “That doesn’t make any sense.”

“Welcome,” says Socks, “to Chapter 10.” 🐋

Today we crack open one of the most powerful — and heartbreaking — ideas in all of economics: externalities. When the full costs or benefits of an action fall on people outside the transaction, markets fail. The whale pays the price. The whalers pocket the gold.

By the end of today, you will understand:

  1. What externalities are and why they cause market failure
  2. How to graph the gap between private and social costs/benefits
  3. The solutions: Pigouvian taxes, Coase theorem, cap-and-trade, regulation
  4. The Tragedy of the Commons — and why “priceless” means exploited
  5. Public goods and the free-rider problem
  6. Real-world data: SO₂ cap-and-trade, carbon pricing, New Mexico oil and gas

10.1 — What is an Externality?

Markets are brilliant at coordinating millions of decisions — but only when the prices people face reflect the full cost or benefit to society. When they don’t, we get market failure.

TipDefinition: Externality

An externality occurs when a transaction between a buyer and a seller affects a third party who is not involved in the exchange — and those effects are not reflected in the market price.

  • Negative externality: The activity imposes costs on third parties (e.g., pollution).
  • Positive externality: The activity creates benefits for third parties (e.g., education, vaccines).

The key wedge:

\[\text{Social Cost} = \text{Private Cost} + \text{External Cost}\]

\[\text{Social Benefit} = \text{Private Benefit} + \text{External Benefit}\]

When external costs exist, private cost < social cost → markets overproduce.

When external benefits exist, private benefit < social benefit → markets underproduce.

ImportantThe Core Insight

Markets price what buyers and sellers care about. They don’t price what everyone else experiences. That mismatch — between private and social values — is the root of every story in this chapter, from air pollution to white whales to COVID vaccines.

10.1.1 — The Marginal Damage Function

The external cost per unit of output is called the marginal external cost (MEC). The social cost curve is simply the private cost curve shifted up by the MEC at each level of output:

\[MSC(Q) = MPC(Q) + MEC(Q)\]

Where: - \(MSC\) = Marginal Social Cost - \(MPC\) = Marginal Private Cost
- \(MEC\) = Marginal External Cost

Show R code
# ── Externality type summary table ────────────────────────────────────────────
ext_table <- tibble(
  `Type`              = c("Negative Externality", "Positive Externality"),
  `Private Cost/Benefit` = c("Only producer/consumer pays", "Only producer/consumer gains"),
  `Social Cost/Benefit`  = c("Society pays MORE than private", "Society gains MORE than private"),
  `Market Result`     = c("Overproduction (too much)", "Underproduction (too little)"),
  `Example`           = c("Factory smoke, whaling, oil spills", "Vaccines, education, R&D")
)

ext_table %>%
  kable(caption = "Types of Externalities and Market Outcomes") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE) %>%
  column_spec(1, bold = TRUE, color = pal$navy)
Types of Externalities and Market Outcomes
Type Private Cost/Benefit Social Cost/Benefit Market Result Example
Negative Externality Only producer/consumer pays Society pays MORE than private Overproduction (too much) Factory smoke, whaling, oil spills
Positive Externality Only producer/consumer gains Society gains MORE than private Underproduction (too little) Vaccines, education, R&D

10.2 — Negative Externalities: Social Cost > Private Cost

Pirate Pete is sailing near the New Mexico-Texas Permian Basin. Trillionaire Bob’s oil rigs are pumping 24/7. The methane flares light the night sky. Stella watches in awe — until Socks explains that every flare is a cost somebody isn’t paying.

Note🏴‍☠️ Trillionaire Bob’s Oil Field

Trillionaire Bob runs 400 oil wells along the Texas-New Mexico border. Each barrel of oil costs him $22 to produce (private cost). But each barrel also releases methane — a greenhouse gas 80 times more potent than CO₂ — damaging neighboring ranches, warming the atmosphere, and reducing air quality in Carlsbad and Artesia.

Those costs — the damaged ranches, the medical bills, the climate effects — are real. They’re just not Bob’s problem. They’re yours.

10.2.1 — Graphing Negative Externalities

Show R code
# ── Negative Externality: MSC vs MPC diagram ──────────────────────────────────
# Illustrative linear supply/demand model
# Demand: P = 100 - 2Q
# MPC (private supply): P = 10 + 2Q
# MSC (social supply): P = 10 + 2Q + 20 = 30 + 2Q  (constant MEC = $20/unit)

Q_vals <- seq(0, 50, by = 0.5)
demand  <- 100 - 2 * Q_vals
mpc     <- 10 + 2 * Q_vals
msc     <- 30 + 2 * Q_vals   # MEC = $20 per unit

# Market equilibrium (Demand = MPC): 100 - 2Q = 10 + 2Q → Q* = 22.5, P* = 55
Q_mkt <- 22.5; P_mkt <- 55

# Social optimum (Demand = MSC): 100 - 2Q = 30 + 2Q → Q** = 17.5, P** = 65
Q_soc <- 17.5; P_soc <- 65

df <- tibble(Q = Q_vals, Demand = demand, MPC = mpc, MSC = msc) %>%
  filter(Demand >= 0, MPC >= 0)

# Deadweight loss polygon
dwl_poly <- tibble(
  Q = c(Q_soc, Q_mkt, Q_mkt, Q_soc),
  P = c(P_soc, P_mkt, 30 + 2 * Q_mkt, P_soc)
)

ggplot(df, aes(x = Q)) +
  # Deadweight loss shading
  geom_polygon(data = dwl_poly, aes(x = Q, y = P),
               fill = pal$coral, alpha = 0.25) +
  # Curves
  geom_line(aes(y = Demand), color = pal$navy, linewidth = 1.5) +
  geom_line(aes(y = MPC),    color = pal$teal, linewidth = 1.5, linetype = "solid") +
  geom_line(aes(y = MSC),    color = pal$red,  linewidth = 1.5, linetype = "dashed") +
  # Market equilibrium point
  geom_point(aes(x = Q_mkt, y = P_mkt), color = pal$teal, size = 4) +
  annotate("text", x = Q_mkt + 1.5, y = P_mkt + 2,
           label = sprintf("Market Eq.\nQ* = %.1f, P* = $%.0f", Q_mkt, P_mkt),
           color = pal$teal, size = 3.5, hjust = 0) +
  # Social optimum point
  geom_point(aes(x = Q_soc, y = P_soc), color = pal$red, size = 4) +
  annotate("text", x = Q_soc - 2, y = P_soc + 3,
           label = sprintf("Social Optimum\nQ** = %.1f, P** = $%.0f", Q_soc, P_soc),
           color = pal$red, size = 3.5, hjust = 1) +
  # DWL label
  annotate("text", x = 21, y = 53,
           label = "DWL\n(overproduction)", color = pal$coral,
           size = 3.5, fontface = "bold", hjust = 0.5) +
  # MEC arrow
  annotate("segment", x = 5, xend = 5, y = 10 + 2 * 5, yend = 30 + 2 * 5,
           arrow = arrow(length = unit(0.2, "cm"), ends = "both"),
           color = pal$orange, linewidth = 1) +
  annotate("text", x = 7, y = 32,
           label = "MEC = $20\n(external cost\nper unit)",
           color = pal$orange, size = 3.2, hjust = 0) +
  # Pigouvian tax arrow
  annotate("segment", x = Q_soc, xend = Q_soc, y = 0, yend = P_soc,
           linetype = "dotted", color = pal$purple, linewidth = 0.8) +
  geom_segment(aes(x = 0, xend = Q_soc, y = P_soc, yend = P_soc),
               linetype = "dotted", color = pal$purple, linewidth = 0.8) +
  # Labels
  annotate("text", x = 2, y = 97, label = "Demand (MSB)",
           color = pal$navy, size = 4, fontface = "bold", hjust = 0) +
  annotate("text", x = 30, y = mpc[Q_vals == 30] + 3,
           label = "MPC (Private Supply)",
           color = pal$teal, size = 3.8, fontface = "bold", hjust = 0) +
  annotate("text", x = 25, y = msc[Q_vals == 25] + 3,
           label = "MSC (Social Supply)",
           color = pal$red, size = 3.8, fontface = "bold", hjust = 0) +
  scale_y_continuous(labels = dollar_format(prefix = "$"), limits = c(0, 105)) +
  scale_x_continuous(limits = c(0, 50)) +
  labs(
    title    = "Negative Externality: Market Overproduction",
    subtitle = "When private cost < social cost, markets produce too much — creating deadweight loss",
    x        = "Quantity (Q)",
    y        = "Price / Cost ($)",
    caption  = paste0(
      "Illustrative model: Demand = 100 - 2Q | MPC = 10 + 2Q | MSC = 30 + 2Q (MEC = $20/unit)\n",
      "Cowen & Tabarrok, Modern Principles: Microeconomics, 5th ed., Ch. 10 | ECON2120G-M02"
    )
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title    = element_text(face = "bold", color = pal$navy),
    plot.subtitle = element_text(color = pal$slate),
    panel.grid.minor = element_blank()
  )

ImportantReading the Negative Externality Diagram

The diagram above tells the complete story of market failure:

Feature What it means
MPC below MSC Private producers ignore the $20/unit damage to third parties
Market equilibrium Q* = 22.5 Too much output — producers stop where Demand = MPC
Social optimum Q = 17.5** The right amount — where Demand = MSC
Overproduction = 5 units The market produces 5 extra units that cost society more than they’re worth
DWL (shaded area) The value destroyed by ignoring external costs

The Pigouvian Tax Solution: If the government charges a tax equal to the MEC ($20), the new effective supply curve for producers becomes MPC + tax = MSC. The market equilibrium moves to the social optimum. The whalers finally pay for their harpoons.

10.2.2 — Real-World Negative Externality: U.S. CO₂ Emissions

Show R code
# ── U.S. CO2 Emissions Chart with key policy events ───────────────────────────

# Key events
co2_events <- tibble(
  year  = c(1997, 2005, 2009, 2015, 2020),
  label = c("Kyoto\nProtocol\n(US not ratified)",
            "Clean Air\nRules expand",
            "Obama\nClimate Plan\nproposed",
            "Paris\nAgreement",
            "COVID-19\nDemand Drop"),
  ypos  = c(5700, 5900, 5550, 5300, 4750)
)

ggplot(co2_data, aes(x = year, y = emissions)) +
  geom_area(fill = pal$coral, alpha = 0.2) +
  geom_line(color = pal$red, linewidth = 1.8) +
  geom_point(color = pal$navy, size = 2.5) +
  # Key events
  geom_vline(data = co2_events, aes(xintercept = year),
             linetype = "dashed", color = pal$slate, linewidth = 0.6) +
  geom_text(data = co2_events, aes(x = year + 0.3, y = ypos, label = label),
            size = 3, color = pal$slate, hjust = 0, lineheight = 0.9) +
  # Highlight 2007 peak
  geom_point(aes(x = 2007, y = 6001), color = pal$red, size = 5) +
  annotate("text", x = 2007.5, y = 6100,
           label = "Peak: 6,001 MMT (2007)",
           color = pal$red, size = 3.5, fontface = "bold", hjust = 0) +
  scale_y_continuous(labels = comma_format(suffix = " MMT")) +
  scale_x_continuous(breaks = seq(1990, 2022, by = 4)) +
  labs(
    title    = "U.S. CO₂ Emissions: The Biggest Negative Externality in History",
    subtitle = "Million metric tons (MMT) | 1990–2022 | Down 16% from peak but still 5,000+ MMT/year",
    x        = NULL,
    y        = "CO₂ Emissions (Million Metric Tons)",
    caption  = fred_co2_note
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title       = element_text(face = "bold", color = pal$navy),
    plot.subtitle    = element_text(color = pal$slate),
    panel.grid.minor = element_blank()
  )

Note🌎 The Numbers Behind the Graph
  • In 2022, U.S. CO₂ emissions were approximately 5,056 million metric tons — roughly 15 metric tons per person per year (Federal Reserve Bank of St. Louis 2026).
  • The social cost of carbon — the estimated damage to society per ton of CO₂ — is estimated at $51–$200+ per metric ton depending on the model used (World Bank 2025).
  • At $51/ton, the annual external cost of U.S. CO₂ = $258 billion. At $200/ton, it’s over $1 trillion.
  • Nobody was paying this in the market. That’s the externality.

10.3 — Positive Externalities: Social Benefit > Private Benefit

Note🏴‍☠️ Stella Gets Vaccinated

The crew has jumped to 2020. A new virus is spreading fast. Pirate Pete asks Stella: “Should you get vaccinated?”

Stella thinks about it. “Well, it protects me — but it also protects everyone around me if I’m not contagious anymore. Even people I’ve never met.”

“Exactly,” says Socks. “The private benefit of your vaccine is that you don’t get sick. The social benefit is that you protect the old goat in the bakery, the newborn down the lane, and immunocompromised Petunia who can’t be vaccinated.”

“So I should definitely get it?”

“You should — but here’s the problem: without extra incentives, too few people will. Because most people only count the private benefit — what’s in it for me — and ignore the external benefit they provide to everyone else.”

10.3.1 — Graphing Positive Externalities

Show R code
# ── Positive Externality: MSB vs MPB diagram ──────────────────────────────────
# Illustrative model
# Supply (MPC = MSC): P = 10 + 2Q  (no production externality assumed)
# MPB (private demand): P = 80 - 2Q
# MSB (social demand):  P = 80 - 2Q + 30 = 110 - 2Q  (external benefit = $30/unit)

Q_vals2 <- seq(0, 55, by = 0.5)
supply2  <- 10 + 2 * Q_vals2
mpb2     <- 80 - 2 * Q_vals2
msb2     <- 110 - 2 * Q_vals2  # MEB = $30 per unit

# Market equilibrium (Supply = MPB): 10 + 2Q = 80 - 2Q → Q* = 17.5, P* = 45
Q_mkt2 <- 17.5; P_mkt2 <- 45

# Social optimum (Supply = MSB): 10 + 2Q = 110 - 2Q → Q** = 25, P** = 60
Q_soc2 <- 25; P_soc2 <- 60

df2 <- tibble(Q = Q_vals2, Supply = supply2, MPB = mpb2, MSB = msb2) %>%
  filter(MPB >= 0, MSB >= 0)

# DWL polygon
dwl_poly2 <- tibble(
  Q = c(Q_mkt2, Q_soc2, Q_soc2, Q_mkt2),
  P = c(P_mkt2, P_soc2, 10 + 2 * Q_soc2, 10 + 2 * Q_mkt2)
)

ggplot(df2, aes(x = Q)) +
  # DWL shading
  geom_polygon(data = dwl_poly2, aes(x = Q, y = P),
               fill = pal$gold, alpha = 0.30) +
  # Curves
  geom_line(aes(y = Supply), color = pal$teal, linewidth = 1.5) +
  geom_line(aes(y = MPB),    color = pal$navy, linewidth = 1.5, linetype = "dashed") +
  geom_line(aes(y = MSB),    color = pal$green, linewidth = 1.5, linetype = "solid") +
  # Market equilibrium
  geom_point(aes(x = Q_mkt2, y = P_mkt2), color = pal$navy, size = 4) +
  annotate("text", x = Q_mkt2 - 1.5, y = P_mkt2 - 4,
           label = sprintf("Market Eq.\nQ* = %.1f, P* = $%.0f", Q_mkt2, P_mkt2),
           color = pal$navy, size = 3.5, hjust = 1) +
  # Social optimum
  geom_point(aes(x = Q_soc2, y = P_soc2), color = pal$green, size = 4) +
  annotate("text", x = Q_soc2 + 1.5, y = P_soc2 + 3,
           label = sprintf("Social Optimum\nQ** = %.0f, P** = $%.0f", Q_soc2, P_soc2),
           color = pal$green, size = 3.5, hjust = 0) +
  # DWL label
  annotate("text", x = 22, y = 50,
           label = "DWL\n(underproduction)", color = pal$orange,
           size = 3.5, fontface = "bold", hjust = 0.5) +
  # MEB arrow
  annotate("segment", x = 6, xend = 6, y = 80 - 2 * 6, yend = 110 - 2 * 6,
           arrow = arrow(length = unit(0.2, "cm"), ends = "both"),
           color = pal$purple, linewidth = 1) +
  annotate("text", x = 8, y = 86,
           label = "MEB = $30\n(external benefit\nper unit)",
           color = pal$purple, size = 3.2, hjust = 0) +
  # Curve labels
  annotate("text", x = 2, y = 15, label = "MPC = MSC (Supply)",
           color = pal$teal, size = 3.8, fontface = "bold", hjust = 0) +
  annotate("text", x = 30, y = mpb2[Q_vals2 == 30] + 3,
           label = "MPB (Private Demand)",
           color = pal$navy, size = 3.8, fontface = "bold", hjust = 0) +
  annotate("text", x = 35, y = msb2[Q_vals2 == 35] + 3,
           label = "MSB (Social Demand)",
           color = pal$green, size = 3.8, fontface = "bold", hjust = 0) +
  scale_y_continuous(labels = dollar_format(prefix = "$"), limits = c(0, 115)) +
  scale_x_continuous(limits = c(0, 55)) +
  labs(
    title    = "Positive Externality: Market Underproduction",
    subtitle = "When private benefit < social benefit, markets produce too little — creating deadweight loss",
    x        = "Quantity (Q)",
    y        = "Price / Benefit ($)",
    caption  = paste0(
      "Illustrative model: Supply = 10 + 2Q | MPB = 80 - 2Q | MSB = 110 - 2Q (MEB = $30/unit)\n",
      "Cowen & Tabarrok, Modern Principles: Microeconomics, 5th ed., Ch. 10 | ECON2120G-M02"
    )
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title    = element_text(face = "bold", color = pal$navy),
    plot.subtitle = element_text(color = pal$slate),
    panel.grid.minor = element_blank()
  )

ImportantReading the Positive Externality Diagram
Feature What it means
MSB above MPB Each vaccine has $30 of external benefit beyond the private benefit
Market Q* = 17.5 Too little produced — individuals only count what’s good for them
Social Q = 25** The socially optimal amount — where Supply = MSB
Underproduction = 7.5 units Society misses out on mutually beneficial transactions
DWL (shaded gold) Value lost because positive externalities are uncaptured

The Pigouvian Subsidy Solution: A subsidy equal to the MEB ($30) raises the effective price producers receive, or lowers the price consumers pay, shifting the transaction toward the social optimum. This is why governments subsidize vaccines, education, and basic research.

10.3.2 — The Vaccine Analogy: Education

Education is the classic positive externality. You pay tuition and study hard for your return on the degree. But:

  • An educated workforce reduces crime (Cowen and Tabarrok 2021)
  • Educated neighbors vote more thoughtfully
  • Educated workers generate knowledge spillovers that raise everyone’s productivity
  • Educated citizens are less susceptible to Hypno Hippo’s TokPods

Because the social return to education exceeds the private return, the free market will underprovide education. This is the economic rationale for public schools, state universities, Pell Grants, and NMSU.

Show R code
# ── Comparison table: positive vs negative externalities ──────────────────────
comp_table <- tibble(
  `Feature`        = c("Relationship", "Curve Shift", "Market Result",
                       "Welfare Loss", "Policy Fix", "Real Example"),
  `Negative Externality` = c(
    "Social Cost > Private Cost",
    "MSC above MPC",
    "Overproduction (Q* > Q**)",
    "Deadweight loss from excess output",
    "Pigouvian tax = MEC",
    "Carbon tax, methane rules"
  ),
  `Positive Externality` = c(
    "Social Benefit > Private Benefit",
    "MSB above MPB",
    "Underproduction (Q* < Q**)",
    "Deadweight loss from insufficient output",
    "Pigouvian subsidy = MEB",
    "Vaccine subsidies, public education"
  )
)

comp_table %>%
  kable(caption = "Negative vs. Positive Externalities: A Comparison") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE) %>%
  column_spec(1, bold = TRUE, color = pal$navy) %>%
  column_spec(2, color = pal$red) %>%
  column_spec(3, color = pal$green)
Negative vs. Positive Externalities: A Comparison
Feature Negative Externality Positive Externality
Relationship Social Cost > Private Cost Social Benefit > Private Benefit
Curve Shift MSC above MPC MSB above MPB
Market Result Overproduction (Q* > Q**) Underproduction (Q* < Q**)
Welfare Loss Deadweight loss from excess output Deadweight loss from insufficient output
Policy Fix Pigouvian tax = MEC Pigouvian subsidy = MEB
Real Example Carbon tax, methane rules Vaccine subsidies, public education

10.4 — Solutions to Externalities

There are five main approaches to correcting externalities. Each has tradeoffs. None is perfect. All are better than doing nothing.

10.4.1 — Pigouvian Taxes and Subsidies

Named for Arthur Cecil Pigou, who introduced the idea in The Economics of Welfare (1920) (Pigou 1920).

TipPigouvian Correction

Pigouvian tax (negative externality): Set tax \(t^* = MEC\) at the social optimum.

\[t^* = MSC(Q^{**}) - MPC(Q^{**})\]

This makes private cost = social cost at the margin.

Pigouvian subsidy (positive externality): Set subsidy \(s^* = MEB\) at the social optimum.

\[s^* = MSB(Q^{**}) - MPB(Q^{**})\]

This makes private benefit = social benefit at the margin.

Advantages: Efficient; raises revenue (taxes) or encourages optimal output (subsidies); works through price signals rather than commands.

Disadvantages: Government must know the MEC or MEB exactly — which requires information that is often unavailable or contested. Pigou himself admitted this was the hard part.

Note🏴‍☠️ Pirate Pete on Pigouvian Taxes

Pete is confused. “If the government just taxes whaling, won’t the whalers just find a way around it?”

Socks: “That depends on how well the tax is set. A Pigouvian tax doesn’t ban whaling — it makes whalers pay the true cost. If the true cost is high enough, the whaling stops. If it’s moderate, there’s some whaling, but at the right level.”

Pete: “Who decides the right level?”

Socks: [long pause, chewing seaweed] “That… is the $64 billion question.”

10.4.2 — The Coase Theorem

Ronald Coase made a stunning argument in 1960 (Coase 1960): if property rights are well-defined and transaction costs are zero, private bargaining will always lead to the efficient outcome — regardless of who holds the property right.

ImportantThe Coase Theorem (1960)

If: 1. Property rights are clearly defined 2. Transaction costs are zero (or negligible)

Then: private parties will bargain to the efficient outcome, and it does not matter who owns the property right.

The pirate version: Pirate Pete owns the ocean near the white whale’s home. Trillionaire Bob wants to dump waste there.

  • If Pete owns the ocean, Bob must pay Pete to dump → Pete will only sell rights if the price exceeds his damage → efficient
  • If Bob owns the dumping right, Pete must pay Bob not to dump → Pete will pay up to his damage value → also efficient

Same outcome, different distribution. The efficiency result holds regardless of who owns what, as long as we can negotiate.

Why it often fails in practice:

  • Transaction costs are rarely zero (millions of people affected by CO₂ emissions cannot negotiate with every emitter)
  • Property rights over oceans, air, climate are undefined or disputed
  • Information asymmetry: neither side knows the other’s true valuation
  • Hold-up problems and strategic bargaining
Note🏴‍☠️ The Coase Theorem Through Pirate Negotiations

Pirate Pete’s crew tries to negotiate with the whaling ships. “Stop hunting the whale and we’ll share our treasure.” The head whaler squints: “How much treasure?” Pete thinks… the whale is priceless to Stella, but what IS that worth in gold? They can’t agree. The negotiation fails. The whale dives.

This is Coase in action. When transaction costs are high — when it’s hard to get everyone affected to negotiate simultaneously — private bargaining breaks down. That’s when we need other tools.

10.4.3 — Cap-and-Trade: The SO₂ Success Story

The Clean Air Act Amendments of 1990 created a cap-and-trade system for sulfur dioxide (SO₂) — the primary cause of acid rain. This became one of the most successful environmental policy experiments in history (U.S. Environmental Protection Agency 2023).

How cap-and-trade works:

  1. Government sets a cap — a total limit on emissions
  2. Firms receive or buy permits equal to their allowed emissions
  3. Firms can trade permits: efficient firms sell permits they don’t need; inefficient firms buy them
  4. Over time, the cap is lowered, reducing total emissions
  5. The system finds the least-cost path to the target
Show R code
# ── SO2 Cap-and-Trade Success Story ───────────────────────────────────────────

ggplot(so2_data, aes(x = year, y = emissions / 1000)) +
  geom_area(fill = pal$gold, alpha = 0.20) +
  geom_line(color = pal$orange, linewidth = 1.8) +
  geom_point(aes(color = cap_phase), size = 4) +
  # Phase annotations
  annotate("rect", xmin = 1994.5, xmax = 1999.5,
           ymin = 0, ymax = Inf, alpha = 0.07, fill = pal$teal) +
  annotate("rect", xmin = 1999.5, xmax = 2009.5,
           ymin = 0, ymax = Inf, alpha = 0.07, fill = pal$green) +
  annotate("text", x = 1997, y = 12.5, label = "Phase I\n(1995–2000)",
           color = pal$teal, size = 3.5, fontface = "bold") +
  annotate("text", x = 2005, y = 12.5, label = "Phase II\n(2000–2009)",
           color = pal$green, size = 3.5, fontface = "bold") +
  # Reduction annotation
  annotate("segment", x = 1990, xend = 2022,
           y = so2_data$emissions[so2_data$year == 1990] / 1000,
           yend = so2_data$emissions[so2_data$year == 1990] / 1000,
           linetype = "dashed", color = pal$slate, linewidth = 0.7) +
  annotate("text", x = 2014, y = 16.5,
           label = "1990 baseline: 15.9 million tons",
           color = pal$slate, size = 3.2) +
  scale_y_continuous(labels = function(x) paste0(x, "M tons"),
                     limits = c(0, 20)) +
  scale_x_continuous(breaks = c(1980, 1990, 1995, 2000, 2005, 2010, 2015, 2022)) +
  scale_color_manual(values = c("Pre-cap" = pal$coral, "Phase I begins" = pal$teal,
                                "Phase I" = pal$teal, "Pre Phase II" = pal$gold,
                                "Phase II" = pal$green, "Post-program" = pal$purple)) +
  labs(
    title    = "SO₂ Cap-and-Trade: The Most Successful Environmental Policy Ever?",
    subtitle = "U.S. sulfur dioxide emissions fell 88% from 1990 to 2022 — at a fraction of projected cost",
    x        = NULL,
    y        = "SO₂ Emissions (Million Short Tons)",
    color    = "Program Phase",
    caption  = "Source: EPA Acid Rain Program tracking data | https://www.epa.gov/airmarkets/acid-rain-program\nECON2120G-M02, Class #26 (2026-03-20)"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title    = element_text(face = "bold", color = pal$navy),
    plot.subtitle = element_text(color = pal$slate),
    panel.grid.minor = element_blank(),
    legend.position  = "bottom"
  )

Note📊 SO₂ Cap-and-Trade: By the Numbers
  • 1990 baseline: 15.9 million tons of SO₂
  • 2022 actual: ~1.9 million tons — an 88% reduction (U.S. Environmental Protection Agency 2023)
  • The program achieved reductions at roughly half the predicted cost because trading let efficient firms do more of the work
  • Acid rain deposition fell dramatically across the eastern U.S.; lakes and forests recovered
  • The lesson: market-based environmental policy can work when designed well

10.4.4 — Carbon Pricing Around the World

Show R code
# ── Carbon Prices by Country/System ───────────────────────────────────────────

carbon_prices_plot <- carbon_prices %>%
  arrange(desc(price_usd)) %>%
  mutate(country = factor(country, levels = rev(country)))

ggplot(carbon_prices_plot, aes(x = country, y = price_usd, fill = type)) +
  geom_col(width = 0.7) +
  geom_text(aes(label = ifelse(price_usd > 0, paste0("$", price_usd), "No price")),
            hjust = -0.1, size = 3.5, color = pal$navy) +
  coord_flip() +
  scale_fill_manual(values = c(
    "Tax"     = pal$red,
    "ETS"     = pal$teal,
    "Tax+ETS" = pal$gold,
    "None"    = pal$muted
  )) +
  scale_y_continuous(labels = dollar_format(prefix = "$"), limits = c(0, 175)) +
  labs(
    title    = "Carbon Prices Around the World (2024)",
    subtitle = "Sweden leads at $137/tonne CO₂ | US federal carbon price = $0",
    x        = NULL,
    y        = "Carbon Price (USD per tonne CO₂)",
    fill     = "Policy Type",
    caption  = "Source: World Bank Carbon Pricing Dashboard (2024) | carbonpricingdashboard.worldbank.org\nECON2120G-M02, Class #26"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title    = element_text(face = "bold", color = pal$navy),
    plot.subtitle = element_text(color = pal$slate),
    panel.grid.minor = element_blank(),
    legend.position  = "right"
  )

Note🌐 Carbon Pricing: The Global Patchwork

As of 2024, 73 carbon pricing instruments are in operation or under development globally (World Bank 2025), covering about 23% of global greenhouse gas emissions. The price ranges from under $5/ton in Mexico to $137/ton in Sweden.

The social cost of carbon (SCC) — the “right” Pigouvian tax — is estimated at $51 to $200+ per ton depending on the discount rate used. Most existing carbon prices are well below even the low end. Markets are still not pricing this externality correctly.

10.4.5 — Regulation and Standards

Sometimes bargaining is too costly, taxes require information we don’t have, and cap-and-trade is politically complex. Then we use command-and-control regulation: rules that directly specify what firms can and cannot do.

  • Emission standards: Max grams of NOₓ per mile from a car
  • Technology standards: Require best available control technology (BACT) on power plants
  • Product bans: Ban leaded gasoline, DDT, certain CFCs

Trade-off: Regulation is simple to administer but inflexible — it doesn’t allow firms to find least-cost solutions, and it may achieve the wrong quantity reduction if costs vary across firms.


10.5 — The Tragedy of the Commons

Note🏴‍☠️ Stella Learns About the Whale

“But WHY?” Stella demands, watching the whaling ships. “Why would they kill the last one? It makes no sense!”

“It makes perfect sense,” Socks says grimly. “Each whaling captain is making a rational individual decision. If I don’t catch the whale, someone else will. There’s no benefit to me from leaving her alive — I don’t own her. So I catch her today, because tomorrow she might already be gone.”

Stella stares. “That’s horrifying.”

“That’s the Tragedy of the Commons,” says Socks. “Rational individuals, pursuing their own self-interest, deplete a shared resource they all depend on.”

“Can’t they just agree not to?”

“They tried. In 1843. And 1897. And 1924. Each time, one captain defected.” Socks looks at the charts. “Without property rights, or regulation, or a powerful enough governing body, every commons ends the same way.”

Garrett Hardin described the mechanism in his 1968 essay (Hardin 1968):

  • Each individual gains the full private benefit of using a common resource
  • Each individual bears only a fraction of the social cost (shared among all users)
  • Individually rational → collectively irrational → resource depletion
TipThe Tragedy of the Commons

An open-access resource (common pool, no excludability) will be overused because:

\[\text{Private Benefit} = \text{Full Benefit per Unit Harvested}\] \[\text{Private Cost} = \text{Small Share of Total Depletion Cost}\]

Every user’s rational strategy leads to collective over-exploitation.

Classic examples: - Whales in international waters (no property rights → near-extinction) - Overfishing in the Grand Banks (cod stocks collapsed in 1992) - Overgrazing on common pastures (English medieval commons problem) - Traffic congestion (roads as commons) - Aquifer depletion (Rio Grande aquifer under NM — we’ll return to this)

10.5.1 — The Math of the Tragedy

Show R code
# ── The Tragedy of the Commons: Open Access vs. Social Optimum ────────────────
# A fishing model
# Each fishing boat has private benefit = P × catch(N)
# where catch per boat declines with more boats: catch(N) = 100/N
# Private cost per boat = 50 (fuel, labor)
# Total social harvest = N × catch(N) = 100 (fixed total — commons has fixed biomass)

N_vals <- seq(1, 20, by = 0.5)

fishing_data <- tibble(
  N         = N_vals,
  catch_pb  = 100 / N_vals,           # average product per boat
  total_harvest = 100,                 # total is fixed (commons biomass)
  mb_private = 5 * (100 / N_vals),     # P=5 × catch per boat = private MB
  mc_private = 50,                     # private cost per boat
  mc_social  = 50 + 5 * 100 / N_vals^2 * 5  # includes congestion cost imposed on others
)

# Private equilibrium: MB = MC (private) → 500/N = 50 → N* = 10
# Social optimum: MB = MC (social) → solve numerically, approximately N** = 5

N_priv <- 10
N_soc  <- 5

ggplot(fishing_data, aes(x = N)) +
  geom_line(aes(y = mb_private), color = pal$navy, linewidth = 1.5,
            linetype = "solid") +
  geom_hline(yintercept = 50, color = pal$teal, linewidth = 1.5) +
  # Private equilibrium
  geom_vline(xintercept = N_priv, linetype = "dashed",
             color = pal$coral, linewidth = 1.0) +
  annotate("point", x = N_priv, y = 50, color = pal$coral, size = 5) +
  annotate("text", x = N_priv + 0.5, y = 55,
           label = paste0("Open-access equilibrium\n", N_priv, " boats — too many!"),
           color = pal$coral, size = 3.5, hjust = 0) +
  # Social optimum
  geom_vline(xintercept = N_soc, linetype = "dashed",
             color = pal$green, linewidth = 1.0) +
  annotate("point", x = N_soc, y = 50, color = pal$green, size = 5) +
  annotate("text", x = N_soc + 0.5, y = 55,
           label = paste0("Social optimum\n", N_soc, " boats — just right"),
           color = pal$green, size = 3.5, hjust = 0) +
  # Shaded overuse
  annotate("rect", xmin = N_soc, xmax = N_priv, ymin = 0, ymax = 50,
           fill = pal$coral, alpha = 0.15) +
  annotate("text", x = 7.5, y = 25, label = "Excess boats\n(overuse of commons)",
           color = pal$coral, size = 3.5, fontface = "bold", hjust = 0.5) +
  annotate("text", x = 2, y = 53, label = "MC (private) = $50/boat",
           color = pal$teal, size = 3.5, hjust = 0) +
  annotate("text", x = 2, y = 80, label = "MB (average private catch, $)",
           color = pal$navy, size = 3.5, hjust = 0) +
  scale_y_continuous(labels = dollar_format(prefix = "$"), limits = c(0, 105)) +
  scale_x_continuous(breaks = 1:20) +
  labs(
    title    = "Tragedy of the Commons: Open-Access vs. Social Optimum",
    subtitle = "Each boat earns MB = $5 × (100/N). Too many enter because they ignore congestion costs on others",
    x        = "Number of Fishing Boats (N)",
    y        = "Marginal Private Benefit / Cost ($)",
    caption  = "Illustrative fishing commons model | Cowen & Tabarrok Ch. 10 | ECON2120G-M02"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title    = element_text(face = "bold", color = pal$navy),
    plot.subtitle = element_text(color = pal$slate),
    panel.grid.minor = element_blank()
  )

10.5.2 — Solutions to the Tragedy of the Commons

Elinor Ostrom (Nobel Prize in Economics, 2009) showed that communities can manage commons without privatization or government control — through locally designed rules (Ostrom 1990). But her solutions require:

  • Clear community boundaries
  • Rules adapted to local conditions
  • Collective decision-making
  • Monitoring and graduated sanctions
  • Outside authority that recognizes local rules

When these conditions fail — as in international whaling — the tragedy unfolds.

The Three Classic Solutions:

Show R code
commons_table <- tibble(
  `Solution` = c("1. Privatize the Commons",
                 "2. Government Regulation",
                 "3. Community Management (Ostrom)"),
  `Mechanism` = c(
    "Give each user property rights → they internalize full cost",
    "Quotas, licenses, season limits, bag limits",
    "Community members design, monitor, and enforce their own rules"
  ),
  `Example` = c(
    "Individual Transferable Quotas (ITQs) in New Zealand fisheries",
    "EPA fishing quotas, hunting licenses, NM water rights permits",
    "New England lobster gangs, Swiss alpine grazing associations"
  ),
  `Limitation` = c(
    "Hard to privatize mobile, invisible resources (fish, whales, air)",
    "Requires information; may be captured by industry",
    "Requires cohesive community; fails at large scales"
  )
)

commons_table %>%
  kable(caption = "Solutions to the Tragedy of the Commons") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE) %>%
  column_spec(1, bold = TRUE, color = pal$navy)
Solutions to the Tragedy of the Commons
Solution Mechanism Example Limitation
1. Privatize the Commons Give each user property rights → they internalize full cost Individual Transferable Quotas (ITQs) in New Zealand fisheries Hard to privatize mobile, invisible resources (fish, whales, air)
2. Government Regulation Quotas, licenses, season limits, bag limits EPA fishing quotas, hunting licenses, NM water rights permits Requires information; may be captured by industry
3. Community Management (Ostrom) Community members design, monitor, and enforce their own rules New England lobster gangs, Swiss alpine grazing associations Requires cohesive community; fails at large scales
Note🌊 New Mexico Application: Rio Grande Water Rights

The Rio Grande is a commons with a complex solution. New Mexico uses a prior appropriation (“first in time, first in right”) water rights system — essentially a privatized commons. Under drought conditions, senior water rights holders get first access; junior holders get cut off first (New Mexico Energy, Minerals and Natural Resources Department 2025).

This system: - Creates property rights over an invisible, mobile resource ✓ - Provides incentives for conservation ✓ - But: creates conflict between states (NM, TX, CO) and with federal requirements for endangered species (the silvery minnow in the Rio Grande) ✗ - And: doesn’t easily handle climate-change-driven scarcity ✗

Water in NM is increasingly treated as a genuinely “priceless” resource — but as Socks noted, priceless things get exploited.


10.6 — Public Goods

Stella is still staring at the fog where the whale disappeared. “Is there anything that markets just… naturally protect?” she asks.

Socks thinks for a long time. “Yes — if it’s neither rivalrous nor excludable. Those are public goods. Markets undersupply them. But at least they don’t get depleted by individual use.”

10.6.1 — The Four Types of Goods

Show R code
goods_table <- tibble(
  ` ` = c("**Excludable**", "**Non-Excludable**"),
  `Rivalrous` = c(
    "**Private Goods**\nFood, clothing, cars\n(market works well)",
    "**Common Pool Resources**\nFish stocks, whales, Rio Grande water\n(Tragedy of the Commons)"
  ),
  `Non-Rivalrous` = c(
    "**Club Goods**\nCable TV, toll roads, swimming pool\n(market can work; excludes non-payers)",
    "**Public Goods**\nNational defense, lighthouses, clean air\n(market fails: free-rider problem)"
  )
)

goods_table %>%
  kable(caption = "The Four Types of Goods: Excludability × Rivalry") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE) %>%
  column_spec(1, bold = TRUE, background = "#F0F4F8")
The Four Types of Goods: Excludability × Rivalry
Rivalrous Non-Rivalrous
**Excludable** **Private Goods** Food, clothing, cars (market works well) |**Club Goods** Cable TV, toll roads, swimming pool (market can work; excludes non-payers)
**Non-Excludable** **Common Pool Resources** Fish stocks, whales, Rio Grande water (Tragedy of the Commons |**Public Goods** National defense, lighthouses, clean air (market fails: free-rider probl
TipPublic Goods: Two Key Properties
  1. Non-rival: One person’s consumption does not reduce availability for others. (A lighthouse beam is just as bright for the second ship as the first.)

  2. Non-excludable: Once provided, you cannot prevent anyone from consuming it. (You can’t turn off the lighthouse beam for one boat while leaving it on for another.)

When both conditions hold: markets underprovide or don’t provide at all.

10.6.2 — The Free-Rider Problem

Note🏴‍☠️ Pirates Love Lighthouses (But Won’t Pay for Them)

“Tell me about lighthouses,” says Stella.

“Ah,” says Socks, with the weary tone of someone who’s had this conversation many times. “A lighthouse is a perfect public good. Non-rival — my ship using the light doesn’t use it up for your ship. Non-excludable — once it’s on, everyone within range gets it.”

“So pirates just use it for free?”

“Every pirate, every merchant, every fishing boat. Nobody can be excluded. So nobody has an incentive to pay for it voluntarily. Everyone hopes someone else will pay — that’s the free-rider problem. So privately owned lighthouses were chronically undersupplied.”

“So the government builds them?”

“That’s the standard answer. Coase actually argued that private lighthouses worked better than economists assumed — but only because Trinity House had regulatory power to force ships to pay port dues. Still a form of government enforcement, just indirect.”

The free-rider problem is the mechanism behind public goods market failure:

  • If you can consume the good whether or not you pay, rational individuals won’t pay voluntarily
  • Each person hopes everyone else will fund it
  • Resulting provision level is far below the social optimum
  • Solution: government provision funded by compulsory taxation

The demand aggregation problem: For private goods, market demand is determined by the willingness to pay of individual buyers — sum horizontally. For public goods, we sum vertically: what is the total value across all users for the same unit of the public good?

Show R code
# ── Public Good: Vertical Summation of Demand ─────────────────────────────────
# Pirate Pete's crew and the lighthouse
# Pete's willingness to pay: P_Pete = 80 - 2Q
# Stella's willingness to pay: P_Stella = 60 - 3Q
# Socks's willingness to pay: P_Socks = 40 - Q

Q_pub <- seq(0, 40, by = 0.5)
pete_demand   <- pmax(0, 80 - 2 * Q_pub)
stella_demand <- pmax(0, 60 - 3 * Q_pub)
socks_demand  <- pmax(0, 40 - Q_pub)
social_demand <- pete_demand + stella_demand + socks_demand

# Cost of lighthouse = $60 per unit of brightness
mc_public <- 60

df_pub <- tibble(
  Q       = Q_pub,
  Pete    = pete_demand,
  Stella  = stella_demand,
  Socks   = socks_demand,
  Social  = social_demand
)

# Social optimum: Social demand = MC
# 80 - 2Q + 60 - 3Q + 40 - Q = 60 → 180 - 6Q = 60 → Q** = 20
Q_soc_pub <- 20

ggplot(df_pub, aes(x = Q)) +
  geom_line(aes(y = Pete,   color = "Pete's MPB"),   linewidth = 1.2, linetype = "dashed") +
  geom_line(aes(y = Stella, color = "Stella's MPB"), linewidth = 1.2, linetype = "dashed") +
  geom_line(aes(y = Socks,  color = "Socks's MPB"),  linewidth = 1.2, linetype = "dashed") +
  geom_line(aes(y = Social, color = "MSB (Vertical Sum)"), linewidth = 2.0) +
  geom_hline(yintercept = mc_public, color = pal$teal, linewidth = 1.5) +
  geom_vline(xintercept = Q_soc_pub, linetype = "dashed",
             color = pal$green, linewidth = 1.0) +
  geom_point(aes(x = Q_soc_pub, y = mc_public), color = pal$green, size = 5) +
  annotate("text", x = Q_soc_pub + 0.8, y = mc_public + 8,
           label = paste0("Social Optimum\nQ** = ", Q_soc_pub, " units of brightness"),
           color = pal$green, size = 3.5, hjust = 0) +
  annotate("text", x = 30, y = 65,
           label = "MC = $60/unit", color = pal$teal, size = 3.5) +
  scale_color_manual(values = c(
    "Pete's MPB"         = pal$navy,
    "Stella's MPB"       = pal$coral,
    "Socks's MPB"        = pal$gold,
    "MSB (Vertical Sum)" = pal$purple
  )) +
  scale_y_continuous(labels = dollar_format(prefix = "$"), limits = c(0, 185)) +
  labs(
    title    = "Public Good: Vertical Summation of Demand",
    subtitle = "The lighthouse provides the same light to Pete, Stella, and Socks simultaneously — we ADD their values",
    x        = "Quantity of Public Good (Lighthouse Brightness)",
    y        = "Willingness to Pay ($)",
    color    = NULL,
    caption  = "Illustrative model | Pete: P = 80-2Q | Stella: P = 60-3Q | Socks: P = 40-Q\nCowen & Tabarrok Ch. 10 | ECON2120G-M02"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title    = element_text(face = "bold", color = pal$navy),
    plot.subtitle = element_text(color = pal$slate),
    panel.grid.minor = element_blank(),
    legend.position  = "right"
  )

ImportantVertical Summation: Why Public Goods are Different

For private goods: You wouldn’t eat the same apple as your neighbor. Different people consume different units → sum horizontally (at each price, how many units does the whole market demand?).

For public goods: You and your neighbor both enjoy the same unit of national defense or the same lighthouse beam. → Sum vertically (at each quantity, what is the total value to all people simultaneously consuming it?).

The optimal provision rule:

\[\sum_i MB_i(Q^{**}) = MC(Q^{**})\]

The sum of all individuals’ marginal benefits must equal marginal cost — a condition known as the Samuelson Rule (Samuelson 1954).

10.6.3 — New Mexico Public Goods: Carlsbad Caverns

Carlsbad Caverns National Park is a textbook public good:

  • Non-rival: 500,000 visitors per year, but the cave remains (National Park Service data, National Park Service 2025)
  • Non-excludable: The government can charge admission, but the stalactites are not diminished by viewing
  • Undersupplied by markets: No private firm has adequate incentive to preserve a geological wonder for future generations when they can’t capture future generations’ willingness to pay

The National Park Service charges $15/person entry — a user fee that partially captures willingness to pay. But this doesn’t solve the existence value problem: millions of people who will never visit Carlsbad Caverns still value knowing it exists and is preserved. Markets can’t capture that value.

Note🌵 NM Application: Oil and Gas Externalities

New Mexico is the second-largest oil-producing state in the U.S. The Permian Basin (SE New Mexico) generates enormous private value — and significant externalities:

Negative externalities: - Methane flaring and fugitive emissions from oil/gas operations (U.S. Environmental Protection Agency 2024) - VOC and NOₓ pollution affecting air quality in the Permian Basin (Eddy, Lea counties) - Produced water spills affecting Rio Grande watershed tributaries - Light pollution over the Guadalupe Mountain/Carlsbad Caverns Dark Sky corridor

The irony: The same oil and gas that funds ~40% of NM state education revenue generates externalities that damage public goods (clean air, dark skies, water quality) that the state is also legally obligated to protect.

This is not a simple problem. It’s Chapter 10 in the real world.


10.7 — Equations Summary

Show R code
# ── Summary table of all key equations ────────────────────────────────────────
eq_table <- tibble(
  `Concept` = c(
    "Social Cost",
    "Social Benefit",
    "Pigouvian Tax (optimal)",
    "Pigouvian Subsidy (optimal)",
    "Deadweight Loss (neg. ext.)",
    "Deadweight Loss (pos. ext.)",
    "Coase Efficiency Condition",
    "Samuelson Rule (public goods)",
    "Tragedy of Commons: Overuse"
  ),
  `Equation` = c(
    "MSC = MPC + MEC",
    "MSB = MPB + MEB",
    "$t^* = MEC(Q^{**})$ (tax = external cost at social optimum)",
    "$s^* = MEB(Q^{**})$ (subsidy = external benefit at social optimum)",
    "DWL = ½ × (Q_market − Q_social) × MEC",
    "DWL = ½ × (Q_social − Q_market) × MEB",
    "Private bargaining → Q_efficient when transaction costs = 0",
    "$\\sum_i MB_i(Q^{**}) = MC(Q^{**})$",
    "N enters until MB_avg = MC; socially optimal N < N_open-access"
  ),
  `Where` = c(
    "MSC: marginal social cost; MEC: marginal external cost",
    "MSB: marginal social benefit; MEB: marginal external benefit",
    "t*: optimal Pigouvian tax; Q**: social optimum",
    "s*: optimal Pigouvian subsidy; Q**: social optimum",
    "Q_market: private equilibrium; Q_social: social optimum",
    "Q_market: private equilibrium; Q_social: social optimum",
    "Coase theorem: distribution ≠ efficiency when TC = 0",
    "Vertical summation of all individuals' marginal benefits",
    "N: number of users; commons overexploited vs. social optimum"
  )
)

eq_table %>%
  kable(caption = "Chapter 10 Key Equations: Externalities & Public Goods") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE) %>%
  column_spec(1, bold = TRUE, color = pal$navy) %>%
  column_spec(2, monospace = TRUE)
Chapter 10 Key Equations: Externalities & Public Goods
Concept Equation Where
Social Cost MSC = MPC + MEC MSC: marginal social cost; MEC: marginal external cost
Social Benefit MSB = MPB + MEB MSB: marginal social benefit; MEB: marginal external benefit
Pigouvian Tax (optimal) $t^* = MEC(Q^{**})$ (tax = external cost at social optimum) t*: optimal Pigouvian tax; Q**: social optimum
Pigouvian Subsidy (optimal) $s^* = MEB(Q^{**})$ (subsidy = external benefit at social optimum) s*: optimal Pigouvian subsidy; Q**: social optimum
Deadweight Loss (neg. ext.) DWL = ½ × (Q_market − Q_social) × MEC Q_market: private equilibrium; Q_social: social optimum
Deadweight Loss (pos. ext.) DWL = ½ × (Q_social − Q_market) × MEB Q_market: private equilibrium; Q_social: social optimum
Coase Efficiency Condition Private bargaining → Q_efficient when transaction costs = 0 Coase theorem: distribution ≠ efficiency when TC = 0
Samuelson Rule (public goods) $\sum_i MB_i(Q^{**}) = MC(Q^{**})$ Vertical summation of all individuals' marginal benefits
Tragedy of Commons: Overuse N enters until MB_avg = MC; socially optimal N < N_open-access N: number of users; commons overexploited vs. social optimum

10.8 — A Worked Example: The Oil Field

Let’s make it concrete with a clean numerical example.

Setup: Trillionaire Bob runs an oil field near Carlsbad. He faces:

  • Demand: \(P = 120 - 2Q\) (market demand for oil barrels)
  • MPC: \(P = 20 + 2Q\) (Bob’s private marginal cost)
  • MEC: \(\$30\) per barrel (methane and pollution damage to neighbors)
  • MSC: \(P = 20 + 2Q + 30 = 50 + 2Q\)
Show R code
# ── Worked Example: Oil Field Externality ─────────────────────────────────────

# Step 1: Private equilibrium (Demand = MPC)
# 120 - 2Q = 20 + 2Q → 100 = 4Q → Q_priv = 25, P_priv = 70
Q_priv_ex <- 25; P_priv_ex <- 70

# Step 2: Social optimum (Demand = MSC)
# 120 - 2Q = 50 + 2Q → 70 = 4Q → Q_soc_ex = 17.5, P_soc_ex = 85
Q_soc_ex <- 17.5; P_soc_ex <- 85

# Step 3: Optimal Pigouvian tax = MEC = $30
pigouvian_t <- 30

# Step 4: DWL = ½ × ΔQ × MEC
dwl_ex <- 0.5 * (Q_priv_ex - Q_soc_ex) * 30

worked_table <- tibble(
  Step = c(
    "1. Private equilibrium",
    "2. Social optimum",
    "3. Overproduction",
    "4. Optimal Pigouvian tax",
    "5. Deadweight loss"
  ),
  Calculation = c(
    "120 − 2Q = 20 + 2Q → Q* = 25, P* = $70",
    "120 − 2Q = 50 + 2Q → Q** = 17.5, P** = $85",
    "ΔQ = Q* − Q** = 25 − 17.5 = 7.5 barrels",
    "t* = MEC = $30 per barrel",
    "DWL = ½ × 7.5 × $30 = $112.50"
  ),
  Result = c(
    "Q* = 25, P* = $70",
    "Q** = 17.5, P** = $85",
    "7.5 barrels too many",
    "Tax = $30/barrel",
    "DWL = $112.50"
  )
)

worked_table %>%
  kable(caption = "Worked Example: Trillionaire Bob's Oil Field Externality") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE) %>%
  column_spec(1, bold = TRUE, color = pal$navy) %>%
  column_spec(3, bold = TRUE, color = pal$red)
Worked Example: Trillionaire Bob's Oil Field Externality
Step Calculation Result
1. Private equilibrium 120 − 2Q = 20 + 2Q → Q* = 25, P* = $70 Q* = 25, P* = $70
2. Social optimum 120 − 2Q = 50 + 2Q → Q** = 17.5, P** = $85 Q** = 17.5, P** = $85
3. Overproduction ΔQ = Q* − Q** = 25 − 17.5 = 7.5 barrels 7.5 barrels too many
4. Optimal Pigouvian tax t* = MEC = $30 per barrel Tax = $30/barrel
5. Deadweight loss DWL = ½ × 7.5 × $30 = $112.50 DWL = $112.50
TipStep-by-Step Method
  1. Find the private equilibrium: Set Demand = MPC → solve for Q, P
  2. Find the social optimum: Set Demand = MSC (or MSB = MPC for positive ext.) → solve for Q, P
  3. Calculate overproduction/underproduction: \(|\Delta Q| = |Q^* - Q^{**}|\)
  4. Optimal Pigouvian correction: Tax = MEC or Subsidy = MEB at Q**
  5. DWL: Area of triangle = \(\frac{1}{2} \times \Delta Q \times MEC\) (or \(\times MEB\))

10.9 — Discussion Questions

  1. The White Whale: Why does “priceless” mean “exploited” in economic terms? What property rights solution might have saved the white whale? What would Coase say?

  2. New Mexico Methane: New Mexico’s oil and gas sector produces significant methane emissions — a potent greenhouse gas. Draw the externality diagram for an NM oil well. What is the correct Pigouvian tax? Why is it politically difficult to implement?

  3. Carlsbad Caverns vs. A Private Theme Park: Compare Carlsbad Caverns (public good / national park) with Disneyland (private good / excludable). Why does the government provide one but not the other? Is this efficient?

  4. The Rio Grande Aquifer: Farmers in the Mesilla Valley pump groundwater from the Rio Grande aquifer. Is this a commons problem, a public good problem, or a negative externality problem? What solution does New Mexico’s prior appropriation system provide? What does it fail to address?

  5. Vaccines and Herd Immunity: COVID-19 vaccines provided private protection and external protection to unvaccinated neighbors. Draw the positive externality diagram. What subsidy would achieve the socially optimal vaccination rate? What happened in practice?

  6. The Free-Rider and the Pirate: Pirate Pete uses every lighthouse he passes but never contributes to lighthouse maintenance funds. Is he acting irrationally? Immorally? What’s the economists’ answer?


10.10 — Putting It All Together: “Priceless” Means Exploited

Note🏴‍☠️ Stella’s Revelation

The fog clears. The whaling ships are gone. The white whale is gone too.

Stella is quiet for a long time. Then: “I finally understand what you meant. Because no one owned her, no one had the incentive to protect her. She was a commons. Every whaler knew she might be the last — and that made them want to catch her MORE, not less.”

“Yes,” says Socks.

“And because she was ‘priceless’ — literally had no price — there was no market signal telling whalers to stop. No rising price that would say ‘this resource is getting scarce.’”

“Correct.”

“And because the costs of hunting her fell only on her, on the ocean, on future generations — not on the whalers themselves — the full social cost was never counted.”

Socks nods slowly. “You’ve just summarized Chapters 10 through 15.”

Stella wipes her eyes. “Can we go back in time and stop them?”

“We could. But we’d need property rights, zero transaction costs, and a government willing to enforce a Pigouvian tax on harpoons.” He chews his seaweed. “Welcome to the policy problem.” 🐋

The most important lesson of this chapter is not the math — it’s the logic.

When markets work, they are a miracle of coordination. Billions of decisions, no central planner, and somehow the right amount of things gets made at the right price. Adam Smith’s invisible hand.

But the invisible hand can only work with what it can feel. It cannot feel costs that fall on third parties. It cannot feel values that belong to people not yet born. It cannot feel the existence value of a white whale in a distant ocean.

When costs are invisible to the price system, markets overproduce — and we get pollution, depleted fisheries, and climate change.

When benefits are invisible to the price system, markets underproduce — and we get too few vaccines, too little education, and not enough basic research.

And when resources are owned by everyone and therefore by no one — when they are “priceless” — they get exploited.

Economics doesn’t say markets are bad. It says markets fail in specific, predictable ways. And when we understand how they fail, we can fix them.

That’s what the tools in this chapter are for.

SLO-10: You can now explain market failures from externalities and public goods.

SLO-11: You can graphically and numerically identify deadweight loss, Pigouvian corrections, and welfare changes from taxes, subsidies, and regulation.


References

Coase, Ronald H. 1960. “The Problem of Social Cost.” Journal of Law and Economics 3: 1–44. https://doi.org/10.1086/466560.
Cowen, Tyler, and Alex Tabarrok. 2021. Modern Principles: Microeconomics. 5th ed. Worth Publishers.
Federal Reserve Bank of St. Louis. 2026. FRED Economic Data: Global CO2 Emissions. Https://fred.stlouisfed.org/series/EMISSCO2TOTVTTTOAUSA.
Hardin, Garrett. 1968. “The Tragedy of the Commons.” Science 162 (3859): 1243–48. https://doi.org/10.1126/science.162.3859.1243.
National Park Service. 2025. Carlsbad Caverns National Park. Https://www.nps.gov/cave/index.htm.
New Mexico Energy, Minerals and Natural Resources Department. 2025. New Mexico Oil and Gas Bureau. Https://www.emnrd.nm.gov/ocd.
Ostrom, Elinor. 1990. Governing the Commons: The Evolution of Institutions for Collective Action. Cambridge University Press.
Pigou, Arthur Cecil. 1920. The Economics of Welfare. Macmillan.
Samuelson, Paul A. 1954. “The Pure Theory of Public Expenditure.” In Review of Economics and Statistics, No. 4, vol. 36. https://doi.org/10.2307/1925895.
U.S. Environmental Protection Agency. 2023. Acid Rain Program: SO2 Allowance Trading. Https://www.epa.gov/airmarkets/acid-rain-program.
U.S. Environmental Protection Agency. 2024. Methane and VOC Rules for Oil and Gas Sector. Https://www.epa.gov/controlling-air-pollution-oil-and-natural-gas-industry.
World Bank. 2025. Carbon Pricing Dashboard. Https://carbonpricingdashboard.worldbank.org.

ECON2120G-M02 | Principles of Microeconomics | Class #26 | Dr. Meghan Downes | Spring 2026

🐐 The Teaching Goat — Based on Cowen & Tabarrok, Modern Principles: Microeconomics, 5th ed. (Worth Publishers), Ch. 10

Back to top