Data Creator — Hilfe & Dokumentation
Was ist der Data Creator? ▸

Der Data Creator erzeugt parametrische Beispieldatensätze für Lehr- und Simulationszwecke. Du legst das Design fest (Between- und/oder Within-Faktoren, Likelihood, Clusterstruktur) und gibst direkt die theoretischen Mittelwerte ein — der Code übernimmt die Datenerzeugung.

Ergebnis: CSV-Export (Wide & Long), vollständiger R-Code (mit faux::sim_design, glmmTMB, Power-Simulation), und eine interaktive Vorschau.

Der Data Creator ist kein Analysewerkzeug — er hilft beim Studiendesign, Poweranalyse und Prior Predictive Checking.

Between vs. Within Faktoren ▸

Between-Subject-Faktor: Jede Versuchsperson gehört zu genau einer Gruppe (z.B. Kontroll- vs. Experimentalgruppe). Varianz entsteht zwischen Personen.

Within-Subject-Faktor: Dieselbe Person wird mehrfach gemessen (z.B. Zeitpunkte t1, t2, t3). Messwiederholung erzeugt Korrelation zwischen den Levels. Der Data Creator unterstützt aktuell einen Within-Faktor.

Die Kombination aus beiden heißt Mixed Design (= Split-Plot). In brms: bf(Y ~ gruppe * time + (1 | id))

Levelnames: Kommagetrennt eingeben, z.B. A, B, C. Erlaubt sind Buchstaben, Ziffern und Punkt. Leerzeichen und Sonderzeichen werden automatisch in Punkte umgewandelt (z. B. „treat 1“ → „treat.1“), doppelte Level entfernt. Unterstriche sind nicht erlaubt, weil faux::sim_design() sie als Trennzeichen der Zellnamen verwendet.

Likelihood & Eingabeskala (η vs. E[Y]) ▸

Die Mittelwerte lassen sich auf zwei Skalen eingeben — umschaltbar über die Eingabeskala-Buttons oberhalb des Mittelwert-Grids:

  • E[Y] · Response-Skala (Standard): Eingabe direkt auf der Response-Skala — z.B. Wahrscheinlichkeiten (0–1) bei Bernoulli/Binomial/Beta, Raten/Erwartungswerte (>0) bei Poisson/Gamma/NegBinomial/Lognormal, gewöhnliche Zahlenwerte bei Gauß/Student.
  • μ · Modellskala (η): Eingabe auf dem linearen Prädiktor — z.B. Logits bei Bernoulli/Binomial/Beta, log-Skala bei Poisson/Gamma/NegBinomial/Lognormal.

Intern wird immer auf η gespeichert — die Eingabeskala betrifft nur Anzeige und Eingabe, nicht die generierten Daten. Die Buttons und der Hinweistext darunter zeigen dabei dynamisch an, welche Art Zahl gerade erwartet wird (z.B. "Modellskala · Logits" vs. "Response-Skala · Wahrscheinlichkeit"); bei Gauß/Student ist diese Zusatzangabe leer, da beide Skalen dort identisch sind (Identity-Link).

Umrechnung η ↔ E[Y] je Likelihood:

  • Gauß: η = E[Y] direkt (Identity-Link)
  • Poisson / NegBin: η = log(E[Y]) → E[Y] = exp(η)
  • Bernoulli / Beta / Binomial: η = logit(p) → p = 1/(1+exp(−η))
  • Lognormal: η = E[log(Y)] → Median = exp(η)
  • Gamma: η = log(E[Y]), φ = Shape (Variabilität)
  • Student-t: η = E[Y], ν = Freiheitsgrade (kleiner ν = schwerere Schwänze)

Der Scale Converter (unter der Likelihood-Auswahl) zeigt die Umrechnung η ↔ E[Y] interaktiv für beliebige Werte.

Mittelwert-Grid & Standardabweichungen ▸

Das Mittelwert-Grid zeigt alle Design-Zellen. Für ein 2×3-Design (2 Between-Levels × 3 Within-Levels) entstehen 6 Zellen.

Die SD-Zeile legt die Residual-Streuung pro Zelle fest — auf der Modellskala (σ für Gauß, wird bei anderen Likelihoods intern verwendet).

