Fehr-Schmidt inequality aversion: modelling fairness in games

behavioral-gt
social-preferences
inequality-aversion
Implement the Fehr-Schmidt model of inequality aversion, where players experience disutility from both advantageous and disadvantageous inequality, and apply it to the ultimatum, dictator, and public goods games.
Author

Raban Heller

Published

May 8, 2026

Modified

May 8, 2026

Keywords

Fehr-Schmidt, inequality aversion, social preferences, ultimatum game, fairness, R

Introduction & motivation

Standard game theory assumes that players are rational and self-interested: each player cares only about their own material payoff. This assumption generates sharp predictions — in the ultimatum game, the proposer should offer the minimal positive amount and the responder should accept any positive offer; in the dictator game, the dictator should keep everything; in the public goods game, no one should contribute. Yet decades of experimental evidence have demonstrated that real people systematically violate these predictions. Responders in ultimatum games reject low offers, sometimes refusing 20-30% of the pie. Dictators give away 20-30% on average. And people contribute significantly to public goods, at least initially. These robust behavioural patterns demand a theoretical explanation (Güth et al. 1982; Camerer 2003).

The Fehr-Schmidt model of inequality aversion (Fehr and Schmidt 1999) provides one of the most influential and parsimonious explanations. The core idea is elegantly simple: people dislike inequality. Specifically, a player’s utility depends not only on their own material payoff but also on how their payoff compares to others’. A player suffers disutility from disadvantageous inequality (when others earn more, captured by the parameter \(\alpha\), interpreted as “envy”) and from advantageous inequality (when they earn more than others, captured by the parameter \(\beta\), interpreted as “guilt”). The key asymmetry is that \(\alpha \geq \beta\) — people dislike being behind more than they dislike being ahead. This simple two-parameter extension of standard preferences can rationalise an impressive range of experimental findings.

Consider the ultimatum game through the Fehr-Schmidt lens. A proposer splits a pie of size 1, offering share \(s\) to the responder and keeping \(1-s\). Under standard preferences, the responder accepts any \(s > 0\). But an inequality-averse responder compares their payoff \(s\) to the proposer’s payoff \(1-s\). If \(s < 0.5\), the responder experiences disadvantageous inequality with disutility \(\alpha(1-2s)\). The responder’s utility from accepting is \(s - \alpha(1 - 2s)\), and their utility from rejecting (both get 0, hence no inequality) is 0. The responder rejects if \(s - \alpha(1 - 2s) < 0\), which simplifies to \(s < \alpha/(1 + 2\alpha)\). For a moderately inequality-averse responder with \(\alpha = 1\), the rejection threshold is \(s < 1/3\). This explains why offers below 30% are frequently rejected in experiments. Moreover, a rational proposer who knows the responder is inequality-averse will anticipate this rejection threshold and offer more generous splits, which matches the experimental observation that modal offers are typically 40-50%.

The Fehr-Schmidt model extends naturally to multi-player settings. In a public goods game, inequality-averse players dislike the inequality that arises when some contribute and others free-ride. This creates an incentive for conditional cooperation: an inequality-averse player is willing to contribute as long as others do the same, because contributing while others free-ride creates disadvantageous inequality. This mechanism explains the robust experimental finding that many people are “conditional cooperators” who contribute to public goods as long as they believe others will also contribute (Fischbacher et al. 2001). The model also explains why cooperation declines over repeated rounds (as some free-riders reduce contributions, conditional cooperators follow, leading to an unravelling dynamic) and why punishment opportunities sustain cooperation (inequality-averse players are willing to pay a cost to reduce the payoff of free-riders, restoring equality) (Fehr and Gächter 2000).

