Der Prior

Zeit: 10 min

Theorie: Die Quantifizierung von Vorwissen

Ob Studentin, Wissenschaftler, Dozentin oder KI-System: Wir alle arbeiten mit Annahmen darüber, wie die Welt funktioniert. Dieses Vorwissen kann auf Erfahrung, Theorie, Intuition oder früheren Daten beruhen. Manchmal ist es gut begründet, manchmal eher vage, und in manchen Kontexten kann es auch die Form von Vorurteilen annehmen. In der bayesianischen Statistik wird dieses Vorwissen nicht ignoriert, sondern explizit gemacht und in eine mathematische Form gebracht. Diese formalisierte Vorannahme nennen wir den Prior. Der Prior beschreibt, welche Werte eines unbekannten Parameters wir vor Beobachtung der neuen Daten für plausibel halten. Mathematisch wird er meist geschrieben als: \(P(\theta)\). Dabei steht θ für den unbekannten Parameter — in unserem SmartRail-Beispiel also für die wahre Pünktlichkeitsquote.

Der Prior zwingt uns, unsere Annahmen transparent zu machen. Es gibt zwei Hauptarten von Priors:

  • Uninformative Priors: Sie gehen davon aus, dass alle möglichen Werte eines Parameters gleich wahrscheinlich sind, und repräsentieren keinerlei Vorwissen (sog. flacher Prior). Hier ist es wichtig zu verstehen, dass „uninformativ“ nicht gleichbedeutend mit „neutral“ ist. Ein uninformativer Prior kann in bestimmten Kontexten tatsächlich starke Annahmen implizieren.
  • Informative Priors: Sie nutzen bestehendes Wissen aus früheren Studien oder logischen Überlegungen, um unrealistische Werte auszuschließen bzw. mit einer geringeren Wahrscheinlichkeit zu versehen. Ein typisches Beispiel ist der weakly Informative Prior, der den plausiblen Parameterbereich grob eingrenzt, ohne das Ergebnis durch zu starke Vorannahmen zu dominieren.

Kritiker werfen der bayesianischen Statistik oft vor, durch Priors Subjektivität in die Wissenschaft zu bringen. Die moderne statistische Literatur entgegnet, dass exakt das Gegenteil der Fall ist. Der Prior macht inhärente und ohnehin vorhandene subjektive Annahmen mathematisch angreifbar und transparent. Er zwingt uns, unsere Vorurteile offen zu legen und zu reflektieren, anstatt sie im Dunkeln zu belassen. In der Praxis können informative Priors die Stabilität von Modellen erheblich verbessern, insbesondere bei kleinen Stichproben oder komplexen Modellen, und so zu robusteren und realistischeren Ergebnissen führen.

Beispiel SmartRail: Die erwartete Verspätungsreduktion

Du möchtest abschätzen, um wie viele Minuten SmartRail die durchschnittliche Verspätung auf der Pilotstrecke München–Stuttgart reduziert. Bevor die ersten Testdaten eintreffen, formalisierst du dein Vorwissen.

Ein uninformativer Prior würde annehmen, dass jede Reduktion gleich wahrscheinlich ist, von einer massiven Verschlechterung bis hin zu einer unrealistischen Verbesserung um 30 Minuten. Das ist unlogisch. Ein informativer Prior konzentriert die Wahrscheinlichkeitsmasse auf realistische Werte. Basierend auf Simulationen und vergleichbaren Systemen im europäischen Ausland erwartest du eine moderate Verbesserung im Bereich von wenigen Minuten.

Deine Aufgabe

Die Applikation erlaubt es dir, deine Erwartung an SmartRail mathematisch exakt als Prior zu modellieren.

  1. Beobachten: Belasse die Startwerte. Der Graph zeigt noch relative Ahnungslosigkeit. Eine Verschlechterung durch SmartRail (links im roten Bereich) wird als genauso wahrscheinlich erachtet wie eine Verbesserung.
  2. Erfahrung einfließen lassen: Du kennst die Simulationsergebnisse. Setze den Erwartungswert auf 5 Minuten Verspätungsreduktion.
  3. Unsicherheit reduzieren: Basierend auf den Simulationsdaten bist du dir relativ sicher. Reduziere die Unsicherheit (SD) so weit, bis der Bereich links von der Nulllinie (SmartRail verschlechtert) praktisch keine Wahrscheinlichkeitsmasse mehr abbekommt. Du hast soeben einen fundierten, informativen Prior gebaut.

⏳ Die Anwendung wird geladen, dies kann bis zu 30 Sekunden dauern.

#| '!! shinylive warning !!': |
#|   shinylive does not work in self-contained HTML documents.
#|   Please set `embed-resources: false` in your metadata.
#| standalone: true
#| viewerHeight: 650

from shiny import App, render, ui
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

app_ui = ui.page_fluid(
    ui.card(
        ui.card_header("SmartRail: Prior für die Verspätungsreduktion"),
        ui.layout_columns(
            ui.div(
                ui.h5("Prior Parameter konfigurieren"),
                ui.input_slider("mean", "Erwartete Reduktion (Minuten)", -10, 20, 0),
                ui.input_slider("sd", "Unsicherheit (SD)", 1, 25, 20),
                ui.hr(),
                ui.p("Ein hoher SD-Wert spiegelt eine größere Ahnungslosigkeit über SmartRails Effekt wider. Ein niedriger SD-Wert zeigt fundiertes Vorwissen aus Simulationen."),
            ),
            ui.output_plot("prior_plot"),
            col_widths=(4, 8)
        )
    )
)

def server(input, output, session):
    @render.plot
    def prior_plot():
        mu = input.mean()
        sigma = input.sd()
        
        x = np.linspace(-30, 35, 500)
        y = norm.pdf(x, mu, sigma)
        
        fig, ax = plt.subplots(figsize=(10, 5), layout="constrained")
        
        # x in Datenkoordinaten, y in Achsenanteilen (0..1): Beschriftungen bleiben fix
        label_tf = ax.get_xaxis_transform()

        # Negativer Bereich (Verschlechterung) rot hinterlegen
        ax.axvspan(-30, 0, color='#e74c3c', alpha=0.1)
        ax.text(-15, 0.88, 'SmartRail\nverschlechtert', transform=label_tf, color='#c0392b', ha='center', va='center', fontweight='bold')

        # Positiver Bereich (Verbesserung) grün hinterlegen
        ax.axvspan(0, 35, color='#2ecc71', alpha=0.1)
        ax.text(17.5, 0.88, 'SmartRail\nverbessert', transform=label_tf, color='#27ae60', ha='center', va='center', fontweight='bold')
        
        # Prior zeichnen
        ax.plot(x, y, color='#2c3e50', linewidth=2.5)
        ax.fill_between(x, 0, y, color='#34495e', alpha=0.3)
        
        ax.set_title("Deine Prior Verteilung $P(\\theta)$")
        ax.set_xlabel("Verspätungsreduktion durch SmartRail (Minuten)")
        ax.set_ylabel("Wahrscheinlichkeitsdichte")
        
        ax.set_xlim(-30, 35)
        ax.set_ylim(0, y.max() * 1.2)
        ax.set_yticks([])
        
        # Null-Linie
        ax.axvline(0, color='black', linewidth=1.5, linestyle=':')
        ax.text(-1.5, 0.97, 'Kein Effekt (0 Min)', transform=label_tf, rotation=90,
                ha='right', va='top')
        
        ax.spines['top'].set_visible(False)
        ax.spines['right'].set_visible(False)
        
        return fig

app = App(app_ui, server)