Für Nicht-Gauß-Likelihoods steuert σ nicht direkt die Varianz der Zielverteilung, sondern die Varianz der Normalapproximation auf η-Ebene, aus der dann die Zielverteilung transformiert wird.

Korrelationsmatrix (Within-Design) ▸

Wenn ein Within-Faktor aktiv ist, entstehen korrelierte Messwiederholungen. Die Korrelationsmatrix (Tab 2) bestimmt, wie stark die Zeitpunkte miteinander zusammenhängen.

  • Compound Symmetry (CS): Alle Off-Diagonal-Einträge gleich ρ (einfachstes Modell)
  • AR(1): ρ^|j-k| — nahegelegene Zeitpunkte korrelieren stärker (typisch für Längsschnitt)
  • Custom: Freie Eingabe jedes Matrixelements (muss positiv-definit sein)

Der rote Rahmen bei Custom zeigt an, dass die Matrix nicht positiv-definit ist und keine gültige Kovarianzmatrix ergibt.

Bei Nicht-Gauß-Likelihoods: Die Korrelationsstruktur wirkt als Gauß-Approximation auf η-Ebene — das ist bei moderaten Korrelationen vertretbar.

Cluster / Random Effects (τ₀, τ₁, ρ₀₁) ▸

Der Cluster-Toggle fügt eine Gruppenstruktur hinzu (z.B. Schüler in Klassen). Jede Klasse bekommt einen zufälligen Intercept u₀ⱼ ~ N(0, τ₀²).

τ₀ (Random-Intercept-SD): Wie stark unterscheiden sich Klassen im Mittelniveau? Größerer τ₀ = mehr Heterogenität zwischen Clustern.

τ₁ (Random-Slope-SD): Wenn τ₁ > 0, bekommt jede Klasse auch einen zufälligen Slope für den gewählten Prädiktor. Formel: (1 + Methode | Klasse)

ρ₀₁ (Intercept-Slope-Korrelation): Korrelation zwischen u₀ und u₁. Positiv bedeutet: Klassen mit hohem Basisniveau zeigen auch stärkere Effekte. Wird über Cholesky-Zerlegung erzeugt.

Slope auf: Wähle, welcher Prädiktor den Random Slope bekommt — Between- oder Within-Faktor möglich. Das bestimmt die brms-Formel.

ICC: Intraclass Correlation = τ₀²/(τ₀²+σ²). Typische Werte: Schulen ~0.10–0.20, Familien ~0.15–0.45.

Cluster-randomisiert (nur sichtbar, wenn zusätzlich ein Between-Faktor aktiv ist): Standardmäßig werden Cluster unabhängig von der Gruppe zugewiesen — ein Cluster kann Personen aus mehreren Gruppen enthalten (individuelle Randomisierung innerhalb des Clusters). Aktiviert man den Schalter, gehört jeder Cluster komplett zu einer Gruppe (k wird gleichmäßig auf die Gruppen aufgeteilt) — das bildet klassische cluster-randomisierte Studien ab (z.B. ganze Schule = Intervention/Kontrolle). Die Personen-/Cluster-IDs bleiben dabei immer global eindeutig — es gibt nie zwei verschiedene Personen mit derselben ID in unterschiedlichen Clustern. Die Einstellung wirkt identisch in der Live-Vorschau und im generierten R-Code (dort über group_by() + cur_group_id() statt sample()).

Item-Struktur (gekreuzte Random Effects) ▸

Im Unterschied zum Cluster oben (genestet: jede Person gehört zu genau einer Schule) ist die Item-Struktur vollständig gekreuzt: jedes Item erscheint bei jedem Subject bzw. jeder Bedingung — typisch für Experimente mit mehreren Stimuli/Items pro Bedingung (z.B. mehrere Testaufgaben pro Person und Zeitpunkt).

Formel-Beispiel: Y ~ Gruppe * Bedingung + (1 | ID) + (1 | Item). Jedes Item bekommt einen eigenen zufälligen Intercept ~ N(0, τ²) — aktuell nur Intercept, kein Item-Random-Slope (v1-Scope).