The Fehr-Schmidt model is not the only model of social preferences. The Bolton-Ockenfels (2000) ERC model captures similar intuitions with a different functional form. Models of reciprocity (Rabin 1993, Dufwenberg and Kirchsteiger 2004) go further by making preferences depend on beliefs about intentions, not just outcomes. Models of warm-glow giving and pure altruism capture additional motives for generosity. Each model has different strengths and limitations, and an active research literature continues to compare and refine them. The Fehr-Schmidt model’s enduring appeal lies in its simplicity, its tractability (it preserves the standard Nash equilibrium framework, just with modified utility functions), and its ability to organise a wide range of experimental findings with just two parameters.

In this tutorial, we implement the Fehr-Schmidt utility function, compute equilibria in the ultimatum and dictator games under inequality aversion, simulate a public goods game with heterogeneous inequality-averse players, and compare the predictions of Fehr-Schmidt preferences with standard selfish predictions across all three games.

Mathematical formulation

For a two-player game with payoffs \((x_i, x_j)\), the Fehr-Schmidt utility of player \(i\) is:

\[ U_i(x_i, x_j) = x_i - \alpha_i \cdot \max(x_j - x_i, 0) - \beta_i \cdot \max(x_i - x_j, 0) \]

where \(\alpha_i \geq 0\) captures envy (disutility from disadvantageous inequality) and \(0 \leq \beta_i < 1\) captures guilt (disutility from advantageous inequality). The constraint \(\alpha_i \geq \beta_i\) reflects the empirical regularity that disadvantageous inequality hurts more than advantageous inequality.

For \(n\) players, the general form is:

\[ U_i(\mathbf{x}) = x_i - \frac{\alpha_i}{n-1} \sum_{j \neq i} \max(x_j - x_i, 0) - \frac{\beta_i}{n-1} \sum_{j \neq i} \max(x_i - x_j, 0) \]

Ultimatum game: The responder’s minimum acceptable offer is:

\[ s^* = \frac{\alpha_R}{1 + 2\alpha_R} \]

The proposer, if inequality-averse with parameter \(\beta_P\), maximises \(U_P = (1 - s) - \beta_P(1 - 2s)\) subject to \(s \geq s^*\). If \(\beta_P < 0.5\), the proposer offers exactly \(s^*\); if \(\beta_P \geq 0.5\), the proposer offers \(s = 0.5\) (equal split).

Dictator game: The dictator with guilt parameter \(\beta_D\) gives \(s = \beta_D / (1 + 2\beta_D)\) if \(\beta_D > 0\), and gives 0 if \(\beta_D = 0\).

R implementation

We implement the Fehr-Schmidt utility function, compute equilibrium outcomes for different parameter values, and simulate a public goods game with heterogeneous players.

set.seed(314)

# --- Fehr-Schmidt utility (two-player) ---
fs_utility <- function(xi, xj, alpha, beta) {
  xi - alpha * max(xj - xi, 0) - beta * max(xi - xj, 0)
}

# --- Ultimatum game equilibrium ---
ultimatum_threshold <- function(alpha_R) {
  alpha_R / (1 + 2 * alpha_R)
}

ultimatum_optimal_offer <- function(alpha_R, beta_P) {
  threshold <- ultimatum_threshold(alpha_R)
  if (beta_P >= 0.5) return(0.5)  # Offers equal split
  return(threshold)  # Offers minimum acceptable
}

# --- Dictator game optimal giving ---
dictator_giving <- function(beta_D) {
  if (beta_D == 0) return(0)
  beta_D / (1 + 2 * beta_D)
}

# Compute outcomes for a range of parameters
alpha_vals <- seq(0, 4, by = 0.1)
beta_vals <- seq(0, 0.9, by = 0.1)

# Ultimatum: rejection thresholds
ult_thresholds <- data.frame(
  alpha = alpha_vals,
  threshold = sapply(alpha_vals, ultimatum_threshold)
)

