1 Introduction

1.1 Two worlds, two urns

Why “two worlds”? Because the urns metaphorically represent two dynamics of chance and growth: an ergodic world and a non‑ergodic world. In our classroom experiment you experienced this difference by repeatedly choosing between Urn A and Urn B across 20 rounds.

Economics borrowed heavily from physics. In thermodynamics, the system’s time path is often irrelevant: what matters is the equilibrium (maximum entropy) state—an ergodic world in which long‑run averages do not depend on history. By contrast, many economic processes are path‑dependent: sequences of shocks matter for individual fortunes, mobility, and inequality. Yet, traditional microeconomics often freezes time (Robinson, 1978), relying on axioms like path independence (Arrow, 1959; Plott, 1973). Our experiment makes this implicit assumption visible.

When we pretend only frequencies matter (e.g., “half good years, half bad years”), we risk missing the core insight: sequence matters for individuals. Keynes’s quip—“In the long run we are all dead”—acquires a precise meaning here: the long run may never come for a single life path.

1.1.1 What you’ll find here

This static companion re‑creates the essential logic of the interactive dashboard without sliders or Shiny. It shows: - Clear definitions of Urn A (Pólya reinforcement, non‑ergodic) and Urn B (i.i.d. draws, ergodic). - Monte Carlo simulations contrasting time averages and ensemble averages. - A simple two‑lottery exercise (C vs D) illustrating how ergodicity makes mean–variance reasoning reliable. - A mobility vignette showing how tiny initial asymmetries amplify in the non‑ergodic world (Matthew effect; Merton, 1968). - A compact view of WTP responses and reported strategies from our participants.

Where relevant, the exposition merges the wording from the original classroom materials with polished explanations from the accepted article “The ‘Two Worlds, Two Urns’ Experiment: A Teacher’s Reflection on Ergodicity and Economic Methodology.”

1.2 Reminder of the rules of the game

You repeatedly choose one ball per period from one of two urns:

1.2.1 Urn A — Non‑ergodic (Pólya reinforcement)

  • Start with 10 red and 10 black balls.
  • Payoffs per draw: red = +30K, black = −6K.
  • Reinforcement: the drawn ball is returned and two additional balls of the same colour are added.
  • Consequence: path dependence. Early luck or misfortune tilts future odds.

1.2.2 Urn B — Ergodic (i.i.d.)

  • Fixed composition: 15 yellow, 25 blue balls in every period.
  • Payoffs per draw: blue = +21K, yellow = −3K.
  • Composition never changes; draws are i.i.d. with \(p(\text{blue}) = 25/40 = 0.625\).
  • Consequence: time average = ensemble average as N (players) and T (periods) grow.

The decision problem is simple: in each of 20 rounds, pick A or B, then draw one ball and add the payoff to your cumulative “wealth.”

2 Urn B: the Ergodic World

In an ergodic process, the time average (per player) and ensemble average (per period) coincide for large samples. For Urn B: - Expected payoff per period is
\(E[$] = 0.625\cdot 21 + 0.375\cdot (-3) = 12\) (thousand). - Hence, over T periods, cumulative wealth grows roughly linearly with slope 12.

urnB_once <- function(n, y, b, y_r, b_r) {
  urn <- c(rep("Y", y), rep("B", b))
  income <- numeric(n)
  for (i in seq_len(n)) {
    draw <- sample(urn, 1)
    income[i] <- ifelse(draw == "Y", y_r, b_r)
  }
  list(income = income)
}
# Parameters (can be changed in YAML params if you re-knit)
n  <- params$N_periods
it <- params$Iter_players

y <- 15; b <- 25
y_r <- -3; b_r <- 21
mean_B <- (y/(y+b))*y_r + (b/(y+b))*b_r

# Simulate cumulative paths for a few players and show averages
cum_mat <- matrix(NA_real_, nrow = n, ncol = 20)
for (i in 1:ncol(cum_mat)) {
  sim <- urnB_once(n, y, b, y_r, b_r)$income
  cum_mat[, i] <- cumsum(sim)
}

par(mfrow = c(1,2))
matplot(cum_mat, type = "l", lwd = 1.6, xlab = "Time (t)",
        ylab = "Cumulative wealth", main = "Urn B: cumulative wealth (20 sample paths)")
abline(a = 0, b = mean_B, col = "red", lwd = 3)

# Time vs ensemble averages (should coincide in ergodic world)
# Ensemble: average across players at each t
ens_avg <- rowMeans(cum_mat)