Da ein Item bei mehreren Messungen derselben Person auftreten kann, erzwingt eine aktive Item-Struktur automatisch das Long-Format: der CSV-Export zeigt dann nur noch einen Button (kein separates Wide/Long) und der Plot wechselt auf eine vereinfachte Box+Jitter-Darstellung.

Bekannte Einschränkung im generierten R-Code: Die Kombination aus Cluster + Item + einer nicht-additiven Familie (z.B. Bernoulli, Poisson) ohne Within-Faktor lässt sich im R-Code nicht automatisch korrekt erzeugen (Y ist an der Stelle bereits eine gezogene, diskrete Stichprobe — Item-Effekte müssten vorher auf η injiziert werden). Dieser eine Fall wird im Code klar auskommentiert mit Erklärung ausgegeben statt falsch generiert zu werden; die Live-Vorschau/CSV oben simulieren ihn korrekt.

Kovariablen (kontinuierliche Prädiktoren) ▸

Kovariablen sind kontinuierliche Prädiktoren, die zusätzlich zu Between/Within-Faktoren generiert werden (max. 2). Sie erscheinen als Spalten im CSV und in der Formelvorschau.

μ / σ: Globaler Mittelwert und Standardabweichung der Kovariable.

μ je Gruppe: Wenn Between-Faktoren vorhanden sind, kann der Mittelwert pro Gruppe variieren — zusammen mit einer Steigung β ≠ 0 erzeugt das eine Konfundierung zwischen Kovariable und Faktor (typischer Anwendungsfall für G-Computation).

ρ mit cov1: Wenn 2 Kovariablen definiert sind, können sie über eine Cholesky-Zerlegung korreliert generiert werden. Im R-Code wird MASS::mvrnorm() verwendet.

β (Steigung auf Y): Um wie viel Y steigt, wenn die Kovariable um eine Einheit steigt, in den Einheiten deiner eigenen Variablen (z. B. Punkte pro Lebensjahr). Bei Gaussian und Student ist das die Regressionssteigung. Bei den übrigen Verteilungen wirkt β auf der Link-Skala (log bzw. logit). Unter dem Feld rechnet das Tool zur Orientierung aus, wie viele Residual-SD eine SD der Kovariable verschiebt. Das hilft bei Effektgrößen und Poweranalysen, ohne dass du in standardisierten Einheiten eingeben musst. Mit β = 0 bleibt die Kovariable ohne Wirkung auf Y.

β je Gruppe (Interaktion Faktor × Kovariable): Hier gibst du für jede Gruppe eine eigene Steigung an. Die Interaktion ist der Unterschied zwischen den Steigungen. Der Haupteffekt der Kovariable (bei Effektkodierung) ist der Mittelwert der Gruppensteigungen. Beispiel: +0,5 in Gruppe A und −0,5 in Gruppe B ergeben einen Haupteffekt von 0 und trotzdem eine Interaktion. Die Formelvorschau enthält dann Faktor × Kovariable.

μ je Gruppe und β sind zwei verschiedene Dinge: μ je Gruppe beschreibt, dass sich die Gruppen in der Kovariable unterscheiden (Pfeil Faktor → Kovariable). Die Steigung β beschreibt, wie die Kovariable auf Y wirkt (Pfeil Kovariable → Y). Erst beide zusammen erzeugen Confounding. Eine Interaktion entsteht nur über „β je Gruppe“.

Zentrierung: Die Zellmittelwerte μ in der Mittelwerte-Tabelle gelten für eine Kovariable am Gesamtmittel der Kovariable (Zentrierungspunkt). Ohne β ändert das nichts. Mit β sind es „adjustierte“ Mittelwerte: Die rohen Gruppenmittel von Y weichen davon ab, wenn die Gruppen unterschiedliche Kovariablen-Mittel haben. Für die Analyse empfiehlt sich dieselbe Zentrierung (cov − mean(cov)). Das gilt generell, bei Interaktionen ist es besonders wichtig: Sonst beziehen sich die Gruppeneffekte auf Kovariable = 0, einen Wert, der oft gar nicht vorkommt. Der R-Export enthält einen Tipp dazu, und der Power-Block zentriert die Kovariable selbst.