cat("=== Ultimatum game: rejection thresholds ===\n")
=== Ultimatum game: rejection thresholds ===
cat("Alpha (envy) | Min. acceptable offer\n")
Alpha (envy) | Min. acceptable offer
cat("-------------+----------------------\n")
-------------+----------------------
for (a in c(0, 0.5, 1, 2, 4)) {
  cat(sprintf("  %5.1f      | %.3f (%.1f%%)\n",
              a, ultimatum_threshold(a), ultimatum_threshold(a) * 100))
}
    0.0      | 0.000 (0.0%)
    0.5      | 0.250 (25.0%)
    1.0      | 0.333 (33.3%)
    2.0      | 0.400 (40.0%)
    4.0      | 0.444 (44.4%)
# Dictator game: optimal giving
cat("\n=== Dictator game: optimal giving ===\n")

=== Dictator game: optimal giving ===
cat("Beta (guilt) | Share given\n")
Beta (guilt) | Share given
cat("-------------+-----------\n")
-------------+-----------
for (b in c(0, 0.1, 0.25, 0.5, 0.75)) {
  cat(sprintf("  %5.2f      | %.3f (%.1f%%)\n",
              b, dictator_giving(b), dictator_giving(b) * 100))
}
   0.00      | 0.000 (0.0%)
   0.10      | 0.083 (8.3%)
   0.25      | 0.167 (16.7%)
   0.50      | 0.250 (25.0%)
   0.75      | 0.300 (30.0%)
# --- Public goods game with Fehr-Schmidt players ---
# N players, endowment = 20, MPCR = 0.4
simulate_public_goods <- function(N = 4, endowment = 20, mpcr = 0.4,
                                   alphas, betas, n_rounds = 10) {
  contributions <- matrix(0, nrow = n_rounds, ncol = N)

  for (r in 1:n_rounds) {
    for (i in 1:N) {
      # Optimise contribution given beliefs about others
      if (r == 1) {
        # Initial: assume others contribute half
        expected_others <- rep(endowment / 2, N - 1)
      } else {
        expected_others <- contributions[r - 1, -i]
      }

      best_c <- 0
      best_u <- -Inf

      for (ci in seq(0, endowment, by = 1)) {
        total_contrib <- ci + sum(expected_others)
        payoff_i <- (endowment - ci) + mpcr * total_contrib
        payoffs_others <- (endowment - expected_others) + mpcr * total_contrib

        # Fehr-Schmidt utility
        envy_term <- sum(pmax(payoffs_others - payoff_i, 0)) / (N - 1)
        guilt_term <- sum(pmax(payoff_i - payoffs_others, 0)) / (N - 1)
        ui <- payoff_i - alphas[i] * envy_term - betas[i] * guilt_term

        if (ui > best_u) {
          best_u <- ui
          best_c <- ci
        }
      }
      contributions[r, i] <- best_c
    }
  }

  contributions
}

# Simulate: 2 selfish + 2 inequality-averse players
N <- 4
alphas <- c(0, 0, 2, 2)      # Two selfish, two inequality-averse
betas  <- c(0, 0, 0.6, 0.6)

contribs <- simulate_public_goods(N = N, alphas = alphas, betas = betas,
                                   n_rounds = 10)
colnames(contribs) <- c("Selfish 1", "Selfish 2", "IA Player 3", "IA Player 4")

cat("\n=== Public goods game (4 players, 10 rounds) ===\n")

=== Public goods game (4 players, 10 rounds) ===
cat("Types: Players 1-2 selfish (a=0,b=0), Players 3-4 IA (a=2,b=0.6)\n\n")
Types: Players 1-2 selfish (a=0,b=0), Players 3-4 IA (a=2,b=0.6)
cat("Round | P1 | P2 | P3 | P4 | Mean\n")
Round | P1 | P2 | P3 | P4 | Mean
cat("------+----+----+----+----+-----\n")
------+----+----+----+----+-----
for (r in 1:10) {
  cat(sprintf("  %2d  | %2d | %2d | %2d | %2d | %4.1f\n",
              r, contribs[r, 1], contribs[r, 2],
              contribs[r, 3], contribs[r, 4], mean(contribs[r, ])))
}
   1  |  0 |  0 |  3 |  3 |  1.5
   2  |  0 |  0 |  0 |  0 |  0.0
   3  |  0 |  0 |  0 |  0 |  0.0
   4  |  0 |  0 |  0 |  0 |  0.0
   5  |  0 |  0 |  0 |  0 |  0.0
   6  |  0 |  0 |  0 |  0 |  0.0
   7  |  0 |  0 |  0 |  0 |  0.0
   8  |  0 |  0 |  0 |  0 |  0.0
   9  |  0 |  0 |  0 |  0 |  0.0
  10  |  0 |  0 |  0 |  0 |  0.0