# Time: average per player, per-period income
# Compare distribution of player means to theoretical expectation
per_player_means <- replicate(200, mean(urnB_once(n, y, b, y_r, b_r)$income))

boxplot(per_player_means, ylim = c(0,30), col = col_pal[2],
        main = "Per-player time averages of per-period income",
        ylab = "Average payoff per period")
abline(h = mean_B, col = "red", lwd = 3)

3 Urn A: the Non‑ergodic World

In Urn A, reinforcement makes history matter. Early draws alter future odds. For any given player, the time average can diverge persistently from the ensemble average.

polyaUrn_once <- function(n, bl, r, bl_r, r_r, reinforcement = 2L) {
  urn <- c(rep("R", r), rep("B", bl))
  income <- numeric(n)
  for (i in seq_len(n)) {
    draw <- sample(urn, 1)
    if (draw == "R") {
      income[i] <- r_r
      urn <- c(urn, rep("R", reinforcement))
    } else {
      income[i] <- bl_r
      urn <- c(urn, rep("B", reinforcement))
    }
  }
  list(income = income)
}
nA  <- params$N_periods_A
itA <- params$Iter_players_A

r0 <- 10; bl0 <- 10
r_r <- 30; bl_r <- -6

# Simulate many players
cum_A <- matrix(NA_real_, nrow = nA, ncol = 30)
for (i in 1:ncol(cum_A)) {
  sim <- polyaUrn_once(nA, bl0, r0, bl_r, r_r)$income
  cum_A[, i] <- cumsum(sim)
}

par(mfrow = c(1,2))
matplot(cum_A, type = "l", lwd = 1.6, xlab = "Time (t)",
        ylab = "Cumulative wealth", main = "Urn A: cumulative wealth (30 sample paths)")

# Compare time vs ensemble averages (they generally diverge in non-ergodic world)
per_player_means_A <- replicate(300, mean(polyaUrn_once(nA, bl0, r0, bl_r, r_r)$income))
boxplot(per_player_means_A, ylim = c(-10,30), col = col_pal[3],
        main = "Per-player time averages of per-period income",
        ylab = "Average payoff per period")
abline(h = (r0/(r0+bl0))*r_r + (bl0/(r0+bl0))*bl_r, col = "red", lwd = 3)

4 Consequences of Ergodicity (Lotteries C and D)

Ergodicity allows us to evaluate repeated i.i.d. lotteries with mean–variance logic: if lottery C has higher mean and lower risk than D, then C is better for everyone in the long run (given risk aversion). Below we fix parameters via params and simulate cumulative outcomes.

# Read parameters
win_C <- params$win_C; loss_C <- params$loss_C; prob_C <- params$prob_C_win
win_D <- params$win_D; loss_D <- params$loss_D; prob_D <- params$prob_D_win

# Helper to simulate an i.i.d. two-point lottery
lottery_once <- function(n, p, win, loss) {
  draws <- rbinom(n, size = 1, prob = p)
  ifelse(draws == 1, win, loss)
}

n <- 200; show_paths <- 4

# Simulate C
C_mat <- sapply(1:show_paths, function(i) cumsum(lottery_once(n, prob_C, win_C, loss_C)))
# Simulate D
D_mat <- sapply(1:show_paths, function(i) cumsum(lottery_once(n, prob_D, win_D, loss_D)))

mean_C <- prob_C*win_C + (1 - prob_C)*loss_C
mean_D <- prob_D*win_D + (1 - prob_D)*loss_D

par(mfrow = c(2,2)); par(mar = c(4,4,2,1))

matplot(C_mat, type = "l", lwd = 1.6, main = "Cumulative wealth: Lottery C",
        xlab = "Time (t)", ylab = "Wealth")
abline(a = 0, b = mean_C, col = "red", lwd = 3)

# Diagram for C
data_C <- c(0,0,0, prob_C,0,0, 1-prob_C,0,0)
M_C <- matrix(data_C, nrow = 3, byrow = TRUE)
diagram::plotmat(M_C, pos = cbind(c(0.2,0.6,0.6), c(0.5,0.85,0.25)),
                 name = c("Lottery C", paste0("Win ", win_C), paste0("Loss ", loss_C)),
                 lwd = 0.7, box.lwd = 1, cex.txt = 0.8, box.size = 0.1,
                 box.type = "circle", curve = 0, shadow.size = 0.8,
                 main = paste0("Mean = ", round(mean_C,1),
                               ", SD = ", round(sqrt(prob_C*(win_C-mean_C)^2 + (1-prob_C)*(loss_C-mean_C)^2),1)))

