21 Generierung von Daten
Letzte Änderung am 22. August 2025 um 20:17:59
“Je größer die Insel des Wissens, desto größer der Strand der Verzweiflung.” — unbekannt
Dieses Kapitel wird in den nächsten Monaten geschrieben und ist damit eine zukünftige Großbaustelle. Ich plane zum Beginn des SoSe 2026 eine fertige Version des Kapitels erstellt zu haben. Während das Kapitel entsteht, funktioniert so manches dann nicht so wie es soll. Bitte daher hier dann abwarten.
In diesem Kapitel geht es um die Erstellung von zufälligen Daten. Oder anderherum, wir wollen uns künstliche Daten (eng. artificial data oder eng. synthetic data) generieren. Warum machen wir das? Eine Frage, die sich vermutlich kein Statistiker oder Date Scientist stellen würde, ist es doch Teil der wissenschaftlichen Arbeit simulierte Daten zu erstellen. Auf diesen simulierten Daten werden dann die neuen entwickelten Algorithmen getestet. Für Menschen außerhalb der Data Science mag es seltsam erscheinen, dass wir uns einfach Daten erschaffen können. Diese synthetischen Daten kommen dann aber den biologischen Daten manchmal recht Nahe. Daher kannst auch du dir deine Daten theoretisch einfach selber bauen, nachdem du dieses Kapitel gelesen hast.
“With great power comes great responsibility.” — Uncle Ben to Peter Parker in Spiderman
Keine Daten für die Abschlussarbeit erschaffen. Auch wenn die Daten mal nicht so passen, wie du dir das aus einem Experiment erhofft hast, ist es nicht erlaubt sich einfach die Daten selber zu simulieren. Simulierte Daten haben keinen wissenschaftlichen Wert abseits der Validierung von neuen Algorithmen.
Was du aber machen kannst, ist deine experimentellen Daten schon mal im Design vorbauen um deine Analyse in R vorzurechnen. Wenn du dann aus deinem Experiment die echten Daten vorliegen hast, kannst du dann schneller die Analysen rechnen. Du hast dann ja schon alles einmal geübt und vorgearbeitet.
Daher nutzen wir diesen Kapitel auch anders. Wir erschaffen uns ja Daten um Algorithmen zu verstehen. Wenn wir wissen wie die Daten aufgebaut sind, dann können wir auch besser verstehen was uns ein Modell oder ein statistischer Test wiedergibt. Dafür brauchen wir dann die synthetischen Daten. Eine andere Möglichkeit ist, dass du einmal ausprobieren möchtest, wie eine potenzielle Analyse ablaufen würde. Dann macht es auch Sinn einmal über künstliche Daten nachzudenken. Ich komme dann immer mal wieder auf dieses Kapitel zurück, wenn ich in anderen Kapiteln mal künstliche Daten brauche. Wir schauen uns verschiedene Wege künstliche Daten zu erschaffen einmal an und es geht auch in Excel relativ einfach.
21.1 Allgemeiner Hintergrund
“We test our framework both on synthetic data, as the only source of ground truth on which we can objectively assess the performance of our algorithms, as well as on real data to demonstrate its real-world practicability.” — Jackson et al. (2009)
Wenn wir Daten generieren wollen, dann müssen wir auch wissen, was wir genieren wollen. Dafür müssen wir dann verstehen, wovon wir sprechen. Da wir es bei der Datengenerierung auch immer mit statistischen Modellen zu tun haben, müssen wir auch die Fachsprache der statistischen Modellierung nutzen. Dann wollen wir verstehen, was wir eigentlich simulieren. Klar, wir simulieren Daten, aber was brauchen wir dafür an statistischen Maßzahlen? Ich betrachte dann nochmal die Einschränkungen dieses Kapitels, denn wir können natürlich hier nicht alles simulieren, was möglich ist. Faktisch konzentrieren wir uns hier auf häufige Datenstrukturen in den Agrawissenschaften. Dann zeige stelle ich dir nochmal kurz die zwei R Pakete vor, die wir dann hier nutzen können.
Sprachlicher Hintergrund
“In statistics courses taught by statisticians we don’t use independent variable because we use independent on to mean stochastic independence. Instead we say predictor or covariate (either). And, similarly, we don’t say”dependent variable” either. We say response.” — User berf auf r/AskStatistics
Wenn wir uns mit dem statistischen Modellieren beschäftigen wollen, dann brauchen wir auch Worte um über das Thema reden zu können. Statistik wird in vielen Bereichen der Wissenschaft verwendet und in jedem Bereich nennen wir dann auch Dinge anders, die eigentlich gleich sind. Daher werde ich mir es hier herausnehmen und auch die Dinge so benennen, wie ich sie für didaktisch sinnvoll finde. Wir wollen hier was verstehen und lernen, somit brauchen wir auch eine klare Sprache.
“Jeder nennt in der Statistik sein Y und X wie er möchte. Da ich hier nicht nur von Y und X schreiben will, führe ich eben die Worte ein, die ich nutzen will. Damit sind die Worte dann auch richtig, da der Kontext definiert ist. Andere mögen es dann anders machen. Ich mache es eben dann so. Danke.” — Jochen Kruppa-Scheetz, meiner bescheidener Meinung nach.
In dem folgenden Kasten erkläre ich nochmal den Gebrauch meiner Begriffe im statistischen Modellieren als Grundlage für die Generierung von Daten. Es ist wichtig, dass wir hier uns klar verstehen. Zum einen ist es angenehmer auch mal ein Wort für ein Symbol zu schreiben. Auf der anderen Seite möchte ich aber auch, dass du dann das Wort richtig einem Konzept im statistischen Modellieren zuordnen kannst. Deshalb einmal hier meine persönliche und didaktische Zusammenstellung meiner Wort im statistischen Modellieren. Du kannst dann immer zu dem Kasten zurückgehen, wenn wir mal ein Wort nicht mehr ganz klar ist. Die fetten Begriffe sind die üblichen in den folgenden Kapiteln. Die anderen Worte werden immer mal wieder in der Literatur genutzt.
“Die Grenzen meiner Sprache bedeuten die Grenzen meiner Welt.” — Ludwig Wittgenstein
Hier kommt einmal die Tabelle mit den wichtigsten Begriffen im statistischen Modellieren und wie ich die Worte benutzen werde. Damit wir uns verstehen und du was lernen kannst. In anderen Büchern und Quellen findest du teilweise die Worte in einem anderen Sinnzusammenhang. Das ist gut so dort. Bei mir ist es anders.
Symbol | Deutsch | Englisch | |
---|---|---|---|
LHS | \(Y\) / \(y\) | Messwert / Endpunkt / Outcome / Abhängige Variable | response / outcome / endpoint / dependent variable |
RHS | \(X\) / \(x\) | Einflussvariable / Erklärende Variable / Fester Effekt / Unabhängige Variable | risk factor / explanatory / fixed effect / independent variable |
RHS | \(Z\) / \(z\) | Zufälliger Effekt | random effect |
\(X\) ist kontinuierlich | \(c_1\) | Kovariate 1 | covariate 1 |
\(X\) ist kategorial | \(f_A\) | Faktor \(A\) mit Level \(A.1\) bis \(A.j\) | factor \(A\) with levels \(A.1\) to \(A.j\) |
Am Ende möchte ich nochmal darauf hinweisen, dass wirklich häufig von der abhängigen Variable (eng. dependent variable) als Messwert und unabhängigen Variablen (eng. independent variable) für die Einflussvariablen gesprochen wird. Aus meiner Erfahrung bringt die Begriffe jeder ununterbrochen durcheinander. Deshalb einfach nicht diese Worte nutzen.
Effekt, Streuung und Fallzahl
Was brauchen wir um Daten zu generieren? Wir brauchen einen Effekt, eine Streuung der generierten Date um den Mittelwert sowie die Fallzahl als Anzahl an Beobachtungen. Dann müssen wir noch entscheiden aus welcher Verteilung unsere Daten kommen sollen. In dem folgenden Venndiagramm habe ich dir nochmal den Dreiklang der drei statistischen Eigeschaften für die Generierung von Daten zusammengefasst. Wir müssen uns also klar werden, welchen Effekt wir simulieren wollen, welche Streuung in den Daten vorliegen soll und natürlich wie viele Beobachtungen wir in den generierten Daten vorfinden wollen.
Wir machen wir das jetzt praktisch in R. Dazu haben wir verschiedene Möglichkeiten, wir beginnen hier einmal mit der simplesten Form. Mit der Funktion rnorm()
können wir uns zufällige Daten aus einer theoretischen Normalverteilung ziehen. Es gibt natürlich noch viel mehr r*
-Funktionen für die Generierung von Daten. Die Seite Probability Distributions in R zeigt nochmal einen großen Überblick. Im Kapitel zu den Verteilungen findest du dann auch nochmal mehr Informationen zu den einzelnen Funktionen.
Fangen wir aber einmal mit der einfachen Funktion für die Normalverteilung an. Hier genieren wir uns also einmal fünf Beobachtungen aus einer Normalverteilung. Wir brauchen dafür die Fallzahl (n
), die wir generieren wollen. Dann den Mittelwert der theoretischen Verteilung (mean
) sowie die Streuung (sd
). Dann erhalten wir fünf Zahlen, die in der Gesamtheit den vorgestellten Zahlen entsprechen.
R Code [zeigen / verbergen]
rnorm(n = 5, mean = 0, sd = 1) |> round(2)
[1] 0.75 0.02 0.77 -1.17 0.39
Wenn wir jetzt den Mittelwert der fünf Zahlen berechnen, dann erhalten wir aber gar nicht einen Mittelwert von \(0\) und auch nicht eine Standardabweichung von \(1\) wieder. Wie kann das sein? Häufig stolperst du hier ein wenig. Wieso Daten generieren, wenn die Daten dann nicht die Eigenschaften haben, die wir wollen? Hier kommt die Grundgesamtheit und die Stichprobe ins Spiel. In der Grundgesamtheit hast du einen Mittelwert von \(2\) und eine Standardabweichung von \(1\) vorliegen. Du ziehst aber nur eine kleine Stichprobe wie ich dir einmal in der folgenden Abbildung zeige. Zwar liegt der theoretische Mittelwert auf der Null, aber die Mittelwerte der einzelnen Simulationen können stark variieren.
Der Zusammenhang wird dir vielleicht dann nochmal in der folgenden Abbildung klarer. Ich habe hier einmal eine kleine Simulation laufen lassen. Dabei habe ich immer Daten aus einer Standardnormalverteilung mit einem Mittelwert von \(0\) und einer Standardabweichung von \(1\) generiert. Was ich dabei geändert habe ist die Fallzahl. Wenn ich nur zwei Beobachtungen generiere, dann finde ich eine große Breite an beobachteten Mittlwerten. Wenn ich die Fallzahl erhöhe, dann komme ich immer näher an den erwarteten Mittelwert in meinen beobachteten Daten heran. Bei eintausend Beobachtungen habe ich faktisch kaum noch eine Abweichung vorliegen. Hier siehst du eben, es kommt auch stark auf die Fallzahl an. Wenn du dir zu wenig Beobachtungen anschaust, dann wirst du nicht immer den theoretischen Mittelwert oder Effekt in den generierten Daten wiederfinden.
Welche Effekte gibt es?
Effekt und Streuung
Einschränkungen bei der Generierung
Wenn wir über die Simulation von Daten sprechen, dann kommen wir nicht darum herum einmal über die schrecklich nette Familie der Verteilungen zu sprechen. Wir haben ja nicht nur auf der rechten Seite der Tilde unsere Einflussvariablen, die entweder Faktoren oder Kovariaten sind, sondern auch die Messwerte, die wir simulieren wollen. Diese Messwerte gehören aber einer Verteilungsfamilie an. Zwar ist die Normalverteilung (eng. gaussian) sehr häufig aber können wir mit der Normalverteilung nicht alle Messwerte abbilden. Daher brauchen wir auch die anderen Verteilungen. Daher hier einmal di Übersicht für dich. Das R Paket {simstudy}
hat eine Vielzahl an Verteilungen implementiert auf die wir hier nicht tiefer eingehen werden.
Wir konzentrieren uns hier nur auf einen kleinen Teil der möglichen Simulationen und Datengenerierungen. Das hat neben der vielen möglichen Verteilungen auch den Grund, dass wir usn hier ja nicht mit der algorithmischen Modellentwicklung in der Statistik beschäftigen wollen. Wir wollen ja nicht neue Algorithmen bauen und diese dann auf Daten evaluieren. Daher konzentrieren wir uns hier auf wenige Verteilungen, die dann aber das abbilden, was wir häufig brauchen.
- Die Normalverteilung erlaubt uns das Frischegewicht, Trockengewicht oder aber Chlorophyllgehalt zu simulieren. Also im Prinzip die Messwerte, die wir hauptsächlich in einem agrawissenschaftlichen Umfeld erheben.
- Die Possionverteilung erlaubt uns alles was wir Zählen zu simulieren. Also im Prinzip alle Anzahlen von Schädlingen oder aber Blütenstände sowie Blättern. Wir zählen hier eben etwas.
- Die Ordinalverteilung ist dafür gut, wenn wir Noten simulieren wollen. Daher brauchen wir die Ordinalverteilung um unsere Boniturnoten zu generieren. Prinzipiell aber auch die Antwortverteilungen in einem Fragebogen.
- Die Binomialverteilung ist die Verteilung, die wir nutzen, wenn wir nur zwei mögliche Messwerte haben. Also im prinzip gesunde Beobachtung oder kranke Beobachtung. Wir haben nur zwei Ausprägungen in dem Messwert vorliegen.
Neben den vorgestellten Verteilungen schauen wir uns dann noch die Simulation von pseudo Zeitreihen an. Wir haben hier dann verschiedene Messwerte über einen zeitlichen Verlauf vorliegen. Teilweise dann in einer etwas wirren Form, da wir eventuell keinen linearen Zusammenhang mehr vorliegen haben. Daher müssen wir dann hier etwas mehr schauen, dass wir die Daten gut simuliert kriegen.
Dann mache ich hier noch die Einschränkung, dass ich prinzipiell alles unter der Annahme der Varianzhomogenität generiere. Daher addiere ich über alle Faktorkombinationen oder Gruppen immer den gleichen Fehler auf. Im Prinzip kannst du natürlich auch für einzelne Faktorkombinationen dann einen anderen Fehler addieren und dir dafür einen Vektor mit unterschiedlichen Fehlertermen bauen, aber darauf gehe ich nur einmal kurz bei dem einfakoriellen Design ein.
Theoretische Verteilung vs. selbst gebaute Verteilung
Wilcoxon is (almost) a one-sample t-test on signed ranks
R Code [zeigen / verbergen]
<- tibble(y = c(rnorm(10000),
own_dist_tbl exp(rnorm(10000)),
runif(10000, min=-3, max=-2)))
Welche Möglichkeiten gibt es eigentlich?
Wenn wir Daten generieren wollen, dann haben wir im Prinzip zwei Möglichkeiten. Wir bauen uns die Daten selber per Hand in Excel oder aber nutzen die entsprechenden R Pakete. Ich stelle hier die zwei größeren R Pakete vor sowie die Lösungen per Hand in Excel. Wir haben natürlich auch die Möglichkeit die Daten in R ohne Pakete zu erstellen. Das macht in einem einfacheren Setting auch mehr Sinn.
- Das R Paket
{simstudy}
liefert eigentlich alles was wir brauchen, wenn die Daten komplizierter werden. Insbesondere wenn wir keinen normlaverteilten Messwert vorliegen haben oder aber abhängige Einflussvariablen. Wenn ich größere Datensätze generiere, dann nutze ich gerne dieses Paket. Hier gibt es aber die Einschränkung, dass sich faktorielle Experimente nicht gut darstellen lassen. In diesem Fall ist die händsiche Erstellung manchmal einfacher. - Das R Paket
{simdata}
hat den Vorteil große, komplexe Koreelationsstrukturen abzubilden. Wir können hier Netzwerkeffekte gut darstellen und dann auch in einen Datensatz übersetzen. Auch Transformationen von Daten lassen sich hier gut integrieren. Hier liegt aber nicht der Fokus auf einem faktoriellen Design mit Gruppeneffekten. - Wir schauen uns natürlich auch Excel an. Hier haben wir natürlich gleich die Möglichkeit uns die Daten dort zu bauen, wo wir die erhobenen Messwerte dann später nach dem durchgführten Experiment auch abspeichern. Deshalb zeige ich auch hier einmal wie wir dann die Daten händisch aufbauen.
Abschließend muss ich noch erwähnen, dass faktorielle Designs, die wir dann häufig in den Agrarwissenschaften finden, wir am besten dann händisch in R zusammenbauen. Wir nutzen dann die Funktionen, die es schon in R gibt und erstellen uns dann selber den Datensatz. Das ist im Prinzip so ähnlich wie in Excel nur das wir etwas besser nachvollziehbare Wege haben.
Wir immer geht natürlich mehr als ich hier Vorstellen kann. Du findest im Folgenden Tutorien, die mich hier in dem Kapitel inspiriert haben. Ich habe mich ja in diesem Kapitel auf die Durchführbarkeit in R und die allgemeine Verständlichkeit konzentriert.
- Einen guten Überblick liefert Brad Duthie in seinem Tutorium Creating simulated data sets in R. Hier kannst du dich dann nochmal in die Grundlagen einlesen.
- Auch Excel kann künstliche Daten generieren. Dafür schaue ich dann immer in die statistischen Funktionen (Referenz) Seite nach. Die Seite ist leider etwas schwer zu lesen.
- Getting started simulating data in R: some helpful functions and how to use them gibt nochmal einen guten Überblick über die Standardfunktionen in R um sich schnell Daten zu generieren.
- The distribution zoo sowie Probability Distributions in R oder aber auch Plotting Continuous Probability Distributions In R With ggplot2 gben nochmal einen Einblick in die Verteilungen. Dabei würde ich den Distribution Zoo als Shiny App erstmal vorziehen. Die anderen beiden Quelle liefern nochmal mehr mathematischen Hintergrund.
21.2 Genutzte R Pakete
Wir wollen folgende R Pakete in diesem Kapitel nutzen.
R Code [zeigen / verbergen]
::p_load(tidyverse, simstudy, simdata, modelr,
pacman
ggpmisc, janitor, conflicted)set.seed(20250820)
conflicts_prefer(ggplot2::annotate)
An der Seite des Kapitels findest du den Link Quellcode anzeigen, über den du Zugang zum gesamten R-Code dieses Kapitels erhältst.
21.3 Simulationen
Dormann (2013)
21.3.1 Normalverteilter Messwert
Einfaktoriell \(f_A\) mit 2 Leveln
R Code [zeigen / verbergen]
<- tibble("1" = rnorm(5, 3, 0.001),
fac1_tbl "2" = rnorm(5, 6, 0.001)) |>
gather(key = "f_a", value = "y")
R Code [zeigen / verbergen]
lm(y ~ f_a, fac1_tbl) |> coef() |> round(2)
(Intercept) f_a2
3 3
R Code [zeigen / verbergen]
<- tibble("1" = rnorm(5, 3, 5),
fac1_tbl "2" = rnorm(5, 6, 1)) |>
gather(key = "f_a", value = "y")
Einfaktoriell \(f_A\) mit >2 Leveln
R Code [zeigen / verbergen]
<- tibble("1" = rnorm(5, 2, 0.001),
fac1_tbl "2" = rnorm(5, 6, 0.001),
"3" = rnorm(5, 4, 0.001)) |>
gather(key = "f_a", value = "y")
R Code [zeigen / verbergen]
<- tibble(f_a = gl(3, 5, labels = c("1", "2", "3")),
fac1_tbl eff_a = rep(c(2, 6, 4), each = 5),
error = rnorm(length(f_a), 0, 0.001),
y = eff_a + error)
Die Erstellung von Daten in Excel ist nicht für die wissenschaftliche Bewertung von Algorithmen sinnvoll und angebracht. Wir nutzen hier Excel um recht einfach uns zufällig Daten zu erstellen. Wir nutzen dann die künstlichen Exceldaten um unsere Analyse für unsere echten experimentelle Daten zu üben. Auch ist die vereinfachte Erstellung von künstlichen Daten in Excel hilfreich um die zugrundeliegende Konzepte nochmal zu verstehen.
R Code [zeigen / verbergen]
<- read_excel("data/data_generation_excel.xlsx",
excel_fac1_tbl sheet = "einfaktoriell") |>
clean_names() |>
mutate(faktor_a = as_factor(faktor_a))
R Code [zeigen / verbergen]
lm(messwert ~ faktor_a, data = excel_fac1_tbl) |>
coef() |> round()
(Intercept) faktor_a2 faktor_a3
7 2 -1
R Library Contrast Coding Systems for categorical variables
Treatment coding mit contr.treatment
(default)
R Code [zeigen / verbergen]
lm(y ~ f_a, fac1_tbl, contrasts = list(f_a = "contr.treatment")) |>
coef() |> round(2)
(Intercept) f_a2 f_a3
2 4 2
Zweifaktoriell ohne Interaktion \(f_A + f_B\)
R Code [zeigen / verbergen]
<- tibble(f_a = rep(gl(3, 5), 2),
fac2_nointer_tbl f_b = gl(2, 15),
y = 2 +
2 * as.numeric(f_a) +
3 * as.numeric(f_b) +
rnorm(15, 0, 0.001))
R Code [zeigen / verbergen]
lm(y ~ f_a + f_b, fac2_nointer_tbl) |>
coef() |> round(2)
(Intercept) f_a2 f_a3 f_b2
7 2 4 3
Zweifaktoriell mit Interaktion \(f_A + f_B + f_A \times f_B\)
R Code [zeigen / verbergen]
<- expand_grid(f_a = 1:3, f_b = 1:2, rep = 1:5) |>
fac2_tbl mutate(f_a = as_factor(f_a),
f_b = as_factor(f_b))
R Code [zeigen / verbergen]
<- fac2_tbl |>
fac2_mat model_matrix(~ f_a * f_b) |>
as.matrix()
R Code [zeigen / verbergen]
<- c(intercept = 7,
eff_vec f_a2 = 2, f_a3 = 4, f_b2 = 3,
f_a2xf_b2 = 0, f_a3xf_b2 = -6)
R Code [zeigen / verbergen]
<- fac2_mat %*% eff_vec eff
R Code [zeigen / verbergen]
<- fac2_tbl |>
fac2_inter_tbl mutate(y = eff + rnorm(length(eff), 0, 0.001))
Wenn du jetzt noch Varianzheterogenität haben möchtest, dann müsstest du dir einen Vektor mit den verschiedenen Aufrufen der Funktion rnorm()
für die jeweiligen Faktorkombinationen bauen. Hier wären es dann bei sechs Faktorkombinationen eben sechsmal rnorm()
mit jeweils fünf Beobachtungen als Anzahl der Wiederholungen.
Die Erstellung von Daten in Excel ist nicht für die wissenschaftliche Bewertung von Algorithmen sinnvoll und angebracht. Wir nutzen hier Excel um recht einfach uns zufällig Daten zu erstellen. Wir nutzen dann die künstlichen Exceldaten um unsere Analyse für unsere echten experimentelle Daten zu üben. Auch ist die vereinfachte Erstellung von künstlichen Daten in Excel hilfreich um die zugrundeliegende Konzepte nochmal zu verstehen.
R Code [zeigen / verbergen]
<- read_excel("data/data_generation_excel.xlsx",
excel_fac2_tbl sheet = "zweifaktoriell") |>
clean_names() |>
mutate(faktor_a = as_factor(faktor_a),
faktor_b = as_factor(faktor_b))
Die Zahlen kommen jetzt nicht perfekt hin, da ich hier mit einer Standardabweichung von 2 eine recht hohe Streuung gewählt habe. Darüber hinaus habe ich dann auch sehr wenige Beobachtungen gebaut. Deshalb passt der Intercept nicht ganz, den der Intercept müsste eigentlich 10 sein und nicht 9. Daher stimmen dann auch die anderen Effekt nicht perfekt.
R Code [zeigen / verbergen]
lm(messwert ~ faktor_a * faktor_b, data = excel_fac2_tbl) |>
coef() |> round()
(Intercept) faktor_a2 faktor_a3 faktor_b2
9 5 2 2
faktor_a2:faktor_b2 faktor_a3:faktor_b2
-4 -6
Einkovariat \(c_1\)
R Code [zeigen / verbergen]
<- tibble(c_1 = rnorm(10, 0, 1),
cov1_tbl y = 2 +
2 * c_1 +
rnorm(10, 0, 0.001))
Zweikovariat unabhängig \(c_1 + c_2\)
R Code [zeigen / verbergen]
<- tibble(c_1 = rnorm(10, 0, 1),
cov2_tbl c_2 = rnorm(10, 0, 1),
y = 2 +
1 * c_1 +
2 * c_2 +
rnorm(10, 0, 0.001))
R Code [zeigen / verbergen]
lm(y ~ c_1 + c_2, cov2_tbl) |>
coef() |> round(2)
(Intercept) c_1 c_2
2 1 2
Zweikovariat abhängig \(c_1 + c_2\)
Komplexere Modelle
NORM.INV(ZUFALLSZAHL(); 0; 5)