# --- Compare predictions: selfish vs. FS ---
cat("\n=== Selfish vs. Fehr-Schmidt predictions ===\n")

=== Selfish vs. Fehr-Schmidt predictions ===
cat("Game          | Selfish prediction | FS prediction (a=1, b=0.4)\n")
Game          | Selfish prediction | FS prediction (a=1, b=0.4)
cat("--------------+--------------------+----------------------------\n")
--------------+--------------------+----------------------------
a_typ <- 1; b_typ <- 0.4
cat(sprintf("Ultimatum     | Offer ~0%%          | Offer %.1f%%\n",
            ultimatum_optimal_offer(a_typ, b_typ) * 100))
Ultimatum     | Offer ~0%          | Offer 33.3%
cat(sprintf("Dictator      | Give 0%%            | Give %.1f%%\n",
            dictator_giving(b_typ) * 100))
Dictator      | Give 0%            | Give 22.2%
cat(sprintf("Public goods  | Contribute 0       | Conditional cooperation\n"))
Public goods  | Contribute 0       | Conditional cooperation

Static publication-ready figure

The figure displays how the Fehr-Schmidt utility function depends on the other player’s payoff, showing the characteristic kinked shape at the point of equality.

xi <- 50
xj_range <- seq(0, 100, by = 0.5)

# Three parameter profiles
profiles <- list(
  list(alpha = 0, beta = 0, label = "Selfish (a=0, b=0)"),
  list(alpha = 1, beta = 0.3, label = "Moderate IA (a=1, b=0.3)"),
  list(alpha = 3, beta = 0.6, label = "Strong IA (a=3, b=0.6)")
)

util_data <- do.call(rbind, lapply(profiles, function(prof) {
  data.frame(
    xj = xj_range,
    utility = sapply(xj_range, function(xj) fs_utility(xi, xj, prof$alpha, prof$beta)),
    profile = prof$label
  )
}))

util_data$profile <- factor(util_data$profile,
                             levels = sapply(profiles, function(p) p$label))

p_static <- ggplot(util_data, aes(x = xj, y = utility, colour = profile)) +
  geom_line(linewidth = 1) +
  geom_vline(xintercept = 50, linetype = "dashed", colour = "grey50") +
  annotate("text", x = 25, y = 55, label = "Guilt region\n(x_i > x_j)",
           size = 3, colour = "grey40") +
  annotate("text", x = 75, y = 55, label = "Envy region\n(x_j > x_i)",
           size = 3, colour = "grey40") +
  annotate("text", x = 51, y = -20, label = "Equal\npayoffs",
           size = 2.5, colour = "grey50", hjust = 0) +
  scale_colour_manual(values = okabe_ito[c(8, 1, 6)], name = "Preference type") +
  labs(
    title = "Fehr-Schmidt utility: the cost of inequality",
    subtitle = expression(paste("Own payoff fixed at ", x[i], " = 50; varying other player's payoff ", x[j])),
    x = expression(paste("Other player's payoff (", x[j], ")")),
    y = expression(paste("Utility of player i (", U[i], ")"))
  ) +
  theme_publication()

p_static
Figure 1: Figure 1. Fehr-Schmidt utility as a function of the other player’s payoff (x_j), for fixed own payoff x_i = 50. The kink at x_j = 50 (equal payoffs) separates the guilt region (left, advantageous inequality) from the envy region (right, disadvantageous inequality). Higher alpha values produce steeper decline in the envy region.