Exakt-Modus: Verteilung der Kovariable und der Residuen sind exakt. Die geschätzte Steigung weicht trotzdem leicht von β ab, weil Kovariable und Residuen in jeder Stichprobe minimal zusammenhängen.

Poweranalyse: Der Power-Block (Option A, Wald) enthält die Kovariable und bei „β je Gruppe“ auch die Interaktion Faktor × Kovariable. Die LRT-Variante (Option B) kennt diese Interaktion noch nicht.

  • Kovariablen sind immer between-subjects (zeitinvariant): bei Within-Design eine Spalte pro Subjekt, die durch pivot_longer() automatisch repliziert wird.
  • Kovariablen-Namen werden im R-Code durch cleanR() sanitiert (Leerzeichen → Unterstriche, Sonderzeichen entfernt).
Formel & Modellspezifikation ▸

Die Formelvorschau (Tab 1) zeigt lme4- und brms-kompatible Formeln. Bei mehreren Faktoren wird automatisch das volle Interaktionsmodell (A * B * W) vorgeschlagen — das robusteste Modell bei Messwiederholung.

A * B expandiert zu A + B + A:B (Haupteffekte + Interaktion). A * B * W ergibt alle 2-Wege und die 3-Wege-Interaktion.

Der Random-Effect-Term (1 | Klasse) erscheint automatisch wenn Cluster aktiv, (1 | Item) wenn Item-Struktur aktiv. Mit Random Slope: (1 + Zeit | Klasse).

Bei Nicht-Gauß-Likelihoods wird neben der Formel zusätzlich die passende Family explizit angezeigt (z.B. family = binomial(link="logit")) — wichtig, da lme4/glmmTMB anders als brms keine eigene bernoulli()-Familie kennen (Bernoulli = Binomial mit N=1 unter der Haube). Manche Familien (Student-t, Lognormal, Beta, NegBinomial) kann nur glmmTMB fitten, lme4 nicht — die Formel-Vorschau zeigt das durch das Präfix glmmTMB: (statt lme4/glmmTMB:) plus einem kurzen Hinweis an.

Visualisierung & Plot-Optionen ▸

Rohdaten / Mittelwerte: Zeigt Einzelpunkte (subsampelt), Boxplots (Between) oder Mittelwertslinien (Within) + Spaghetti-Linien pro Cluster.

Effektplot: Zeigt Median (50. Pct.) + Band von 16. bis 84. Pct. (~±1 SD bei Normalverteilung). Klarer, aber ohne Rohdaten.

Gruppen-Selektor: Bei mehreren Between-Faktoren kannst du auswählen, welcher Faktor die Farben/Linien bestimmt. "Alle Kombinationen" zeigt alle Zellen gleichzeitig.

X-Achse-Selektor (Between-only, ≥2 Between-Faktoren): Welcher Faktor geht auf die X-Achse? Der Gruppen-Selektor bestimmt dann die Farb-Gruppierung.

R-Code Export & faux::sim_design() ▸

Der generierte R-Code ist vollständig reproduzierbar und nutzt:

  • faux::sim_design() (DeBruine & Barr 2021) für Within-Designs — erzeugt korrelierte Normalverteilungen mit der angegebenen Kovarianzstruktur
  • base R (rnorm, rbinom, …) für einfache Between-/No-Factor-Designs
  • MASS::mvrnorm() für korrelierte Random-Effects (τ₀, τ₁) und korrelierte Kovariablen

Nicht-Gauß-Likelihoods: sim_design() erzeugt immer normalverteilte η-Werte. Diese werden danach via mutate(across(...)) in die Zielverteilung transformiert (z.B. rbinom(n(), 1, plogis(eta)) für Bernoulli). Das ist eine Gauß-Approximation auf η-Ebene — für moderate Korrelationen und nicht zu extreme Verteilungsparameter gut geeignet.

Wide → Long: Within-Designs erzeugen dat_wide (eine Spalte pro Zeitpunkt). pivot_longer() macht daraus dat_long — das Format, das brms/lme4 erwartet. Kovariablen (between-subjects) werden dabei automatisch repliziert.