matplot(D_mat, type = "l", lwd = 1.6, main = "Cumulative wealth: Lottery D",
        xlab = "Time (t)", ylab = "Wealth")
abline(a = 0, b = mean_D, col = "red", lwd = 3)

# Diagram for D
data_D <- c(0,0,0, prob_D,0,0, 1-prob_D,0,0)
M_D <- matrix(data_D, nrow = 3, byrow = TRUE)
diagram::plotmat(M_D, pos = cbind(c(0.2,0.6,0.6), c(0.5,0.8,0.2)),
                 name = c("Lottery D", paste0("Win ", win_D), paste0("Loss ", loss_D)),
                 lwd = 0.7, box.lwd = 1, cex.txt = 0.8, box.size = 0.1,
                 box.type = "circle", curve = 0, shadow.size = 0.8,
                 main = paste0("Mean = ", round(mean_D,1),
                               ", SD = ", round(sqrt(prob_D*(win_D-mean_D)^2 + (1-prob_D)*(loss_D-mean_D)^2),1)))

5 Consequences of Non‑ergodicity (Mobility & Matthew Effect)

In the Pólya world, tiny initial advantages can snowball. Consider two groups:

  • Group X (rich) starts with 30 red and 10 black balls.
  • Group Y (poor) starts with 10 red and 30 black balls.

Transitions across the distribution are possible but rare. This captures the Matthew effectthe rich get richer (Merton, 1968)—and helps explain heavy‑tailed wealth distributions.

simulate_polya_paths <- function(n, r0, bl0, r_r = 30, bl_r = -6, iter = 400) {
  cum_mat <- matrix(NA_real_, nrow = n, ncol = iter)
  for (i in 1:iter) {
    sim <- polyaUrn_once(n, bl0, r0, bl_r, r_r)$income
    cum_mat[, i] <- cumsum(sim)
  }
  cum_mat
}

N1 <- params$N_periods_A
IT1 <- params$Iter_players_A

par(mfrow = c(2,2))

# Group X
cum_X <- simulate_polya_paths(N1, r0 = 30, bl0 = 10, iter = IT1)
matplot(cum_X[, 1:30], type = "l", lwd = 1.3, xlab = "Time (t)",
        ylab = "Cumulative wealth", main = "Group X: sample paths")
abline(a = 0, b = (30/40)*30 + (10/40)*(-6), col = "red", lwd = 3)

hist(cum_X[N1, ], breaks = 20, col = col_pal, main = paste("Group X wealth at T =", N1),
     xlab = "Final wealth")

# Group Y
cum_Y <- simulate_polya_paths(N1, r0 = 10, bl0 = 30, iter = IT1)
matplot(cum_Y[, 1:30], type = "l", lwd = 1.3, xlab = "Time (t)",
        ylab = "Cumulative wealth", main = "Group Y: sample paths")
abline(a = 0, b = (10/40)*30 + (30/40)*(-6), col = "red", lwd = 3)

hist(cum_Y[N1, ], breaks = 20, col = col_pal, main = paste("Group Y wealth at T =", N1),
     xlab = "Final wealth")

6 Valuation (WTP)

Participants reported maximum ticket prices (WTP) to play A, B, or to keep the option A/B for 20 periods. Below we summarise the distribution and highlight one selected participant.

