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-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. Leerzeichen werden automatisch in Unterstriche umgewandelt.
Alle Mittelwerte werden auf der Modellskala η (linearer Prädiktor) eingegeben:
Der ⇄ Rohskala-Button erlaubt die Eingabe auf der Antwortskala E[Y] — intern wird alles auf η umgerechnet.
Der Scale Converter (unter der Likelihood-Auswahl) zeigt die Umrechnung η ↔ E[Y] interaktiv für beliebige Werte.
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.
Wenn ein Within-Faktor aktiv ist, entstehen korrelierte Messwiederholungen. Die Korrelationsmatrix (Tab 2) bestimmt, wie stark die Zeitpunkte miteinander zusammenhängen.
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.
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.
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 — das erzeugt 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.
pivot_longer() automatisch repliziert wird.cleanR() sanitiert (Leerzeichen → Unterstriche, Sonderzeichen entfernt).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. Mit Random Slope: (1 + Zeit | Klasse).
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.
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 Kovarianzstrukturbase R (rnorm, rbinom, …) für einfache Between-/No-Factor-DesignsMASS::mvrnorm() für korrelierte Random-Effects (τ₀, τ₁) und korrelierte KovariablenNicht-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.
empirical = TRUE: Wenn exakte Stichprobenkennwerte statt Zufallsziehung gewünscht werden — nützlich wenn JS-Visualisierung und R-Code übereinstimmen sollen.
Pakete (Installation):
install.packages("faux")install.packages("glmmTMB")install.packages("MASS") # meist vorinstalliertinstall.packages("future.apply") # für Power-ParallelisierungAm 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-TestsN_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 TermZwei Testvarianten im Block:
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).anova() — Likelihood-Ratio-Tests durch Modellvergleich. Statistisch genauer (v.a. bei kleinen N und non-Gaussian), aber ~3–6× langsamer. Enthält:
Y ~ 1 + RE)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:
t_family() — nicht gaussian()!lognormal() — nicht gaussian(link="log")!Gamma(link = "log")beta_family(link = "logit")nbinom2(link = "log") (NB2-Parametrisierung)Parallelisierung: library(future.apply); plan(multisession) → future_sapply() statt sapply(). Speedup ~3–6× je nach Rechner.
Interpretation: Power von 80 % = in 80 von 100 Replikationen des Experiments wäre der Effekt bei deinen gewählten Parametern signifikant nachweisbar.
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.