🎯 Exakte Parameter (Toggle oben): Erzwingt exakte Stichproben-Mittelwerte/SDs statt Zufallsstreuung — nützlich um z.B. zu prüfen, ob ein Modell die wahren Populationsparameter exakt zurückgewinnt. Nutzt das empirical = TRUE-Prinzip (linear reskalieren, statt neu zu ziehen) und wirkt identisch in der JS-Vorschau/CSV und im generierten R-Code. Gilt vollständig für Gaussian/Student/Lognormal (Kovariablen, Cluster-Random-Effects, Y); bei Gamma/Bernoulli/Beta/Binomial/Poisson/NegBinomial nur für die zugrundeliegende η-/Cluster-Struktur — die finale Ziehung bleibt dort zufällig, da es kein allgemeines exaktes Verfahren für diese Familien gibt. Der Poweranalyse-Codeblock ignoriert den Toggle bewusst (Monte-Carlo-Power braucht echte Stichprobenstreuung).

Item-Random-Effects im Code: Bei aktiver Item-Struktur wird die Item-Zuordnung erst nach pivot_longer() injiziert (bzw. nach der Cluster-Auflösung im between-only Fall ohne Within-Faktor) — Details und die eine bekannte Einschränkung dazu siehe Hilfe-Abschnitt "Item-Struktur" oben.

Cluster-randomisiert im Code: Ist der Schalter aktiv, ersetzt group_by(across(...)) + cur_group_id() die einfache sample()-Zuordnung, damit die k Cluster gleichmäßig und exklusiv auf die Zwischen-Gruppen aufgeteilt werden (kein Cluster in mehreren Gruppen) — siehe Hilfe-Abschnitt "Cluster / Random Effects" oben. Der auskommentierte Power-Simulations-Block unten kennt diese Option noch nicht und wird dann mit einem Warnhinweis versehen.

Pakete (Installation):

  • install.packages("faux")
  • install.packages("glmmTMB")
  • install.packages("MASS") # meist vorinstalliert
  • install.packages("future.apply") # für Power-Parallelisierung
Power-Simulation (auskommentierter Block) ▸

Am Ende jedes generierten R-Codes befindet sich ein vollständiger, auskommentierter Power-Simulations-Block. Die #-Zeichen entfernen und der Block ist direkt in R ausführbar.

Aufbau des Blocks:

  • library(glmmTMB) + library(car) — Pakete für GLMMs und Omnibus-Tests
  • N_sim <- 500 — Simulationswiederholungen (500–1000 für stabile Schätzung)
  • sim_data_one(seed) — erzeugt einen Datensatz mit deinen Parametern; bei Within-Design mit (1|id)
  • fit_and_test(seed) — fittet Vollmodell, gibt benannten logischen Vektor zurück (ein Wert pro Term)
  • sapply() → Matrix (Zeilen = Terme, Spalten = Sims); rowMeans() = Power pro Term

Zwei Testvarianten im Block:

  • Option A (Standard): car::Anova(type="II") — Wald-Omnibus-Tests für alle Terme in einem Modell-Fit. Schnell, ein Fit pro Sim. Gibt Power pro Term aus. Wenn Interaktionen vorhanden sind und Haupteffekte konditional interpretiert werden sollen: options(contrasts = c("contr.sum", "contr.poly")) + type="III" (Kommentar im Code).
  • Option B (am Ende, auskommentiert): LRT via anova() — Likelihood-Ratio-Tests durch Modellvergleich. Statistisch genauer (v.a. bei kleinen N und non-Gaussian), aber ~3–6× langsamer. Enthält:
    • Interaktionstest: Vollmodell vs. Additiv
    • Typ-II-Haupteffekte: Additiv vs. Additiv-ohne-X (kontrolliert für alle anderen)
    • Jeder Faktor vs. Nullmodell (Y ~ 1 + RE)
    • Additives Modell vs. Null (alle Haupteffekte kombiniert)

Within-Design und ID-Variable: Bei Within-Faktoren enthält die Power-Formel immer (1 | id), damit die wiederholten Messungen korrekt modelliert werden. Das id stammt aus faux::sim_design() und überlebt den pivot_longer()-Schritt.

