library(tidyverse)library(here)library(gt)library(knitr)# Use longtable in LaTeX output so gt tables remain renderable inside callouts.gt <-function(data, ...) { gt::gt(data = data, ...) |>tab_options(latex.use_longtable = knitr::is_latex_output())}
Load Data
Code
# Normalization constant: maximum WTP in the populationr_max <-15# Load final dataset (all 133 participants)# Fall back to CSV if the RDS cannot be deserialized.data_rds_path <-here("04_Data", "02_Processed", "all_apps_wide_final.rds")data_csv_path <-here("04_Data", "02_Processed", "all_apps_wide_final.csv")df <-tryCatch(readRDS(data_rds_path),error =function(e) readr::read_csv(data_csv_path, show_col_types =FALSE))N <-nrow(df)
Der Datensatz enthält 133 Teilnehmer.
Notation und Modellrahmen
Normierung auf den [0, 1]-Raum (Wagner & Akbari, 2023)
Alle Berechnungen folgen der Konvention von Wagner & Akbari (2023) und CKZ: die Domäne von \(r\) und \(c\) ist \([0, 1]\) (ohne Beschränkung der Allgemeinheit).
\(r_{max} = 1\) entspricht dem maximalen Konsumnutzen in der Population (hier: 15 Euro im Experiment)
Die Tabelle dient als Roadmap für die fünf Modellschritte. Sie zeigt, welche Bausteine von Schritt zu Schritt konstant bleiben und welche systematisch verallgemeinert werden.
Baustein
Symbol
Schritt 1
Schritt 2
Schritt 3
Schritt 4
Schritt 5
Generosität
\(\lambda\)
\(\bar{\lambda}\) (skalar)
\(\bar{\lambda}\) (skalar)
\(\lambda_i\) (individuell)
\(\lambda_i\)
\(\lambda_i\)
Inequity Aversion
\(\gamma\)
\(\bar{\gamma}_{\leq 1}\) (skalar)
\(\bar{\gamma}_{\leq 1}\) (skalar)
\(\bar{\gamma}_{\leq 1}\) (skalar)
\(\gamma_i\) (individuell)
\(\gamma_i\)
WTP-Verteilung
\(\phi(r)\)
Unif.
Unif., Beta, Trap.
Unif., Beta, Trap.
Unif., Beta, Trap.
Emp.
Kosten
\(c\)
\(c_i\) (individuell)
\(c_i\)
\(c_i\)
\(c_i\)
\(c_i\)
Nutzenfunktion
linear
linear
linear
nichtlinear (\(\sigma > 1\))
NL + Random Utility
Spezialfall \(\lambda_i = \bar{\lambda}\): Schritt 3 reduziert sich in der Generositätsdimension exakt auf die Formeln der Schritte 1 und 2.
Spezialfall \(\gamma_i = \bar{\gamma}_{\leq 1}\): Der Freeloader-Term bleibt identisch zu den früheren Schritten. In Schritt 4 wird der gemeinsame \(\bar{\gamma}\) nur durch individuelle \(\gamma_i\) ersetzt, ohne die grundlegende Formelstruktur zu ändern.
Schritt 0: Standardisierung
Code
df <- df |>mutate(# --- Standardized variables (all in [0,1]) ---r_i = willingness_to_pay / r_max, # consumption utilityc_i = production_costs / r_max, # seller's costsp_i = pay_what_you_want / r_max, # PWYW price (NA for non-buyers)# --- Individual fair price (Eq. 2a) ---# p_f = lambda * r + (1 - lambda) * c for r > c# p_f = c for r <= cp_f_i =if_else(r_i > c_i, generosity * r_i + (1- generosity) * c_i, c_i),# --- Buyer / Freeloader indicators ---buyer =!is.na(pay_what_you_want),freeloader = buyer & pay_what_you_want ==0 )
# --- Key model parameters (observed) ---omega_obs <-mean(df$gamma_type =="Less Fair-Minded (γ ≤ 1)")lambda_bar <-mean(df$generosity)c_bar <-mean(df$c_i[df$buyer], na.rm =TRUE)# --- Per-customer metrics in std space (E[.] over all N) ---E_revenue <-mean(df$revenue_i)E_cost <-mean(df$cost_i)E_profit <-mean(df$profit_i)# --- Shares ---buyer_share <-mean(df$buyer)freeloader_share <-mean(df$freeloader)# --- Average price among paying buyers (excl. freeloaders) ---paying_buyers <- df |>filter(buyer &!freeloader)E_p_paying <-mean(paying_buyers$p_i)# --- Average fair price among fair payers (r > c, gamma > 1) ---fair_payers <- df |>filter(r_i > c_i, gamma_type =="More Fair-Minded (γ > 1)")E_pf_fairpayers <-mean(fair_payers$p_f_i)
Plausibilisierung: Synthetische Populationen und Eq. (9)
Bevor wir die beobachteten Basislinienwerte zeigen, prüfen wir die Profitformel Eq. (9) anhand synthetischer Populationen mit bekannten Parametern. Für jedes Szenario werden explizit Konsumenten erzeugt (WTP in Euro, Kosten in Euro), standardisiert, gemäß der Segmentregeln aus Table 1 klassifiziert, und der Profit sowohl analytisch (Eq. 9) als auch durch individuelle Summation berechnet.
Szenario A: Alle fair, maximale Generosität, keine Kosten
\(\lambda = 1, \omega = 0, c = 0\): Jeder ist fair-minded und gibt den gesamten Surplus an den Verkäufer. \(\Rightarrow\) Jeder zahlt \(p_f = r\), kein Freeloader, maximaler Profit.
Code
# Show first 10 and last 5 personsbind_rows(head(syn_A, 10), tail(syn_A, 5)) |>select(id, wtp_euro, r_i, segment, p_f_i, p_i, profit_i) |>gt() |>fmt_number(columns =c(wtp_euro, r_i, p_f_i, p_i, profit_i), decimals =3) |>sub_missing(missing_text ="—") |>tab_header(title ="Szenario A: Auszug (erste 10 + letzte 5)")
1 Alle [0, 1]-Werte durch Division durch r_max = 15 €. Erwartungswerte als Durchschnitt über alle N = 133 Teilnehmer.
2 E[p] basiert auf n = 98 Käufern mit p > 0.
3 E[p_f] basiert auf n = 92 Fair Payern (r > c, γ > 1).
Interpretation
Basislinie: Diese Tabelle zeigt die beobachteten Kennzahlen im normalisierten [0, 1]-Raum. Der maximale Profit pro Kunde wäre \(r - c\); für \(r = 1, c = 0\) also \(= 1\).
Die nachfolgenden Schritte berechnen Modellvorhersagen aus Eq. (8)/(9) unter verschiedenen Annahmen und vergleichen sie mit dem beobachteten \(\hat{\pi}_{PAYW}\) = 0.0292 aus dieser Tabelle.
Eq. (9*) — Verallgemeinerung auf heterogene \(c_i\)
Im Experiment variiert \(c_i\) pro Teilnehmer. Eq. (9) nimmt ein einheitliches \(c\) an — wir können die Formel aber pro Person mit individuellem \(c_i\) anwenden und über \(N\) mitteln. \(\bar{\lambda}\) bleibt dabei für alle gleich.
Revenue pro Person \(i\) — nur Fair Payer (\(\gamma > 1\), \(r > c_i\)) tragen bei, Freeloaders zahlen 0:
Eq. (9*) ist die Verallgemeinerung von Eq. (9) auf heterogene \(c_i\). Bei einheitlichem \(c\) reduziert sie sich exakt auf Eq. (9).
Der Unterschied zwischen beiden zeigt den Jensen-Effekt (s.u.): Da \((1-c)^2\)konvex in \(c\) ist, gilt \(E[(1-c_i)^2] \geq (1-E[c_i])^2\). Eq. (9) mit \(\bar{c}\) unterschätzt also den Fair-Payer-Beitrag gegenüber der korrekten Berechnung mit individuellen \(c_i\).
Jensen-Ungleichung und Aggregationsfehler
Die Jensen-Ungleichung (Jensen, 1906) besagt: Für eine konvexe Funktion \(f\) und eine Zufallsvariable \(X\) gilt \(E[f(X)] \geq f(E[X])\).
In unserem Fall ist \(f(c) = (1-c)^2\) konvex \(\Rightarrow\)
Das bedeutet: Eq. (9) mit \(\bar{c}\) statt individuellen \(c_i\)unterschätzt den Fair-Payer-Revenue-Term \(\bar{\lambda}(1-\omega)(1-c)^2/2\). Konkret: Eq. (9) liefert einen niedrigeren Profit als Eq. (9*) mit individuellen \(c_i\), weil \((1-\bar{c})^2 < \overline{(1-c_i)^2}\).
In der mikroökonometrischen Literatur wird dieses Problem als aggregation bias bei nichtlinearen Funktionen diskutiert. Die klassische Referenz für die Ungleichung selbst ist Jensen (1906); für den ökonometrischen Kontext heterogener Agenten vgl.:
Blundell, R. & Stoker, T. M. (2005). “Heterogeneity and Aggregation.” Journal of Economic Literature, 43(2), 347–391.
Das Modell prognostiziert einen Freeloader-Anteil von 18.8 % (beobachtet: 3.8 %). Die Überschätzung entsteht, weil im linearen Modell alle Konsumenten mit \(\gamma \leq 1\) entweder freeloaden (\(r > \bar{\gamma} c\)) oder nicht kaufen (\(r \leq \bar{\gamma} c\)) — in der Realität zahlen viele von ihnen positive Preise.
Schritt 2: Nicht-uniforme Verteilungen für \(r\)
In Schritt 1 wurde \(\phi(r) = 1\) (Gleichverteilung) angenommen. Nun lockern wir diese Annahme und passen zwei parametrische Verteilungen an:
1 Euro = std × r_max (15 €). Gesamt = Euro/Kunde × N (133).
Interpretation Schritt 2
Effekt der \(r\)-Verteilung: Beide Verteilungen passen die beobachtete Konzentration bei niedrigen \(r\)-Werten an (\(\bar{r}\) = 0.344 statt \(0.50\)).
Variante
\(\hat{\pi}\) (std)
Euro/Kunde
Uniform (Schritt 1)
0.0943
1.41
Beta
0.0483
0.72
Trapezoid (CKZ)
0.0496
0.74
Beobachtet
0.0292
0.44
Die nicht-uniformen Verteilungen reduzieren den vorhergesagten Profit erheblich, weil weniger Masse im Bereich \(r > c\) liegt → weniger profitable Fair Payer. Die verbleibende Lücke \(\Delta\pi\) kommt vom linearen Modell (Randlösungen → überhöhte \(p_f\)-Vorhersage).
Die Grundstruktur (4 Segmente, Randlösungen) bleibt identisch — nur der Integrationskern\(\phi(r)\) ändert sich.
Systematische Profit-Diskrepanz: Modell vs. Beobachtung
Der beobachtete Profit (\(\hat{\pi} \approx 0.03\)) liegt deutlich unter allen Modellvorhersagen (\(\approx 0.06\)–\(0.10\)), selbst nach Anpassung der \(r\)-Verteilung. Diese Diskrepanz hat drei mögliche Quellen:
Überschätzung des Revenue: Das lineare Modell erzwingt Randlösungen (\(p = p_f\) oder \(p = 0\)). In der Realität zahlen viele Konsumenten positive, aber unter \(p_f\) liegende Preise — das Modell kann dieses Verhalten nicht abbilden.
Unterschätzung der Kosten: Die Freeloader-Kosten hängen vom nicht beobachtbaren \(\bar{\gamma}_{\leq 1}\) ab (s. Callout oben).
Strukturelle Modellgrenzen: Die Gleichverteilung \(r \sim U[0,1]\) ist eine starke Annahme. Beta- und Trapezoid-Alternativen verbessern den Fit, schließen die Lücke aber nicht — das deutet darauf hin, dass nicht nur die Verteilung, sondern die grundlegende Modellstruktur (lineare Nutzenfunktion, vier diskrete Segmente, deterministische Preissetzung) angepasst werden müsste.
Die schrittweise Einführung von Heterogenität (\(\phi(r)\), \(\lambda_i\), \(\gamma_i\)) erlaubt es, den Beitrag jeder Annahme zur Gesamtdiskrepanz zu isolieren.
In den Schritten 1 und 2 wurde die mittlere Generosität \(\bar{\lambda}\) = 0.4545 für alle Teilnehmer verwendet. Nun verwenden wir die individuellen\(\lambda_i\) aus dem Experiment.
Warum ändern sich die Integralgrenzen nicht?
\(\lambda_i\) beeinflusst nur die Höhe des fairen Preises \(p_f = \lambda_i(r - c_i) + c_i\), nicht die Teilnahmeentscheidung. Wir zeigen das Schritt für Schritt.
Algebraische Herleitung: \(\lambda_i\) und Kaufentscheidung
Ausgangspunkt: Die Nutzenfunktion eines Fair Payers (\(\gamma_i > 1\)) nach Zahlung von \(p_f\) (Eq. A.1 mit \(p = p_f\)):
\[u_i = r - p_f \tag{A.1'}\]
Schritt 1: \(p_f\) einsetzen. Der faire Preis (Eq. 2a) lautet \(p_f = \lambda_i(r - c_i) + c_i\). Einsetzen in \(u_i\):
\[u_i = r - \bigl[\lambda_i(r - c_i) + c_i\bigr]\]
Schritt 4: Kaufbedingung. Person \(i\) kauft, wenn \(u_i \geq 0\):
\[(1 - \lambda_i)\,(r - c_i) \geq 0\]
Da \(\lambda_i \in [0, 1]\), ist \((1 - \lambda_i) \geq 0\). Es gibt zwei Fälle:
\(\lambda_i < 1\): Dann ist \((1 - \lambda_i) > 0\), und die Bedingung vereinfacht sich durch Division zu \(r \geq c_i\). Der Surplus \(u_i = (1-\lambda_i)(r-c_i) > 0\) ist strikt positiv — die Person kauft und behält Surplus.
\(\lambda_i = 1\): Dann ist \((1 - \lambda_i) = 0\), also \(u_i = 0\) für jedes\(r\). Die Person ist indifferent und kauft per Konvention (zahlt \(p_f = r\), behält 0 Surplus).
Ergebnis: In beiden Fällen kauft die Person genau dann, wenn \(r \geq c_i\). Der \(\lambda_i\)-Wert bestimmt wie viel gezahlt wird (\(p_f\)), aber nicht ob gekauft wird.
(Algebraisch mit SymPy verifiziert, s. 06_derivations.py, Step F.)
\(\Rightarrow\) Die Integralgrenzen und damit \(m_1(c_i)\), \(F(c_i)\) bleiben identisch zu den Schritten 1 und 2. Nur der Multiplikator wechselt von \(\bar{\lambda}\) zu \(\lambda_i\).
Von Eq. (8) zu individuellen \(\lambda_i\): Warum kein Doppelintegral?
In Eq. (8) im Paper ist \(\lambda\) ein skalarer Populationsparameter (gleich für alle):
Das Integral läuft nur über \(r\) (die WTP-Verteilung). \(\lambda\) ist eine Konstante und steht vor dem Integral. Wenn wir \(\lambda\) durch individuelle \(\lambda_i\) ersetzen, scheint man ein zweites Integral über die Verteilung von \(\lambda\) zu benötigen. Das ist nicht nötig, und zwar aus zwei Gründen:
Detailliert: Warum kein Integral über \(\lambda\)?
Theoretisch: Wären \(r\) und \(\lambda\) beide Zufallsvariablen mit gemeinsamer Dichte \(f(r, \lambda)\), dann wäre das allgemeine Profitintegral:
Das ist exakt Eq. (8) mit \(\bar{\lambda}\) — kein zusätzliches Integral nötig. Dies ist die implizite Annahme in den Schritten 1 und 2.
Fall 2: \(\lambda\) und \(r\) korreliert. Dann wäre \(E[\lambda\,|\,r]\) eine Funktion von \(r\) und müsste im Integral stehen. Das Kovarianz-Ergebnis am Ende dieses Abschnitts zeigt, dass tatsächlich eine positive Korrelation existiert.
Empirisch (unser Ansatz): Wir beobachten für jede Person \(i\) das Tripel \((\lambda_i, c_i, r_i)\) direkt. Deshalb brauchen wir gar kein Integral über \(\lambda\) — wir summieren einfach über die \(N\) beobachteten Individuen:
Für jede Person \(i\) ist \(\lambda_i\) ein bekannter Skalar — er wird einfach als Multiplikator vor \(h_\phi(c_i)\) eingesetzt. Das verbleibende Integral steckt in \(h_\phi(c_i) = \int_{c_i}^1 (r - c_i)\,\phi(r)\,dr\) und läuft über \(r\) (die WTP-Verteilung) — genau wie in Eq. (8).
Zusammenfassung: Der Übergang von \(\lambda\) (skalar) zu \(\lambda_i\) (individuell):
Eq. (8): \(\lambda\) skalar
Schritt 3: \(\lambda_i\) individuell
Integral über \(r\)
\(\int_c^1 \lambda(r-c)\phi(r)\,dr\)
\(\int_{c_i}^1 \lambda_i(r-c_i)\phi(r)\,dr\)
\(\lambda\) im Integral?
Nein, Konstante vor \(\int\)
Nein, \(\lambda_i\) fest pro Person → vor \(\int\)
Integralgrenzen
\([c, 1]\)
\([c_i, 1]\) — unabhängig von \(\lambda_i\)
Aggregation
Einmal integrieren
Pro Person integrieren, dann mitteln
Modellbeschränkung: \(\lambda\) beeinflusst nur die intensive margin
Im linearen Modell (Eq. A.1) ist \(\lambda\) für die extensive margin (Kaufentscheidung) irrelevant — es beeinflusst nur die intensive margin (wie viel bezahlt wird). Dies ist eine direkte Konsequenz zweier Modellannahmen:
Linearität der Nutzenfunktion in \(p\): Die Nutzenfunktion Eq. (A.1) ist linear in \(p\). Das erzwingt Randlösungen (\(p = p_f\) oder \(p = 0\)). In einem realistischeren konkaven Modell würden innere Lösungen existieren, und \(\lambda\) könnte die Teilnahmeentscheidung beeinflussen (weil der Nutzen aus dem Kauf dann auch von der Höhe des fairen Preises abhängt).
Keine outside option / Opportunitätskosten: Das Modell nimmt an, dass Konsumenten mit positivem Surplus (\(r > c\)) immer kaufen. In der Realität existieren Schwellwerte, Transaktionskosten und psychologische Kosten des Freeriding — all das könnte \(\lambda\) kaufrelevant machen.
Implikation für die Profitabilität: Obwohl \(\lambda\) die Kaufentscheidung nicht beeinflusst, ist es für den Revenue-Term zentral — es steuert direkt den Preis \(p_f = \lambda(r - c) + c\) und damit den Ertrag pro Fair Payer.
Allgemeines Profitmodell — Eq. (\(\Pi\))
Wir definieren zwei Bausteine, die nur von \(c_i\) und \(\phi(r)\) abhängen — unabhängig von \(\lambda\) und \(\gamma\):
Erwartung: Da \(\bar{\lambda} = \overline{\lambda_i}\) (per Definition identisch), könnte man erwarten, dass die Spalten \(\bar{\lambda}\) und \(\lambda_i\)gleiche Werte liefern. Das ist aber nur dann der Fall, wenn \(\lambda_i\) und \(h_\phi(c_i)\) unabhängig sind. Denn:
Die Verwendung individueller \(\lambda_i\) statt \(\bar{\lambda}\) ändert die Modellvorhersage nur geringfügig. Der Unterschied entsteht ausschließlich durch die Kovarianz \(\text{Cov}(\lambda_i, h_\phi(c_i))\), die in unserem Datensatz klein ist. Die Kostenzeile bleibt exakt identisch, da \(\lambda\) im Kostenterm nicht vorkommt.
Fall 2: Korrelierte Generosität — \(E[\lambda|r] = a + br\)
In den bisherigen Modellen wurde \(\lambda\) entweder als Konstante (\(\bar{\lambda}\), Schritte 1–2) oder als individuelle Beobachtung (\(\lambda_i\), Schritt 3) behandelt.
Dazwischen liegt ein parametrischer Ansatz (Fall 2 aus der Diskussion oben): Wir modellieren die Abhängigkeit der Generosität von der Zahlungsbereitschaft als \(E[\lambda|r] = a + br\) und setzen diese Funktion in das Profitintegral ein. Falls \(b \neq 0\), kann \(\lambda\) im Unterschied zu Schritten 1–2 nicht mehr vor das Integral gezogen werden.
Warum ist das wichtig? Falls Generosität und WTP systematisch zusammenhängen (z.B. „wohlhabendere Konsumenten sind generöser”), ändert sich die Gewichtung innerhalb des Integrals: Hochbewertende Konsumenten mit \(r\) nahe 1 tragen dann nicht nur hohen Surplus bei, sondern multiplizieren diesen auch mit höherer Generosität.
Modellwahl: Wir verwenden eine lineare bedingte Erwartung \(E[\lambda|r] = a + br\) (OLS-Fit). Das ist die einfachste parametrische Spezifikation, die den First-Order-Zusammenhang erfasst. Alternativen (Beta-Regression, da \(\lambda \in [0,1]\); nichtlineare Modelle) wären bei stärkerer Korrelation sinnvoll, sind hier aber durch die geringe Effektstärke nicht gerechtfertigt.
Modellfit
Code
# --- OLS: E[λ|r] = a + b·r ---fit_lam_r <-lm(generosity ~ r_i, data = df)a_lr <-coef(fit_lam_r)[["(Intercept)"]]b_lr <-coef(fit_lam_r)[["r_i"]]r2_lr <-summary(fit_lam_r)$r.squaredp_lr <-summary(fit_lam_r)$coefficients[2, 4]ggplot(df, aes(x = r_i, y = generosity)) +geom_point(alpha =0.4, size =2) +geom_smooth(method ="lm", se =TRUE, color ="#E41A1C", linewidth =1) +geom_hline(yintercept = lambda_bar, linetype ="dashed", color ="#377EB8", linewidth =0.8) +annotate("text", x =0.95, y = lambda_bar +0.04, label =expression(bar(lambda)), color ="#377EB8", hjust =1, size =4) +labs(x =expression(r[i] ~"(std WTP)"), y =expression(lambda[i] ~"(Generosität)"),subtitle =bquote(hat(lambda)(r) == .(round(a_lr, 3)) + .(round(b_lr, 3)) %.% r ~~~ R^2== .(round(r2_lr, 3)) ~~~italic(p) == .(round(p_lr, 3)))) +theme_minimal(base_size =13)
Befund: Die Steigung \(b\) ist nicht signifikant und nahe null. Generosität und WTP sind in unserem Datensatz praktisch unkorreliert: \(\text{Cor}(\lambda_i, r_i)\) = -0.078. \(E[\lambda|r] \approx \bar{\lambda}\) — die bedingte Erwartung ist im Wesentlichen flach.
Algebraische Herleitung: Profitformel mit \(E[\lambda|r] = a + br\) und \(\phi(r) = 1\)
Ausgangspunkt: Der Surplus-Term im Profitintegral (für eine Person mit Kosten \(c_i\)):
Interpretation des \(b\)-Terms: Bei \(b > 0\) wäre \(b(2+c_i)/3 > 0\): Hochbewertende Konsumenten tragen überproportional bei, weil hohe Generosität und hoher Surplus sich gegenseitig verstärken. Bei \(b \approx 0\) reduziert sich Eq. (9**) auf Eq. (9*) mit \(a \approx \bar{\lambda}\).
Berechnung: Alle drei \(\phi(r)\)-Verteilungen
Für Uniform \(\phi(r) = 1\) verwenden wir die geschlossene Form Eq. (\(\star\)). Für Beta und Trapezoid nutzen wir numerische Integration von \(\int_{c_i}^1 (a + br)(r - c_i)\,\phi(r)\,dr\).
Ergebnis: Die Spalte \(E[\lambda|r]\) ist nahezu identisch mit der \(\bar{\lambda}\)-Spalte. Das ist konsistent mit dem OLS-Befund (\(b \approx 0\), \(R^2 \approx 0\)): Generosität und WTP sind in unserem Datensatz praktisch unkorreliert, daher liefert die parametrische Modellierung \(E[\lambda|r] = a + br\) fast exakt dasselbe Ergebnis wie \(\bar{\lambda}\).
Warum gibt es dann überhaupt einen Unterschied zwischen \(\bar{\lambda}\) und \(\lambda_i\)?
Das ist der zentrale Punkt: Der Unterschied in der \(\lambda_i\)-Spalte kommt nicht aus der Korrelation \(\lambda \leftrightarrow r\) (die ist ≈ 0), sondern aus der Kreuz-Personen-Kovarianz\(\text{Cov}(\lambda_i, h_\phi(c_i))\) bei der Aggregation über \(N\) Teilnehmer. Weil \(h_\phi(c_i)\) eine fallende Funktion von \(c_i\) ist, bedeutet \(\text{Cov}(\lambda_i, h_\phi(c_i)) > 0\): Personen mit höherer Generosität haben tendenziell niedrigere Kosten (→ höheren Surplus).
Fall 2 modelliert die Intra-Integral-Korrelation (\(\lambda\) vs. \(r\) innerhalb der WTP-Verteilung). Die \(\lambda_i\)-Spalte hingegen erfasst die Querschnitts-Korrelation (\(\lambda\) vs. \(c\) zwischen Personen). In unserem Datensatz ist Letztere schwach, aber vorhanden — Erstere ist praktisch null.
Interpretation Schritt 3
Warum gibt es überhaupt einen Unterschied? Der Mittelwert \(\bar{\lambda}\) ist per Definition gleich dem empirischen Mittel \(\overline{\lambda_i}\) = 0.4545. Bei unabhängigen Variablen wäre \(\overline{\lambda_i \cdot h_\phi(c_i)} = \bar{\lambda} \cdot \overline{h_\phi(c_i)}\) und die Spalten wären identisch. Die Differenz \(\Delta\) in der Tabelle unten misst exakt die Kovarianz \(\text{Cov}(\lambda_i, h_\phi(c_i))\), multipliziert mit \((1-\omega)\):
\(\text{Cov}(\lambda_i, h_\phi(c_i)) > 0\) bei allen drei Verteilungen: Teilnehmer mit höherer Generosität haben tendenziell niedrigere Kosten (→ höheres \(h_\phi\)). Dies treibt den Revenue-Term nach oben.
Vorsicht: Dies ist ein empirisches Ergebnis dieses Datensatzes, kein theoretisches. Es sollte geprüft werden, ob die positive Korrelation ein Artefakt des Experimentdesigns ist (z.B. ob \(c_i\) und \(\lambda_i\) durch die Kostenstruktur der Szenarien systematisch korreliert werden) oder ob sie eine genuine Eigenschaft der Population widerspiegelt.
Der Freeloader-Term\(\overline{c_i \bar{F}_\phi(\gamma_i c_i)}\) hängt nicht von \(\lambda\) ab und bleibt identisch (Kosten-Crosscheck bestätigt: \(E[\text{Cost}]_{\lambda_i} = E[\text{Cost}]_{\bar{\lambda}}\)).
\(\Rightarrow\) Die positive Kovarianz ist ein empirisches Merkmal dieses Datensatzes, kein Modellfehler. Eine mögliche Quelle der Diskrepanz bleibt die lineare Modellstruktur (Randlösungen), nicht die Parameterheterogenität.
Vorausschau Schritt 4: Die gleiche Eq. (\(\Pi\)) bleibt gültig — nur \(\bar{\gamma}_{\leq 1}\) wird durch individuelle \(\gamma_i\) ersetzt, was den Freeloader-Term \(\overline{c_i \bar{F}_\phi(\gamma_i c_i)}\) verändert.
Schritt 4: Nichtlineare Inequity Aversion
Motivation
Die Schritte 1–3 verwenden die lineare Nutzenfunktion Eq. (A.1). Ihre zentrale Schwäche: Sie erzwingt Randlösungen (\(p = p_f\) oder \(p = 0\)). In den Daten zahlen viele Konsumenten aber positive, unter \(p_f\) liegende Preise — Verhalten, das mit dem linearen Modell nicht darstellbar ist.
Eine mögliche Quelle der Profitüberschätzung in Schritten 1–3 ist deshalb nicht die \(r\)-Verteilung oder die \(\lambda\)-Heterogenität, sondern die funktionale Form der Fairnesskosten. Schritt 4 ersetzt den linearen Term durch einen konvexen Fairnesskostenterm, der innere Lösungen ermöglicht.
Beobachtetes Zahlungsverhalten im Experiment
Zur Einordnung klassifizieren wir die beobachteten Preise relativ zum individuellen fairen Preis \(p_{f,i}\). Das lineare Modell erlaubt nur die beiden Eckfälle \(p_i = 0\) und \(p_i = p_{f,i}\). Empirisch relevant sind deshalb insbesondere Beobachtungen mit \(0 < p_i < p_{f,i}\).
Positive Zahlungen insgesamt: 98 von 133 Teilnehmern (73.7%).
Zentral für Schritt 4 sind die Fälle mit \(0 < p < p_f\): Sie sind empirisch vorhanden und widersprechen damit direkt der linearen Randlösungslogik.
Fälle mit \(p = p_f\) und \(p = 0\) sind mit dem linearen Modell vereinbar; Fälle mit \(0 < p < p_f\) erfordern dagegen eine Nutzenfunktion mit innerer Lösung.
Beobachtungen mit \(p > p_f\) werden separat ausgewiesen; sie liegen außerhalb des Basismodells und sind deshalb diagnostisch nützlich.
Wie stark weichen diese Zahlungen von \(p_f\) ab?
Für die beiden diagnostisch relevanten Gruppen (\(0 < p < p_f\) und \(p > p_f\)) betrachten wir die Abweichung in Euro:
Zusätzlich prüfen wir, ob beobachtete Zahlungen häufig genau auf einem vollen Eurobetrag liegen und ob sie dem nächstliegenden vollen Euro zu \(p_f\) entsprechen.
Code
df_payment_deviation <- df_payment_pattern |>filter(buyer, p_i > tol_price, payment_pattern %in%c("0 < p < p_f", "p > p_f")) |>mutate(group =factor(payment_pattern, levels =c("0 < p < p_f", "p > p_f")),p_euro = p_i * r_max,pf_euro = p_f_i * r_max,deviation_euro = p_euro - pf_euro,abs_deviation_euro =abs(deviation_euro),nearest_pf_euro =round(pf_euro),paid_integer =abs(p_euro -round(p_euro)) <= tol_price,rounding_pattern =case_when(abs(p_euro - nearest_pf_euro) <= tol_price ~"genau nächster voller Euro zu p_f", paid_integer ~"anderer voller Euro",TRUE~"kein voller Euro" ) )payment_deviation_summary <- df_payment_deviation |>group_by(group) |>summarise(n =n(),`M Abweichung (€)`=mean(deviation_euro),`Mdn Abweichung (€)`=median(deviation_euro),`M |Abweichung| (€)`=mean(abs_deviation_euro),`Mdn |Abweichung| (€)`=median(abs_deviation_euro),`Anteil voller Euro`=mean(paid_integer),`Anteil nächster Euro zu p_f`=mean(rounding_pattern =="genau nächster voller Euro zu p_f") ) |>ungroup()payment_rounding_summary <- df_payment_deviation |>count(group, rounding_pattern, name ="n") |>group_by(group) |>mutate(Anteil = n /sum(n)) |>ungroup()below_pf_stats <- payment_deviation_summary |>filter(group =="0 < p < p_f")above_pf_stats <- payment_deviation_summary |>filter(group =="p > p_f")below_pf_mean_dev <- below_pf_stats[["M Abweichung (€)"]]below_pf_median_dev <- below_pf_stats[["Mdn Abweichung (€)"]]below_pf_nearest_share <- below_pf_stats[["Anteil nächster Euro zu p_f"]]above_pf_mean_dev <- above_pf_stats[["M Abweichung (€)"]]above_pf_median_dev <- above_pf_stats[["Mdn Abweichung (€)"]]above_pf_nearest_share <- above_pf_stats[["Anteil nächster Euro zu p_f"]]
Code
ggplot(df_payment_deviation, aes(x = group, y = deviation_euro, fill = group)) +geom_hline(yintercept =0, linetype ="dashed", color ="grey40") +geom_boxplot(width =0.55, alpha =0.7, outlier.shape =NA, show.legend =FALSE) +geom_jitter(width =0.12, alpha =0.55, size =2, show.legend =FALSE) +scale_fill_manual(values =c("0 < p < p_f"="#1B9E77", "p > p_f"="#E7298A")) +labs(x =NULL, y ="p - p_f (Euro)") +theme_minimal(base_size =12)
Figure 4: Abweichung vom individuellen fairen Preis in Euro
Code
ggplot(payment_rounding_summary,aes(x = group, y = Anteil, fill = rounding_pattern)) +geom_col(position ="fill", width =0.7) +geom_text(aes(label =ifelse(Anteil >=0.12, scales::percent(Anteil, accuracy =1),"")),position =position_fill(vjust =0.5), size =3.4, color ="white") +scale_y_continuous(labels = scales::label_percent(accuracy =1)) +scale_fill_manual(values =c("genau nächster voller Euro zu p_f"="#7570B3","anderer voller Euro"="#D95F02","kein voller Euro"="grey55" )) +labs(x =NULL, y ="Anteil innerhalb der Gruppe", fill =NULL) +theme_minimal(base_size =12) +theme(legend.position ="top")
Figure 5: Liegen diese Zahlungen auf vollen Eurobeträgen oder nahe am gerundeten p_f?
Table 9: Abweichungsstärke und Rundungsmuster relativ zu p_f
Gruppe
n
M Abweichung (€)
Mdn Abweichung (€)
M |Abweichung| (€)
Mdn |Abweichung| (€)
Anteil voller Euro
Anteil nächster Euro zu p_f
0 < p < p_f
53
−1.16
−0.50
1.16
0.50
66.0%
28.3%
p > p_f
37
0.55
0.35
0.55
0.35
59.5%
32.4%
Interpretation der Abweichungen
Bei \(0 < p < p_f\) beträgt die mittlere Abweichung -1.16 Euro, der Median liegt bei -0.50 Euro. Typisch ist also eher ein moderater Abschlag auf \(p_f\) als eine extreme Unterschreitung.
Bei \(p > p_f\) beträgt die mittlere Abweichung 0.55 Euro, der Median 0.35 Euro. Die Überschreitungen von \(p_f\) sind im Mittel kleiner als die Unterschreitungen darunter.
Volle Eurobeträge sind häufig, aber nicht dominant genug, um alles zu erklären: Nur 28.3% der Fälle mit \(0 < p < p_f\) und 32.4% der Fälle mit \(p > p_f\) liegen genau auf dem nächstliegenden vollen Euro zu \(p_f\).
Rundung ist also ein Teil der Erklärung, aber nicht die ganze: Ein erheblicher Anteil der Abweichungen bleibt auch jenseits einfacher Voll-Euro-Rundung bestehen.
4.1 Nichtlineare Nutzenfunktion
Wir ersetzen den linearen Fairnesskostenterm \(\gamma(p_f - p)\) durch eine Potenzfunktion\(\gamma(p_f - p)^\sigma\) mit Exponent \(\sigma > 1\):
\[\boxed{\;u = r - p - \gamma\,(p_f - p)^\sigma\;} \qquad \text{für } p \leq p_f, \quad \sigma > 1 \tag{NL}\]
Parameter
Interpretation
Bereich
\(\gamma\)
Stärke der Inequity Aversion
\(\gamma > 0\)
\(\sigma\)
Krümmung der Fairnesskosten
\(\sigma > 1\) (konvex)
\(p_f\)
Fairer Preis \(= \lambda(r - c) + c\)
wie bisher
Spezialfall \(\sigma = 1\): Das ist exakt das lineare CKZ-Modell
\[u = r - p - \gamma(p_f - p) = r - \gamma p_f + (\gamma - 1)p\]
Der Übergang von \(\sigma > 1\) zu \(\sigma = 1\) ist daher singulär und darf nicht als glatter Grenzübergang der Innenlösung interpretiert werden.
Warum Potenzfunktion?
Die Potenzform \(\gamma(p_f - p)^\sigma\) ist die einfachste konvexe Spezifikation mit zwei inhaltlich interpretierbaren Parametern. Sie erfüllt:
Konvexität (\(\sigma > 1\)): Die marginalen Fairnesskosten steigen mit der Abweichung \(p_f - p\). Kleine Abweichungen sind „günstig”, große Abweichungen sind überproportional schmerzhaft → innere Lösungen werden optimal.
Skalierungsinvarianz: Im \([0, 1]\)-Raum ist \(p_f - p \in [0, 1]\), also \((p_f - p)^\sigma \in [0, 1]\) — keine Einheitenprobleme.
Nestung:\(\sigma = 1\) liefert dasselbe lineare Modell, muss aber als separater Eckfall behandelt werden.
Sparsamkeit: Nur ein zusätzlicher Parameter gegenüber dem linearen Modell.
Alternative: Quadratische Form \(\gamma(p_f - p)^2\) (\(\sigma = 2\) fest) — wir beginnen damit als Kontrollfall und schätzen dann \(\sigma\) frei.
Domänenkonsistenz im [0, 1]-Raum
Im standardisierten Raum ist \(p_f - p \in [0, 1]\) dimensionslos, daher ist \((p_f - p)^\sigma\) ebenfalls dimensionslos. Der Parameter \(\gamma\) hat die Interpretation Nutzeneinheiten pro Einheit Fairnesskosten und ist direkt im \([0, 1]\)-Raum definiert.
Umrechnung Euro ↔︎ [0, 1]: Wird die Nutzenfunktion in Euro formuliert, muss \(\gamma\) skaliert werden: \(\gamma^{€} = \gamma^{std} / r_{max}^{\sigma - 1}\). Alle Berechnungen hier verwenden den standardisierten Raum.
4.2 Optimaler Preis — FOC und KKT
First-Order Condition: Das Optimum \(p^*\) maximiert \(u\) über \(p \in [0, p_f]\):
Der letzte Fall ist nicht das lineare Modell, sondern zeigt gerade, dass \(\sigma = 1\) separat behandelt werden muss: Im exakten linearen Fall mit \(\gamma = 1\) ist der Käufer über alle \(p \in [0,p_f]\) indifferent.
Schlüsseleigenschaft: Die Lücke \(\Delta^*\) ist konstant
Die Lücke \(\Delta^* = (\sigma\gamma)^{-1/(\sigma-1)}\) hängt nur von \(\gamma\) und \(\sigma\) ab — nicht von \(r\), \(c\) oder \(\lambda\). Das bedeutet:
Alle Konsumenten mit derselben Inequity Aversion \((\gamma, \sigma)\) zahlen denselben Betrag unter ihrem fairen Preis.
Konsumenten mit hohem \(p_f\) (hohe WTP und/oder hohe Generosität) zahlen absolut mehr, aber immer genau \(\Delta^*\) unter \(p_f\).
Konsumenten mit niedrigem \(p_f < \Delta^*\) können die Lücke nicht finanzieren und fallen auf \(p^* = 0\) zurück (Freeloading).
Höheres \(\gamma\) → kleinere Lücke → näher an \(p_f\). Höheres \(\sigma\) hat einen nicht-monotonen Effekt: Die Krümmung der Fairnesskosten macht extreme Abweichungen teurer, aber bei moderatem \(\sigma\) kann die Lücke sich erweitern.
KKT-Bedingungen: Da \(p \in [0, p_f]\), sind die KKT-Bedingungen (algebraisch mit SymPy verifiziert, s. 06_kkt_verification.py):
Daraus ergeben sich für Fall B (\(r > c\), \(p_f = \lambda r + (1-\lambda)c\)) drei Fälle:
Fall
Bedingung
Optimaler Preis
Segment
B3: Innere Lösung
\(\sigma\gamma p_f^{\sigma-1} \geq 1\)
\(p^* = p_f - \Delta^*\)
Partieller Zahler
B1: Ecklösung \(p = 0\)
\(\sigma\gamma p_f^{\sigma-1} < 1\) und \(u(0) \geq 0\)
\(p^* = 0\)
Freeloader
B1: Nicht-Kauf
\(\sigma\gamma p_f^{\sigma-1} < 1\) und \(u(0) < 0\)
—
Non-Buyer
B2: \(p = p_f\)
—
\(l_2 = -1 < 0\) → Widerspruch
—
Note
Bemerkenswert: \(p = p_f\) ist für \(\sigma > 1\)nie optimal (konsistent mit der Beobachtung, dass fast niemand genau \(p_f\) zahlt).
Für Fall A (\(r \leq c\), \(p_f = c\)) gelten analoge KKT-Bedingungen mit \(p_f = c\):
Fall
Bedingung
Optimaler Preis
Segment
A3: Innere Lösung
\(\sigma\gamma c^{\sigma-1} \geq 1\) und \(u^* > 0\)
\(p^* = c - \Delta^*\)
Neues Segment
A1: Ecklösung \(p = 0\)
\(\sigma\gamma c^{\sigma-1} < 1\) und \(u(0) \geq 0\)
\(p^* = 0\)
Freeloader
A1/A3: Nicht-Kauf
\(u^* \leq 0\)
—
Non-Buyer
Neues Segment: Käufer mit \(r \leq c\)
Im linearen Modell kaufen Konsumenten mit \(r \leq c\)nie. Im nichtlinearen Modell (\(\sigma > 1\)) kann die Innenlösung \(u^* = r - c + \Delta^* \cdot (\sigma-1)/\sigma > 0\) sein, auch wenn \(r < c\). Der “Surplus-Puffer” \(\Delta^*(\sigma-1)/\sigma = 1/(4\gamma)\) (für \(\sigma = 2\)) kompensiert den negativen Term \(r - c\).
Diese Konsumenten zahlen \(p^* = c - \Delta^*\) (einen positiven, aber kleinen Preis), was mit der empirischen Beobachtung konsistent ist, dass einige Teilnehmer niedrige positive Preise zahlen.
Für \(\sigma = 2\): Kaufbedingung \(r > c - 1/(4\gamma)\), Preis \(p^* = c - 1/(2\gamma)\).
Die Schwelle zwischen innerer Lösung und Ecklösung liegt bei \(p_f = \Delta^*\):
\[p_f = \lambda(r - c) + c = \Delta^* \quad\Rightarrow\quad r_{\text{int}} = c + \frac{\Delta^* - c}{\lambda} \tag{Schwelle}\]
Konsumenten mit \(r > r_{\text{int}}\) zahlen positiv; solche mit \(c < r \leq r_{\text{int}}\) fallen auf \(p = 0\) (potentielle Freeloaders).
(Algebraisch mit SymPy verifiziert, s. 06_derivations.py, Steps G.1–G.3.)
4.3 Kaufbedingung bei Ecklösung (\(p = 0\))
Für den reinen PWYW-Fall mit gegebenem \(p_f\) ist die Kaufregel vollständig durch die beiden Kandidaten \(p^* = p_f - \Delta^*\) und \(p = 0\) beschrieben.
Wenn \(p_f > \Delta^*\), ist die Innenlösung zulässig und ihr Nutzen beträgt
\[u(p^*) = r - p_f + \Delta^* - \gamma(\Delta^*)^\sigma = r - p_f + \frac{\sigma - 1}{\sigma}\Delta^*\]
Ein partieller Zahler ist daher optimal genau dann, wenn
also kauft in diesem Bereich jede Person mit \(p_f > \Delta^*\) tatsächlich im Inneren. Für \(r \leq c\) gilt dagegen \(p_f = c\) und damit
\[u(p^*) = r - c + \frac{\sigma - 1}{\sigma}\Delta^*,\]
sodass Innenkäufe sogar für einige \(r < c\) möglich sind. Das ist ein struktureller Unterschied zum linearen Modell.
Spezialfall \(\sigma = 2\): Die Bedingung \(r \geq \gamma[\lambda(r-c)+c]^2\) ist quadratisch in \(r\) und hat geschlossene Lösungen (SymPy, Step G.4):
Die lineare Vier-Segment-Logik wird im nichtlinearen Modell durch vier Zonen ersetzt, die beide Fälle (Fall A: \(r \leq c\) und Fall B: \(r > c\)) abdecken:
Fall B (\(r > c\), \(p_f = \lambda r + (1-\lambda)c\)):
Zone
Bedingung
Preis
Verhalten
B3: Partieller Zahler
\(\sigma\gamma p_f^{\sigma-1} \geq 1\)
\(p^* = p_f - \Delta^*\)
Zahlt positiv, unter \(p_f\)
B1: Freeloader
\(\sigma\gamma p_f^{\sigma-1} < 1\) und \(r \geq \gamma p_f^\sigma\)
\(p^* = 0\)
Nimmt Produkt, zahlt nichts
B1: Non-Buyer
\(\sigma\gamma p_f^{\sigma-1} < 1\) und \(r < \gamma p_f^\sigma\)
—
Kauft nicht
Fall A (\(r \leq c\), \(p_f = c\)):
Zone
Bedingung
Preis
Verhalten
A3: Partieller Zahler
\(\sigma\gamma c^{\sigma-1} \geq 1\) und \(u^* > 0\)
\(p^* = c - \Delta^*\)
Neues Segment (nicht im linearen Modell)
A1: Freeloader
\(\sigma\gamma c^{\sigma-1} < 1\) und \(r > \gamma c^\sigma\)
\(p^* = 0\)
Freeloader bei \(r \leq c\)
Non-Buyer
sonst
—
Kauft nicht
Im Vergleich zum linearen Modell:
Keine scharfe Grenze bei \(\gamma = 1\) — stattdessen ein Kontinuum von Zahlungshöhen, gesteuert durch \((\gamma, \sigma)\).
Partieller Zahler (Zone B3) zahlen \(p^* \in (0, p_f)\) — genau das Verhalten, das in den Daten beobachtet wird.
Neues Segment A3: Einige Konsumenten mit \(r \leq c\) kaufen und zahlen einen kleinen positiven Preis \(p^* = c - \Delta^*\). Für \(\sigma = 2\): \(p^* = c - 1/(2\gamma)\). Dieses Segment existiert im linearen Modell nicht.
\(p = p_f\) ist nie optimal (\(l_2 = -1\), Widerspruch) — konsistent mit der Beobachtung, dass kaum jemand exakt \(p_f\) zahlt.
Die Freeloader-Zone ist typischerweise kleiner als im linearen Modell, weil die Bedingung von \(\gamma\)und\(c\) (bzw. \(p_f\)) abhängt.
Für den Wagner-Akbari-Zweig \(r > c\) kann die Innen-/Eckgrenze weiter über
\[r_{\text{int}} = c + \frac{\Delta^* - c}{\lambda}\]
geschrieben werden, weil dort \(p_f = \lambda(r-c)+c\) gilt. Die Freeloader-Schwelle \(r_{\text{free}}\) löst in diesem Zweig die nichtlineare Gleichung
\[r = \gamma[\lambda(r-c)+c]^\sigma.\]
4.5 Profitfunktion für den Verkäufer
Der Pro-Kunden-Profit im nichtlinearen Modell lautet im allgemeinen reinen PWYW-Fall:
Für \(r_i > c_i\) (Fall B): \(p_{f,i} - c_i = \lambda_i(r_i - c_i)\) und die erste Zeile vereinfacht sich zu \(\pi_i^{NL} = \lambda_i(r_i - c_i) - \Delta_i\).
Für \(r_i \leq c_i\) (Fall A): \(p_{f,i} = c_i\), und ein Innenkauf führt zu \(\pi_i^{NL} = -\Delta_i < 0\). Solche Käufe unterhalb der Kosten sind im linearen Modell ausgeschlossen, im nichtlinearen Modell aber strukturell möglich (der „Surplus-Puffer” \(\Delta^*(\sigma-1)/\sigma\) kompensiert \(r < c\)). Für \(\sigma = 2\): Kaufbedingung \(r > c - 1/(4\gamma)\), Preis \(p^* = c - 1/(2\gamma)\).
Vergleich mit dem linearen Modell:
Linear (\(\sigma = 1\))
Nichtlinear (\(\sigma > 1\))
Fair Payer Profit
\(\lambda_i(r_i - c_i)\)
\(\lambda_i(r_i - c_i) - \Delta^*\)
Differenz
—
\(-\Delta^*\) pro partiellem Zahler
Im nichtlinearen Modell ist der Revenue pro Zahler geringer (um genau \(\Delta^*\)), weil jeder Konsument unter seinem fairen Preis bleibt. Das senkt den vorhergesagten Profit und bringt ihn näher an den beobachteten Wert.
Aggregierte Profitformel mit kontinuierlicher \(\phi(r)\):
Note
Die folgende analytische Profitformel nimmt \(\phi(r) = 1\) (Uniform auf \([0,1]\)) an — die einfachste Verteilung, für die geschlossene Integrale existieren. In der empirischen Schätzung mit den individuellen beobachteten\((r_i, c_i, \lambda_i)\) verwenden wir stattdessen die realisierte Stichprobe; weiter unten ergänzen wir zusätzlich Varianten mit Uniform-, Beta- und Trapezoid-Verteilung für \(r\). Die analytische Uniform-Formel dient hier nur der analytischen Transparenz und bezieht sich auf den Wagner-Akbari-Zweig \(r > c\); für den allgemeinen reinen PWYW-Fall ist die exakte Aggregation die obige individuelle Stückformel.
Für gemeinsame \(\gamma, \sigma, \lambda\) und einheitliches \(c\):
\[\pi^{NL}_{\text{Unif}} = \int_{r_{\text{int}}}^{1} [\lambda(r - c) + c - \Delta^* - c]\,dr
- c \int_{r_{\text{free}}}^{r_{\text{int}}} dr\]
Zwei Parameter \((\gamma, \sigma)\) können mit einer einzelnen Zielgröße (z.B. Profit) nicht identifiziert werden. Das System ist unteridentifiziert: Verschiedene \((\gamma, \sigma)\)-Kombinationen können denselben Profit erzeugen.
Lösung: Minimum-Distance-Schätzung mit mehreren Momenten.
Wir verwenden vier Zielgrößen (beobachtete Momente):
Damit Nichtlinearität und Verteilungsannahme getrennt beurteilt werden können, schätzen wir das nichtlineare Modell zusätzlich unter \(\phi(r) = 1\) auf \([0,1]\). Im Unterschied zur analytischen Formel oben bleiben dabei die individuellen\(c_i\) erhalten; für die Fair-Price-Komponente verwenden wir jedoch \(\bar{\lambda}\) und integrieren numerisch über eine uniforme \(r\)-Verteilung.
1 Euro = std × r_max (15 €). Gesamt = Euro/Kunde × N (133). Die verteilungsbasierten NL-Varianten folgen im anschließenden Vergleich.
4.10 Nichtlineare Varianten mit alternativen \(r\)-Verteilungen
Bisher wurde das nichtlineare Modell mit den individuellen beobachteten\(r_i\)-Werten berechnet. Für die Verteilungsfrage ergänzen wir drei glattere Varianten für \(\phi(r)\), um die Kombination „nichtlineare Fairnesskosten + modellierte WTP-Verteilung” systematisch zu vergleichen.
4.10a NL + Uniform-Verteilung
Als einfachste Referenz verwenden wir \(\phi(r) = 1\) auf \([0,1]\). Die numerische Integration wurde bereits oberhalb für die Vergleichstabellen berechnet; hier fassen wir die Variante als Teil des Verteilungsvergleichs zusammen. Dabei bleiben die individuellen\(c_i\) erhalten, während für die Fair-Price-Komponente \(\bar{\lambda}\) eingesetzt wird.
Die Beta-Verteilung \(\phi(r) = f_{\text{Beta}}(r; \hat{\alpha}, \hat{\beta})\) erlaubt eine flexible, zweiparametrige Approximation der beobachteten WTP-Verteilung. Wie bei der Uniform- und Trapezoid-Variante integrieren wir numerisch über \(r\), verwenden \(\bar{\lambda}\) und behalten die individuellen \(c_i\) bei.
Die Trapezoid-Verteilung \(\phi(r) = \hat{a} + 2(1-\hat{a})r\) (CKZ 2017) hat nur einen Parameter (\(\hat{a} =\) 1.938) gegenüber zwei (\(\hat{\alpha}, \hat{\beta}\)) bei der Beta. Die Partial-Payer-Integrale sind für die Trapezoid-Dichte polynomial und damit geschlossen lösbar (verifiziert in 06_derivations.py, Step J). Die Freeloader/Non-Buyer-Grenze \(r = \gamma \cdot p_f(r)^\sigma\) bleibt transzendent — daher verwenden wir auch hier numerische Quadratur (analog zur Beta-Variante).
Vergleichstabelle: Alle Modellvarianten inkl. NL + Beta + Trapezoid
Warum liegen NL Emp. und NL Beta unterschiedlich weit von den Daten entfernt?
NL Emp. (buyer_share ≈ 1.0): Verwendet die beobachteten\((r_i, c_i)\)-Paare. In unserer Stichprobe gilt \(r_i > c_i\) für alle 133 Teilnehmer. Da das deterministische Modell für jeden Konsumenten mit \(r > c\) positive Utility vorhersagt (sowohl für partielle Zahler als auch Freeloaders), kaufen alle.
Dadurch liegen im NL-Emp.-Modell nicht nur der Käufer-Anteil, sondern auch Revenue, Cost und Profit weiter von den beobachteten Werten entfernt: Wenn nahezu jeder Konsument kauft, werden zu viele Transaktionen, zu viele bediente Kunden und damit zugleich zu viel Umsatz und zu viele Kosten mechanisch in die Aggregation eingespeist.
NL Beta (buyer_share < 1): Integriert über die gesamte Beta-Verteilung\(\phi(r) = f_{\text{Beta}}(r; \hat{\alpha}, \hat{\beta})\). Diese Verteilung hat Wahrscheinlichkeitsmasse im Bereich \(r < c_i\), und Konsumenten mit \(r < c\) kaufen im Modell nicht.
Das drückt im NL-Beta-Modell Buyer Share, Revenue und Cost gleichzeitig nach unten und bringt die aggregierten Kennzahlen deshalb oft näher an die Daten. Dieser scheinbar bessere Fit entsteht aber nicht, weil das Modell das beobachtete Nicht-Kaufen bei \(r > c\) erklärt, sondern weil es zusätzliche Non-Buyers aus der Verteilungsmasse unterhalb von \(c\) erzeugt.
Wichtige Implikation: Die Non-Buyers im NL-Beta-Modell entstehen durch \(r < c\) (ökonomisch rationale Non-Buyers). Die 30 tatsächlichen Non-Buyers in unseren Daten haben jedoch alle \(r > c\)! Das bedeutet:
Der bessere Käufer-Anteil im NL-Beta-Modell trifft die richtige Größenordnung aus dem falschen Grund — er bildet die r-Verteilungsmasse unter \(c\) ab, nicht das beobachtete Nicht-Kaufen trotz \(r > c\).
Für eine korrekte Modellierung der 30 empirischen Non-Buyers bräuchte man eine stochastische Utility-Komponente (siehe Schritt 5).
Profitüberschätzung reduziert: Das nichtlineare Modell prognostiziert einen niedrigeren Profit als das lineare Modell, weil partielle Zahlungen (\(p < p_f\)) berücksichtigt werden. Die Lücke \(\Delta^*\) senkt den Revenue pro Zahler um einen festen Betrag.
Positive, aber unter \(p_f\) liegende Zahlungen: Das nichtlineare Modell erzeugt ein Kontinuum von Zahlungshöhen — konsistent mit dem breiten Spektrum beobachteter Preise. Im linearen Modell gibt es nur \(p_f\) oder \(0\).
Freeloader-Anteil: Im nichtlinearen Modell ist der Freeloader-Bereich typischerweise kleiner, weil viele Konsumenten, die im linearen Modell freeloaden würden, hier positive (wenn auch niedrige) Preise zahlen.
Käufer-Anteil: NL Emp. prognostiziert buyer_share \(\approx 1\), weil alle beobachteten \(r_i > c_i\). Die verteilungsbasierten NL-Varianten (Uniform, Beta, Trapezoid) erzeugen Non-Buyers über Masse bei \(r < c\); sie treffen die Größenordnung damit teilweise, aber aus einem anderen Mechanismus als im Datensatz (siehe Callout zur Verteilungsannahme unten und Schritt 5).
Robustheit: Die \((\gamma, \sigma)\)-Schätzung ist qualitativ stabil über verschiedene \(r\)-Verteilungen (uniform, empirisch, Beta, Trapezoid). Der Wert \(\Delta^*\) — der zentrale Modelloutput — ändert sich moderat zwischen Varianten.
Strukturelle Limitation: Käufer-Anteil
NL Emp. prognostiziert buyer_share \(\approx 100\%\), weil in unseren Daten \(r_i > c_i\) für alle 133 Teilnehmer gilt und das Modell für \(r > c\) stets positive Utility vorhersagt — sowohl für partielle Zahler (\(u(p^*) > 0\)) als auch Freeloaders (\(u(0) = r - \gamma \cdot p_f^\sigma > 0\), verifiziert für \(\gamma \in [0.5, 1000]\), \(\sigma \in [1.2, 3.0]\)).
NL Beta erzeugt Non-Buyers (\(\approx\) 21.4%), aber aus einem anderen Mechanismus als in den Daten: Die Beta-Verteilung hat Masse bei \(r < c_i\), wo Konsum irrational wäre. Die 30 tatsächlichen Non-Buyers haben jedoch alle \(r_i > c_i\).
Die 30 beobachteten Non-Buyers (trotz \(r > c\)) lassen sich mit keiner deterministischen Modellvariante korrekt erklären. Mögliche Ursachen:
Protest-/Null-WTP: Grundsätzliche Ablehnung des Kaufs unabhängig von \(r - c > 0\) (moralischer Widerstand, Desinteresse).
Referenzpreiseffekte: Die WTP (\(r\)) wurde vor der Kaufentscheidung erhoben; der effektive Reservationspreis im PWYW-Kontext kann niedriger liegen.
Entscheidungsvereinfachung: Nicht-Kauf als Strategie, um den Fairness-Konflikt zu umgehen.
Ein Modell, das sowohl realistische Preise (\(\sigma > 1\)) als auch Non-Buying bei \(r > c\) erzeugen kann, erfordert eine stochastische Komponente → siehe Schritt 5.
Verbleibende Diskrepanzen (weitere Quellen)
Neben dem Käufer-Anteil bestehen weitere Fit-Abweichungen:
Fester Gap \(\Delta^*\): Das Modell nimmt ein gemeinsames\((\gamma, \sigma)\) für alle an. In Wirklichkeit variiert die Inequity Aversion zwischen Personen.
Deterministische Preissetzung: Das Modell enthält keinen Zufall — jeder Konsument zahlt exakt \(p^*\). In der Realität gibt es Rundungen, Unsicherheit und strategisches Verhalten.
Modellgrenzen: Die Potenzform ist eine Approximation der wahren Präferenzen. Andere funktionale Formen (z.B. CARA, CRRA) könnten andere Fits liefern.
4.13 Individuelle \(\gamma_i\) aus dem Experiment
Motivation
In den bisherigen nichtlinearen Varianten wird ein gemeinsames\((\hat{\gamma}, \hat{\sigma})\) für alle 133 Teilnehmer geschätzt. In Wirklichkeit variiert die Inequity Aversion aber zwischen Personen. Im Experiment wurde \(\gamma_i\)individuell gemessen (TaxDecision-Task: Switching-Point bei variierendem \(\delta\)). Diese individuelle Information nutzen die bisherigen NL-Varianten nicht.
Hier ersetzen wir das gemeinsame \(\hat{\gamma}\) durch die individuellen \(\gamma_i\)-Schätzungen und suchen nur noch ein gemeinsames \(\sigma\), das die Daten am besten beschreibt. Damit reduziert sich die Schätzung von 2 auf 1 freien Parameter.
Skalierungsunterschied: lineares vs. nichtlineares \(\gamma\)
Die experimentell geschätzten \(\gamma_i\) stammen aus dem linearen Modell \(u = r - \gamma p_f - (1-\gamma)p\) (Bereich \(\approx 1\text{–}4\)). Im nichtlinearen Modell \(u = r - p - \gamma(p_f - p)^\sigma\) hat \(\gamma\) eine andere Interpretation (Skalierung der konvexen Fairnesskosten, Bereich \(\approx 5\text{–}20\)).
Die beiden Parameter sind nicht direkt vergleichbar. Dennoch bildet \(\gamma_i^{\text{linear}}\) die relative Variation der Fairnesspräferenzen ab: Teilnehmer mit höherem \(\gamma_i^{\text{linear}}\) sind fair-mindeder als solche mit niedrigerem. Deshalb verwenden wir \(\gamma_i\) als Proxy für die individuelle Heterogenität und lassen \(\sigma\) die Skalierung absorbieren.
Vorbereitung: Individuelle \(\gamma_i\)-Werte
Code
# gamma_estimate from TaxDecision (NA for "Always Abstain" participants)gamma_avail <-sum(!is.na(df$gamma_estimate))gamma_na <-sum(is.na(df$gamma_estimate))# For participants with NA, assign the median of available gamma estimatesgamma_median <-median(df$gamma_estimate, na.rm =TRUE)df <- df |>mutate(gamma_i_nl =ifelse(!is.na(gamma_estimate), gamma_estimate, gamma_median) )
Verfügbar: 126 individuelle \(\gamma_i\)-Schätzungen, 7 NAs (imputiert mit Median = 1).
Code
ggplot(df, aes(x = gamma_i_nl)) +geom_histogram(binwidth =0.1, fill ="steelblue", alpha =0.7, color ="white") +geom_vline(xintercept = gamma_median, linetype ="dashed", color ="red") +annotate("text", x = gamma_median +0.15, y =Inf, vjust =2,label =paste0("Mdn = ", round(gamma_median, 2)), color ="red", size =3.5) +labs(x =expression(gamma[i]^linear), y ="Anzahl") +theme_minimal(base_size =12)
Verteilung der individuellen γ-Schätzungen (TaxDecision)
Modell: Individuelle \(\Delta^*_i\)
Jede Person \(i\) hat nun einen eigenen optimalen Gap:
Damit variiert \(\Delta^*_i\) zwischen Personen: Fair-mindedere Konsumenten (\(\gamma_i\) hoch) haben kleinere Gaps (zahlen näher an \(p_f\)), weniger faire (\(\gamma_i\) niedrig) haben größere Gaps.
Figure 9: Verteilung der individuellen Δ*_i: ECDF und Boxplot
Interpretation 4.13
Die Verwendung individueller \(\gamma_i\) aus dem Experiment erlaubt heterogene Gaps\(\Delta^*_i\): Personen mit stärkerer Fairnesspräferenz (\(\gamma_i\) hoch) zahlen näher an \(p_f\), während weniger faire Personen (\(\gamma_i\) niedrig) größere Abweichungen zeigen.
Die geschätzte Krümmung \(\hat{\sigma}^{\text{ind}}\) = 1.01 absorbiert die Skalierungsdifferenz zwischen linearem und nichtlinearem \(\gamma\) (vgl. Callout oben).
M( \(\Delta^*_i\) ) = 0.2186, SD = 0.2781 — die Heterogenität in \(\gamma_i\) erzeugt eine Verteilung von Gaps statt eines festen \(\Delta^*\).
Der vorherige Abschnitt verwendet individuelle \(\gamma_i\), aber ein gemeinsames \(\sigma\). Hier gehen wir einen Schritt weiter: Für jeden zahlenden Käufer (\(p_i > 0\), \(p_i < p_{f,i}\)) bestimmen wir \(\sigma_i\) so, dass das Modell exakt den beobachteten Preis reproduziert. Damit „stimmt” das Modell per Konstruktion auf individueller Ebene — die Frage ist, ob die resultierende \(\sigma\)-Verteilung ökonomisch plausibel ist.
um die Datenvariable klar von der modellimplizierten optimalen Lücke \(\Delta^*_i\) zu trennen. In der Kalibrierung setzen wir beide gleich, also \(\Delta^*_i = \text{gap}_i\).
Diese Gleichung ist transzendent in \(\sigma_i\), weil \(\sigma_i\) zugleich innerhalb des Logarithmus und im Exponenten-Term \(-1/(\sigma_i - 1)\) auftaucht. Sie lässt sich daher nicht durch elementare algebraische Umformungen nach \(\sigma_i\) isolieren; praktisch lösen wir sie numerisch per Root-Finding.
Nicht für alle Teilnehmer bestimmbar
\(\sigma_i\) kann nur für partielle Zahler geschätzt werden:
Freeloaders (\(p_i = 0\)): Ecklösung, \(\sigma_i\) ist nicht identifiziert
Non-Buyers: Kein Preis beobachtet
Zahler mit \(p_i = p_f\): Gap = 0 → \(\Delta^* = 0\) → \(\sigma_i \to \infty\) (lineares Modell)
Zahler mit \(p_i > p_f\): Nicht im Modellrahmen
Mit Nicht-Partielle sind hier also alle Fälle gemeint, in denen kein innerer positiver Preis mit identifizierbarem Gap vorliegt: Freeloaders, Non-Buyers, Zahler genau bei \(p_f\) und Beobachtungen oberhalb von \(p_f\). Für diese Fälle verwenden wir das gemeinsame \(\hat{\sigma}\) aus dem vorherigen individuellen-\(\gamma\)-Fit als Fallback.
Code
# Solve for sigma_i given gamma_i and observed gapsolve_sigma_i <-function(gap_i, gamma_i, sigma_range =c(1.001, 50)) {# f(sigma) = (sigma * gamma)^(-1/(sigma-1)) - gap = 0 f <-function(sigma) { (sigma * gamma_i)^(-1/ (sigma -1)) - gap_i }# Check if root exists in range f_lo <-tryCatch(f(sigma_range[1]), error =function(e) NA) f_hi <-tryCatch(f(sigma_range[2]), error =function(e) NA)if (is.na(f_lo) ||is.na(f_hi) ||sign(f_lo) ==sign(f_hi)) {return(NA_real_) }tryCatch(uniroot(f, interval = sigma_range, tol =1e-8)$root,error =function(e) NA_real_ )}# Apply to all partial payersdf <- df |>mutate(gap_obs =ifelse(buyer &!freeloader & p_i < p_f_i & p_i >0, p_f_i - p_i, NA_real_) )# Solve sigma_i for each valid observationdf$sigma_i_est <-NA_real_valid_idx <-which(!is.na(df$gap_obs) & df$gap_obs >1e-6& df$gamma_i_nl >0)for (idx in valid_idx) { df$sigma_i_est[idx] <-solve_sigma_i(df$gap_obs[idx], df$gamma_i_nl[idx])}# Fill non-estimable cases with sigma from the previous individual-gamma fitdf <- df |>mutate(sigma_i_filled =ifelse(!is.na(sigma_i_est), sigma_i_est, sigma_hat_indiv),sigma_i_source =ifelse(!is.na(sigma_i_est), "geschätzt", "Fallback") )n_sigma_est <-sum(!is.na(df$sigma_i_est))n_sigma_fill <-sum(is.na(df$sigma_i_est))
Individuell geschätzt: 26 Teilnehmer. Fallback (\(\hat{\sigma}\) aus dem vorherigen individuellen-\(\gamma\)-Fit): 107 Teilnehmer.
Verteilung der individuellen \(\sigma_i\)
Code
df_sigma_valid <- df |>filter(!is.na(sigma_i_est))cor_sigma_gamma <-cor(df_sigma_valid$gamma_i_nl, df_sigma_valid$sigma_i_est,use ="complete.obs")fit_sigma_gamma <-lm(sigma_i_est ~ gamma_i_nl, data = df_sigma_valid)p_sigma_gamma <-summary(fit_sigma_gamma)$coefficients["gamma_i_nl", "Pr(>|t|)"]p1 <-ggplot(df_sigma_valid, aes(x = sigma_i_est)) +geom_histogram(binwidth =0.2, fill ="steelblue", alpha =0.7, color ="white") +geom_vline(xintercept = sigma_hat_indiv, linetype ="dashed", color ="red") +geom_vline(xintercept = sigma_hat, linetype ="dotted", color ="orange") +annotate("text", x = sigma_hat +0.3, y =Inf, vjust =2,label =bquote(hat(sigma)[gemeinsam] == .(round(sigma_hat, 2))),color ="orange", size =3) +labs(x =expression(sigma[i]), y ="Anzahl",subtitle =paste0("n = ", nrow(df_sigma_valid),", Mdn = ", round(median(df_sigma_valid$sigma_i_est), 2))) +theme_minimal(base_size =11)p2 <-ggplot(df_sigma_valid, aes(x = gamma_i_nl, y = sigma_i_est)) +geom_point(alpha =0.5, size =2) +geom_smooth(method ="lm", se =FALSE, color ="steelblue", linewidth =0.8) +labs(x =expression(gamma[i]^linear), y =expression(sigma[i]),subtitle =paste0("Cor = ", round(cor_sigma_gamma, 3),", p = ", round(p_sigma_gamma, 3))) +theme_minimal(base_size =11)library(patchwork)p1 + p2 +plot_layout(ncol =2)
Figure 10: Verteilung der individuell geschätzten σ_i (nur partielle Zahler)
Figure 11: Beobachteter vs. vorhergesagter Preis: gemeinsames vs. individuelles (γ, σ)
Interpretation 4.14
Die personenspezifische Kalibrierung \((\gamma_i, \sigma_i)\) erzeugt per Konstruktion einen exakten Fit für partielle Zahler — der vorhergesagte Preis entspricht dem beobachteten (\(p^*_i = p_i\)). Für Freeloaders und Non-Buyers wird der Fallback \(\hat{\sigma}\) aus dem vorherigen individuellen-\(\gamma\)-Fit verwendet.
Die resultierende \(\sigma_i\)-Verteilung zeigt die Heterogenität in der Krümmung der Fairnesskosten. Der direkte Check ergibt \(\mathrm{Cor}(\gamma_i, \sigma_i)\) = 0.341 bei \(p\) = 0.088. Damit ist transparent, ob fair-mindedere Personen auch stärker konvexe Fairnesskosten haben oder ob die beiden Dimensionen empirisch weitgehend unabhängig verlaufen.
Schritt 5: Stochastisches Modell (NL + Random Utility)
5.1 Modellspezifikation
Das deterministische NL-Modell (Schritt 4) erzeugt realistische Preise \(p^* \in (0, p_f)\), kann aber Non-Buying bei \(r > c\) nicht abbilden. Die stochastische Erweiterung fügt einen Random-Utility-Term hinzu:
mit \(\varepsilon \sim\) Type-I-Extremwert (Gumbel) mit Skalierungsparameter \(\mu > 0\).
Eigenschaft
Linear (Schritt 1)
NL deterministisch (Schritt 4)
NL + Random Utility (Schritt 5)
Preise \(p \in (0, p_f)\)
✗ (nur \(p_f\) oder \(0\))
✓ (\(p^* = p_f - \Delta^*\))
✓
Non-Buyers bei \(r > c\)
✗
✗
✓ (\(\varepsilon\) senkt Nutzen)
Freeloader-Anteil steuerbar
eingeschränkt
✓
✓
Parameter
\(\gamma\)
\(\gamma, \sigma\)
\(\gamma, \sigma, \mu\)
5.2 Bedingte Preissetzung (unverändert)
Schlüsselinsight
\(\varepsilon\) betrifft nur die Kaufentscheidung (buy vs. no buy), nicht die Preiswahl bedingt auf den Kauf. Die FOC \(\partial u/\partial p = 0\) ist identisch zu Schritt 4, weil \(\varepsilon\) nicht von \(p\) abhängt.
Daher: Bedingt auf Kauf gilt weiterhin \(p^* = \max(0, p_f - \Delta^*)\) mit \(\Delta^* = (\sigma\gamma)^{-1/(\sigma-1)}\).
5.3 Deterministischer Surplus \(v_i^*\)
Der deterministische Teil des Nutzens bei optimalem \(p^*\) ist:
\[v_i^* = \max_p \left[r_i - p - \gamma(p_{f,i} - p)^\sigma\right]\]
Partielle Zahler (\(p_f > \Delta^*\)): Einsetzen von \(p^* = p_f - \Delta^*\) und Verwenden von \(\gamma \Delta^{*\sigma} = \Delta^*/\sigma\) (algebraisch mit SymPy verifiziert, s. 06_derivations.py, Schritt H):
Größeres \(\mu\) erzeugt mehr Non-Buyers trotz positivem \(v^*\)
(Beide Limits algebraisch mit SymPy verifiziert, s. Schritt H.3)
5.5 Modellmomente (analytisch)
Kein Monte Carlo nötig
Da die Logit-Kaufwahrscheinlichkeit eine geschlossene Form hat, sind alle Modellmomente analytische Funktionen von \((\gamma, \sigma, \mu)\). Keine Simulation erforderlich.
Für Individuum \(i\) mit deterministischem Segment, Preis \(p_i^*\), und \(\Pr_i = \Lambda(v_i^*/\mu)\):
Käufer-Anteil endlich korrekt: Das stochastische Modell prognostiziert \(\hat{s}_b \approx\) 0.813 vs. beobachtet 0.774 — eine deutliche Verbesserung gegenüber dem deterministischen NL-Modell (\(\approx 1.0\)).
Preisstruktur erhalten: Die bedingten Preise \(p^*\) sind identisch zu Schritt 4, da \(\varepsilon\) nur die Kaufentscheidung betrifft.
Profit-Fit:\(\hat{\pi} \approx\) 0.0291 vs. beobachtet 0.0292 — die \(\mu\)-Gewichtung passt den Profit an, weil Non-Buyers (insbesondere Freeloaders mit Verlust) herausgefiltert werden.
Interpretation von \(\hat{\mu}\): Der Noise-Parameter repräsentiert verhaltensbasierte Faktoren, die nicht im deterministischen Modell enthalten sind (Protest, Unsicherheit, Entscheidungskomplexität).