# Load data (expects CSVs in the working directory)
pool_1_all   <- readr::read_delim("results-treatment-1.csv", ";", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
pool_1 <- data.frame(pool_1_all[, c("Id","nickname", "mind", "statistics", "luck", "risk_att", "gender", "cost_A", "cost_B" ,"cost_A_B" , "czas")])
sesion_1_all  <- readr::read_delim("results-treatment-2.csv", ";", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
sesion_2_all  <- readr::read_delim("results-treatment-3.csv", ";", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
sesion_3_all  <- readr::read_delim("results-treatment-4.csv", ";", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
sesion_4_all  <- readr::read_delim("results-treatment-5.csv", ";", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
pool_2_all    <- readr::read_delim("results-treatment-6.csv", ";", escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
pool_2 <- data.frame(pool_2_all[, c("Id","h1", "h2", "h3", "risk_p", "cost_A_a", "cost_B_a" ,"cost_A_B_a")])

common_Id_sesion <-  Reduce(intersect, list(sesion_1_all$Id, sesion_2_all$Id, sesion_3_all$Id, sesion_4_all$Id))
common_Id_pool <- intersect(pool_1$Id, pool_2$Id)
common_Id_pool_session <- intersect(common_Id_sesion, common_Id_pool)

pool_1        <- pool_1[pool_1$Id %in% common_Id_pool_session, ]
sesion_1_all  <- sesion_1_all[sesion_1_all$Id %in% common_Id_pool_session, ]
sesion_2_all  <- sesion_2_all[sesion_2_all$Id %in% common_Id_pool_session, ]
sesion_3_all  <- sesion_3_all[sesion_3_all$Id %in% common_Id_pool_session, ]
sesion_4_all  <- sesion_4_all[sesion_4_all$Id %in% common_Id_pool_session, ]
pool_2        <- pool_2[pool_2$Id %in% common_Id_pool_session, ]

pool_1_2 <- merge(pool_1, pool_2, by = "Id", all = TRUE)
nickname <- params$nickname_to_highlight
if (is.null(nickname) || identical(nickname, "") || !nickname %in% pool_1_2$nickname) {
  nickname <- pool_1_2$nickname[1]
}

par(mfrow = c(3,3))

boxplot(pool_1_2$cost_A, ylim = c(0,300), main = "WTP / max cost of A", ylab = "$", col = col_pal[1])
abline(h = pool_1_2$cost_A[pool_1_2$nickname == nickname], col = "red")

boxplot(pool_1_2$cost_B, ylim = c(0,300), main = "WTP / max cost of B", ylab = "$", col = col_pal[2])
abline(h = pool_1_2$cost_B[pool_1_2$nickname == nickname], col = "red")

boxplot(pool_1_2$cost_A_B, ylim = c(0,300), main = "WTP / max cost of A or B", ylab = "$", col = col_pal[3])
abline(h = pool_1_2$cost_A_B[pool_1_2$nickname == nickname], col = "red")

boxplot(pool_1_2$cost_A_a, ylim = c(0,300), main = "WTP of A (after)", ylab = "$", col = col_pal[1])
abline(h = pool_1_2$cost_A_a[pool_1_2$nickname == nickname], col = "red")

boxplot(pool_1_2$cost_B_a, ylim = c(0,300), main = "WTP of B (after)", ylab = "$", col = col_pal[2])
abline(h = pool_1_2$cost_B_a[pool_1_2$nickname == nickname], col = "red")

boxplot(pool_1_2$cost_A_B_a, ylim = c(0,300), main = "WTP of A or B (after)", ylab = "$", col = col_pal[3])
abline(h = pool_1_2$cost_A_B_a[pool_1_2$nickname == nickname], col = "red")

boxplot(pool_1_2$cost_A_a - pool_1_2$cost_A, ylim = c(-100,300), main = "ΔWTP A (after − before)", ylab = "$", col = col_pal[1])
abline(h = with(pool_1_2[pool_1_2$nickname == nickname, ], cost_A_a - cost_A), col = "red")

boxplot(pool_1_2$cost_B_a - pool_1_2$cost_B, ylim = c(-100,300), main = "ΔWTP B (after − before)", ylab = "$", col = col_pal[2])
abline(h = with(pool_1_2[pool_1_2$nickname == nickname, ], cost_B_a - cost_B), col = "red")

boxplot(pool_1_2$cost_A_B_a - pool_1_2$cost_A_B, ylim = c(-100,300), main = "ΔWTP A/B (after − before)", ylab = "$", col = col_pal[3])
abline(h = with(pool_1_2[pool_1_2$nickname == nickname, ], cost_A_B_a - cost_A_B), col = "red")

7 Game Dynamics (What Participants Did)

In four sessions (each with 20 rounds), participants could adopt and revise strategies. Below we show changes between A and B over time (Session 1 shown; code for other sessions is analogous).

s1 <- sesion_1_all
s1$ChoiceNumeric <- ifelse(s1$choice == "A", 1, 0)
s1 <- s1[order(s1$Name, s1$PeriodNo), ]
s1$Change <- c(NA, diff(s1$ChoiceNumeric))
s1$Change[!duplicated(s1$Name)] <- NA

changes <- aggregate(Change ~ PeriodNo, s1, function(x) c(A_to_B = sum(x == -1, na.rm = TRUE),
                                                          B_to_A = sum(x == 1,  na.rm = TRUE)))
cd <- data.frame(Period = changes$PeriodNo,
                 A_to_B = changes$Change[, "A_to_B"],
                 B_to_A = changes$Change[, "B_to_A"])

plot(cd$Period, cd$A_to_B, type = "l", col = "red4", lwd = 2,
     xlab = "Period", ylab = "Number of switches", main = "Session 1: switches between A and B",
     ylim = c(0, max(cd$A_to_B, cd$B_to_A, na.rm = TRUE)))
lines(cd$Period, cd$B_to_A, col = "darkgreen", lwd = 2)
legend("topright", legend = c("A → B", "B → A"), col = c("red4", "darkgreen"), lwd = 2, bty = "n")
grid(col = "grey80", lty = "dotted")

8 Strategy Narratives

Participants also described their strategies in free text. Below we list unique entries and a word cloud of common terms.

unique_strategies <- unique(na.omit(pool_1_2$h3))
gt::gt(data.frame(Strategy = unique_strategies)) |>
  gt::tab_header(title = "Unique Strategies", subtitle = "Participants’ self‑reports")
Unique Strategies
Participants’ self‑reports
Strategy
My strategy focused on calculating the expected value for each urn based on the given probabilities and outcomes. I chose Urn B for its higher expected value and stability, but I also considered switching to Urn A when the potential for compounding rewards outweighed the risks.
careful analysis
The dynamic switching strategy
when the chances are equal in a, I invest a, otherwise, invest b
I started from pulling balls from urn A, if I had a chance of getting red higher than 1/2 I kept ulling from urn A. IF my chances of getting red dropped below 1/2 I started pulling balls from urn B
I started by using Urn A to try to win big early on, especially when I was ahead. Once I hit a few losses, I switched to Urn B for more stable outcomes. I adjusted my strategy based on previous draws, trying to balance between risk and reward.
if the urn A was returning red balls, I wanted to continue choosing A. But after few -6k, I was switching to urn B in order to not loose too much money
unfortunately I participate in Experimental economy class, so we talked already about this problem, thats why i chose B the whole time, as I tried A statedy already and knew there was no good solution there
Every round i tried A only, B only or combined in 2 different ways
First i was playing it safe, but then i was risking
if i get 2 loses on urn A , I play urn B because I will cut my loses by 50% even if I lose with B its not gonna be that sensible.
At first I tried only B, then only A. A resulted in loss, but on second try it resulted in very high prize. The last try was based on assumption that i would try to start with A till I have more winning balls than losing, and then switch to B
Expected value with given probabilities and higher risk, higher income
Picking turn B is almost too good. It is just way better option and it grants profit. I was choosing B everytime and every round I made 200k profit
1stly I wanted to earn sth in the B to have mney to risk in A, I stopped A every time when there was 4 black balls more than red ones. next times I started sometines from A too but still stopped when number of black balls was bigger by 4
1. strategy was to only draw from urn A, 2. strategy was to only draw from urn B, 3. strategy was to switch urns every time I lost money, 4. strategy was to start with A and switch to B after 2 losses one after another.
If in the first 5 rounds you get more times +30 then -6 then go with urn A, otherwise change to B
The urn A had 12 balls that was going to give 30k so it's safer as the deduction was about 1/5 6k
I first used Urn A to take advantage of its compounding power, then Urn B to stabilize results in subsequent rounds or when Urn A's risk got too high.
I had different strategies, three of them were to minimize the risk and the other was full of risk but also maximized the profit
At the beginning of the game I wanted to take a couple balls from the red urn because at the beginning the probability of getting the profit was 50%. If after 3 or 4 turnes the probability turned in favour ( for example 57/60 %) I will continue to draw the balls from this urn until the probability drops below 50. As soon as the probability of drawing the winning ball from this urn was more than two draws below 50% I abondon this urn completely and only choose balls from the other urn
Started from startegy B which had bigger probability that I will earn some money. Then I switched to option A and if I lost money on option three times in a row I would have switched back to option B.
i try to choose the least risky option
I focused on probability, adjusting my strategy to balance risk and reward.
Expected Value Maximization Strategy
I draw from the urn A as long as I believed the odds were in my favor - if there was 4 more black (bad balls) in the urn A then red ones, I would go and play urn B until the end
If in urn A I got the red one (+30K) then I would continue otherwise I would switch to urn B. I tried only urn A and I got only 60K and when I played both I got a lot more making me realise that urn A is a lot riskier.
First try to get some red balls, which can get more chances for 30K, but sometimes after that take 2nd urn
Urn B is lower risk, so I began the game by choosing Urn B. After three rounds and earning 21K, I switched to Urn A and continued to choose it until I experienced a loss. Then I returned to Urn B and repeated the same strategy.
In my case, I discovered that going for only one strategy for each period is more beneficial than switching strategies at each period
I tend to choose Urn B since it gives the lower risk
Urn A is actually more risky. Since two same balls will be added after drawn, if black balls are more than red balls, it means that the chances of drawing red balls decrease. Urn B is more stable when earning income.
started with A, if I recieved more money at the beginning then I kept playing A. Otherwise change the pot
I was choosing urn A for most of the times. I had possibility of doubling red balls everytime the result was red, which means the probability for red ball was increasing. Only during last round, when I had few black balls in a row, I switched to urn B
I tried to get the highest possible gain statistically and probabilistically. I used my intuition without any scientific basis.
Maximize the income
If I earn income from A, I will continue to choose A the second time, because the probability of earning income has increased. If I lose income from A, I will turn to B first, because the risk of B is relatively smaller.
I started with Urn A and if I was earing money, I continued picking A. If I was loosing money in A, that ment that the probability of loosing was inceasing, so I moved to und B and chose it consistently until the end.
I started from drawing one ball from urn A. If in 1. rund I drew red ball and I earned 30K, then in next rund I also drew a ball from urn A, as long as number of red balls in urn one was bigger than number of black balls. If number of balck balls was bigger then red balls in urn A, I switched to urn B to minimize the risk
try to go maximum in the game
I tried to maximize income by minimizing risk
Maximizing income
Intuition and guess
Choose B for the first 18 times because the chance of profit is greater. Choose A for the last two times depending on luck. If you make a profit the 19th time, choose B for the last time. If you lose money the 19th time, continue to choose A for the last time.
I started with urn A and whenever I had a loss I switched to the second urn
I prefered urn B, as the risk was smaller, but sometimes opted form urn A if I had enough money to risk it
h3_responses <- na.omit(pool_1_2$h3)
corpus <- tm::Corpus(tm::VectorSource(h3_responses))
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, removeWords, stopwords("en"))
tdm <- tm::TermDocumentMatrix(corpus)
word_freq <- sort(rowSums(as.matrix(tdm)), decreasing = TRUE)
word_freq_df <- data.frame(word = names(word_freq), freq = word_freq)

wordcloud::wordcloud(words = word_freq_df$word, freq = word_freq_df$freq,
                     min.freq = 2, colors = RColorBrewer::brewer.pal(8, "Dark2"))

9 Perceptions of Risk and Goals

Participants indicated (i) which urn they perceived as riskier, (ii) their approach to strategy, and (iii) their goal.

par(mfrow = c(2,2)); par(mar = c(6,4,3,1))

# Risk perception
barplot(table(pool_1_2$risk_p), main = "Risk perception: which urn is riskier?",
        xlab = "Urn", ylab = "Count", col = col_pal, las = 2)

# Strategy approach
barplot(table(pool_1_2$h1), main = "Approach to strategy development",
        xlab = "Type", ylab = "Count", col = col_pal, las = 2)

# Goal
barplot(table(pool_1_2$h2), main = "Goal in the game",
        xlab = "Goal", ylab = "Count", col = col_pal)

# Cross‑tab: risk perception vs strategy approach
risk_h1 <- table(pool_1_2$risk_p, pool_1_2$h1)
plot(risk_h1, main = "Risk perception vs strategy approach",
     xlab = "Strategy type", ylab = "Count", col = col_pal, beside = TRUE, las = 2)
grid(col = "grey80", lty = "dotted")

10 References (selective)

  • Arrow, K. J. (1959). Rational choice functions and orderings. Economica, 26(102), 121–127.
  • Merton, R. K. (1968). The Matthew effect in science. Science, 159(3810), 56–63.
  • Plott, C. R. (1973). Path independence, rationality, and social choice. Econometrica, 41(6), 1075–1091.
  • Robinson, J. (1978). Contributions to modern economics. Academic Press.

Further discussion and full methodological details appear in the accepted article: “The ‘Two Worlds, Two Urns’ Experiment: A Teacher’s Reflection on Ergodicity and Economic Methodology.”