glmmTMB-Familien — Unterschied zu brms/lme4:

  • Student-t: t_family() — nicht gaussian()!
  • Lognormal: lognormal() — nicht gaussian(link="log")!
  • Gamma: Gamma(link = "log")
  • Beta: beta_family(link = "logit")
  • Neg. Binomial: nbinom2(link = "log") (NB2-Parametrisierung)

Parallelisierung: library(future.apply); plan(multisession) → future_sapply() statt sapply(). Speedup ~3–6× je nach Rechner.

Noch nicht abgebildet: Der Block kennt weder die Item-Struktur (gekreuzte Random Effects) noch den "Cluster-randomisiert"-Schalter — beide Optionen erzeugen dort nur einen Warnhinweis-Kommentar statt automatisch angepassten Codes. Für eine Power-Analyse mit diesen Optionen muss sim_data_one() von Hand erweitert werden (Anleitung direkt im Kommentar).

Interpretation: Power von 80 % = in 80 von 100 Replikationen des Experiments wäre der Effekt bei deinen gewählten Parametern signifikant nachweisbar.

Häufige Fragen & Fallstricke ▸

Warum stimmen JS-Simulation und R-Code nicht exakt überein?
JS nutzt mulberry32 als PRNG, R den Mersenne Twister. Gleicher Seed → ähnliche, aber nicht identische Zufallszahlen. Für exakte Übereinstimmung: empirical = TRUE in faux::sim_design() — dann entsprechen die Stichprobenkennwerte exakt den eingestellten Werten.

Warum erscheinen Faktornamen im R-Code anders als eingegeben?
Namen mit Leerzeichen oder Sonderzeichen (z.B. "Reaktions Zeit (ms)") werden automatisch bereinigt: Leerzeichen/Bindestriche → Unterstriche, übrige Sonderzeichen werden entfernt. Im CSV-Header und in der Formelvorschau werden ebenfalls die bereinigten Namen verwendet.

Kovariablen in Within-Designs (Wide → Long):
Kovariablen sind between-subjects und erscheinen daher im Wide-Format als eine Spalte. Nach pivot_longer() wird die Kovariable automatisch für jede Messung repliziert — das ist das korrekte Long-Format für brms/lme4.

Nicht-Gauß-Likelihoods und Korrelationsmatrix:
faux::sim_design() erzeugt intern immer normalverteilte η-Werte (linearer Prädiktor). Die Korrelationsstruktur (Tab 2) wirkt auf dieser η-Ebene. Nach der Transformation in die Zielverteilung (z.B. Poisson, Beta) ist die Pearson-Korrelation zwischen den Within-Levels niedriger als ρ. Bei starker Nicht-Normalität (z.B. Bernoulli mit extremen ps) kann der Unterschied erheblich sein.

Gamma-Parametrisierung:
Im Data Creator wird Gamma(μ, φ) mit Log-Link verwendet: μ = exp(η), Shape = φ, Rate = φ/μ. Das entspricht brms' Gamma(link="log")-Parametrisierung. Die Varianz ist μ²/φ — je größer φ, desto kleiner die relative Variabilität.

Beta-Parametrisierung:
Beta(μ, φ) mit μ = logit⁻¹(η), α = μ·φ, β = (1-μ)·φ. φ ist der Präzisionsparameter: größeres φ = schmalere Verteilung um μ. Typischer Wertebereich für φ in Likert-Daten: 5–20.

ICC berechnen:
ICC = τ₀² / (τ₀² + σ²). Für Gauß-Design: τ₀ = 0.5, σ = 1 → ICC ≈ 0.20. Typische Richtwerte: Schulen ~0.10–0.20, Familien ~0.20–0.40, Messungen an Personen ~0.50–0.70.

Weiterführende Literatur ▸
Erst die Daten simulieren, dann analysieren — mit einer Wahrheit, die du selbst festlegst.
Eingabeskala:
Eingabe erfolgt auf der Response-Skala E[Y] — wird intern als η (Modellskala) gespeichert
Füge Faktoren hinzu, um die Mittelwert-Matrix zu konfigurieren.
Kein Within-Faktor definiert. Korrelationsmatrix nicht verfügbar.
Cluster-Struktur nicht aktiviert.
Modellformel-Vorschau
lme4/glmmTMB:Y ~ 1
brms:Y ~ 1