Interactive figure

The interactive figure explores how ultimatum game rejection thresholds and proposer offers change across the full range of inequality aversion parameters.

# Rejection threshold as function of alpha, for different beta_P values
param_grid <- expand.grid(
  alpha_R = seq(0, 5, by = 0.1),
  beta_P = c(0, 0.25, 0.5, 0.75)
)

param_grid <- param_grid %>%
  mutate(
    threshold = sapply(alpha_R, ultimatum_threshold),
    optimal_offer = mapply(ultimatum_optimal_offer, alpha_R, beta_P),
    beta_label = sprintf("Proposer guilt: b=%.2f", beta_P),
    text = sprintf("Responder envy (a): %.1f\nProposer guilt (b): %.2f\nMin. acceptable offer: %.1f%%\nOptimal offer: %.1f%%",
                   alpha_R, beta_P, threshold * 100, optimal_offer * 100)
  )

p_int <- ggplot(param_grid, aes(x = alpha_R, y = optimal_offer,
                                 colour = beta_label, text = text)) +
  geom_line(linewidth = 0.9) +
  geom_line(data = param_grid %>% filter(beta_P == 0),
            aes(y = threshold), linetype = "dotted", colour = "grey50") +
  annotate("text", x = 4.5, y = 0.1, label = "Min. acceptable\n(rejection threshold)",
           size = 2.8, colour = "grey50") +
  scale_colour_manual(values = okabe_ito[c(1, 3, 5, 6)], name = "Proposer type") +
  scale_y_continuous(labels = scales::percent_format(), limits = c(0, 0.55)) +
  labs(
    title = "Ultimatum game: how inequality aversion shapes offers",
    x = expression(paste("Responder's envy parameter (", alpha[R], ")")),
    y = "Proposer's optimal offer"
  ) +
  theme_publication()

ggplotly(p_int, tooltip = "text") %>%
  config(displaylogo = FALSE)
Figure 2

Interpretation

The Fehr-Schmidt model demonstrates that a remarkably simple modification of the standard utility function — adding terms that penalise payoff differences — can rationalise a wide range of experimental anomalies that have puzzled economists for decades. The utility function’s kinked shape at the point of equality, with a steeper slope on the disadvantageous side (\(\alpha \geq \beta\)), captures the intuitive asymmetry between envy and guilt: being worse off than someone else hurts more than being better off. This asymmetry is one of the model’s most robust empirical features, consistently supported by experimental evidence across different games and populations.

In the ultimatum game, the model generates two key predictions that match the data. First, responders with positive \(\alpha\) will reject sufficiently low offers, because the disutility from disadvantageous inequality exceeds the material gain from accepting. With \(\alpha = 1\), the rejection threshold is at about 33% of the pie, which is strikingly close to the modal rejection threshold observed in experiments. Second, proposers who either are inequality-averse themselves (\(\beta > 0\)) or who anticipate inequality-averse responders will make generous offers. The model predicts that offers will cluster around 40-50% of the pie, exactly as observed. Crucially, these predictions arise without assuming that players are irrational — they are simply maximising a different utility function than the one standard theory assumes.

The dictator game provides a more direct test of the guilt parameter \(\beta\). Since the dictator faces no threat of rejection, any positive giving must be driven by intrinsic preferences. The Fehr-Schmidt model predicts that a dictator with \(\beta = 0.4\) will give about 17% of the pie, which is close to the experimental average of 20-30%. However, the model cannot explain the bimodal distribution typically observed in dictator games (many subjects give either 0 or 50%), because it predicts a single interior optimum for each parameter value. This limitation points to the need for population heterogeneity: some subjects have \(\beta = 0\) (giving nothing) while others have high \(\beta\) (giving generously).

The public goods game simulation illustrates how inequality aversion can sustain cooperation even in the absence of punishment or communication. Inequality-averse players (high \(\alpha\) and \(\beta\)) are willing to contribute when they believe others will also contribute, because free-riding would create advantageous inequality (they earn more than contributors), which causes guilt. However, if they observe that others are not contributing, they reduce their own contributions to avoid disadvantageous inequality (earning less than free-riders). This generates the “conditional cooperation” pattern that is the most robust finding in public goods experiments. The dynamics in our simulation show how contributions can unravel over time when inequality-averse players are mixed with selfish ones: the selfish players free-ride, causing the inequality-averse players to gradually reduce their contributions, leading to a decline in average contributions over rounds. This decline is slower than what standard theory predicts (immediate zero contribution) but ultimately reaches low levels.

A critical assessment of the Fehr-Schmidt model must acknowledge several limitations. First, the model is outcome-based: it depends only on final payoff differences, not on how those differences arose. This means it cannot distinguish between inequality caused by bad luck and inequality caused by intentional exploitation, a distinction that matters greatly to real people. Intention-based models of reciprocity address this limitation but at the cost of greater complexity. Second, the model assumes that the parameters \(\alpha\) and \(\beta\) are fixed traits of individuals, but experimental evidence suggests that these parameters may be context-dependent — people may be more inequality-averse in some situations (e.g., when they have earned their endowment) than in others (e.g., windfall games). Third, the two-player version of the model does not straightforwardly generalise to large groups, where the normalisation by \(1/(n-1)\) can produce counterintuitive predictions. Despite these limitations, the Fehr-Schmidt model remains a foundational reference point in behavioural game theory, and its influence on both theoretical and experimental research has been enormous.

The model’s practical implications extend beyond the laboratory. In organisational design, understanding inequality aversion helps explain why wage compression (reducing pay differentials) can sometimes increase productivity rather than decrease it, because workers who perceive their pay as unfair may reduce effort or engage in sabotage. In public policy, inequality aversion provides a microfoundation for the widespread preference for redistributive policies even among people who are not direct beneficiaries. And in mechanism design, accounting for social preferences can lead to different optimal mechanisms than those designed for purely selfish agents.

References

Bolton, Gary E., and Axel Ockenfels. 2000. “ERC: A Theory of Equity, Reciprocity, and Competition.” American Economic Review 90 (1): 166–93. https://doi.org/10.1257/aer.90.1.166.
Camerer, Colin F. 2003. Behavioral Game Theory: Experiments in Strategic Interaction. Princeton University Press.
Fehr, Ernst, and Simon Gächter. 2000. “Cooperation and Punishment in Public Goods Experiments.” American Economic Review 90 (4): 980–94. https://doi.org/10.1257/aer.90.4.980.
Fehr, Ernst, and Klaus M. Schmidt. 1999. “A Theory of Fairness, Competition, and Cooperation.” The Quarterly Journal of Economics 114 (3): 817–68. https://doi.org/10.1162/003355399556151.
Fischbacher, Urs, Simon Gächter, and Ernst Fehr. 2001. “Are People Conditionally Cooperative? Evidence from a Public Goods Experiment.” Economics Letters 71 (3): 397–404. https://doi.org/10.1016/S0165-1765(01)00394-9.
Güth, Werner, Rolf Schmittberger, and Bernd Schwarze. 1982. “An Experimental Analysis of Ultimatum Bargaining.” Journal of Economic Behavior & Organization 3 (4): 367–88. https://doi.org/10.1016/0167-2681(82)90011-7.
Back to top

Reuse

Citation

BibTeX citation:
@online{heller2026,
  author = {Heller, Raban},
  title = {Fehr-Schmidt Inequality Aversion: Modelling Fairness in
    Games},
  date = {2026-05-08},
  url = {https://r-heller.github.io/equilibria/tutorials/behavioral-gt/social-preferences-fehr-schmidt/},
  langid = {en}
}
For attribution, please cite this work as:
Heller, Raban. 2026. “Fehr-Schmidt Inequality Aversion: Modelling Fairness in Games.” May 8. https://r-heller.github.io/equilibria/tutorials/behavioral-gt/social-preferences-fehr-schmidt/.