You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
448 lines
18 KiB
448 lines
18 KiB
{
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2,
|
|
"metadata": {
|
|
"colab": {
|
|
"name": "lesson_1-R.ipynb",
|
|
"provenance": [],
|
|
"collapsed_sections": [],
|
|
"toc_visible": true
|
|
},
|
|
"kernelspec": {
|
|
"name": "ir",
|
|
"display_name": "R"
|
|
},
|
|
"language_info": {
|
|
"name": "R"
|
|
},
|
|
"coopTranslator": {
|
|
"original_hash": "c18d3bd0bd8ae3878597e89dcd1fa5c1",
|
|
"translation_date": "2025-09-04T01:34:22+00:00",
|
|
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
|
|
"language_code": "de"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [],
|
|
"metadata": {
|
|
"id": "YJUHCXqK57yz"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Einführung in die Regression - Lektion 1\n",
|
|
"\n",
|
|
"#### Einordnung in den Kontext\n",
|
|
"\n",
|
|
"✅ Es gibt viele Arten von Regressionsmethoden, und welche du wählst, hängt von der Frage ab, die du beantworten möchtest. Möchtest du beispielsweise die wahrscheinliche Körpergröße einer Person in einem bestimmten Alter vorhersagen, würdest du `lineare Regression` verwenden, da du nach einem **numerischen Wert** suchst. Wenn du hingegen herausfinden möchtest, ob eine bestimmte Küche als vegan betrachtet werden sollte oder nicht, suchst du nach einer **Kategorisierung**, und dafür würdest du `logistische Regression` verwenden. Mehr über logistische Regression wirst du später lernen. Überlege dir ein paar Fragen, die du an Daten stellen könntest, und welche dieser Methoden dafür am besten geeignet wäre.\n",
|
|
"\n",
|
|
"In diesem Abschnitt wirst du mit einem [kleinen Datensatz über Diabetes](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html) arbeiten. Stell dir vor, du möchtest eine Behandlung für Diabetespatienten testen. Machine-Learning-Modelle könnten dir dabei helfen, herauszufinden, welche Patienten besser auf die Behandlung ansprechen würden, basierend auf Kombinationen von Variablen. Selbst ein sehr einfaches Regressionsmodell könnte, wenn es visualisiert wird, Informationen über Variablen liefern, die dir bei der Organisation deiner theoretischen klinischen Studien helfen könnten.\n",
|
|
"\n",
|
|
"Also, lass uns mit dieser Aufgabe beginnen!\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/encouRage.jpg\"\n",
|
|
" width=\"630\"/>\n",
|
|
" <figcaption>Kunstwerk von @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"<!--<br>Kunstwerk von @allison_horst-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "LWNNzfqd6feZ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 1. Laden unseres Werkzeugkastens\n",
|
|
"\n",
|
|
"Für diese Aufgabe benötigen wir die folgenden Pakete:\n",
|
|
"\n",
|
|
"- `tidyverse`: Das [tidyverse](https://www.tidyverse.org/) ist eine [Sammlung von R-Paketen](https://www.tidyverse.org/packages), die darauf ausgelegt ist, Datenwissenschaft schneller, einfacher und unterhaltsamer zu machen!\n",
|
|
"\n",
|
|
"- `tidymodels`: Das [tidymodels](https://www.tidymodels.org/) Framework ist eine [Sammlung von Paketen](https://www.tidymodels.org/packages/) für Modellierung und maschinelles Lernen.\n",
|
|
"\n",
|
|
"Sie können sie wie folgt installieren:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
|
|
"\n",
|
|
"Das untenstehende Skript überprüft, ob Sie die für dieses Modul benötigten Pakete installiert haben, und installiert sie für Sie, falls einige fehlen.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "FIo2YhO26wI9"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"source": [
|
|
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
|
|
"pacman::p_load(tidyverse, tidymodels)"
|
|
],
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stderr",
|
|
"text": [
|
|
"Loading required package: pacman\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"id": "cIA9fz9v7Dss",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "2df7073b-86b2-4b32-cb86-0da605a0dc11"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Lassen Sie uns nun diese großartigen Pakete laden und in unserer aktuellen R-Sitzung verfügbar machen. (Dies dient nur zur Veranschaulichung, `pacman::p_load()` hat das bereits für Sie erledigt.)\n"
|
|
],
|
|
"metadata": {
|
|
"id": "gpO_P_6f9WUG"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# load the core Tidyverse packages\r\n",
|
|
"library(tidyverse)\r\n",
|
|
"\r\n",
|
|
"# load the core Tidymodels packages\r\n",
|
|
"library(tidymodels)\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "NLMycgG-9ezO"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 2. Der Diabetes-Datensatz\n",
|
|
"\n",
|
|
"In dieser Übung werden wir unsere Regressionsfähigkeiten unter Beweis stellen, indem wir Vorhersagen auf einem Diabetes-Datensatz treffen. Der [Diabetes-Datensatz](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) umfasst `442 Stichproben` mit Daten zu Diabetes, darunter 10 Prädiktorvariablen: `Alter`, `Geschlecht`, `Body-Mass-Index`, `durchschnittlicher Blutdruck` und `sechs Messungen des Blutserums` sowie eine Zielvariable `y`: ein quantitativer Messwert für den Krankheitsverlauf ein Jahr nach der Ausgangsmessung.\n",
|
|
"\n",
|
|
"|Anzahl der Beobachtungen|442|\n",
|
|
"|-------------------------|:---|\n",
|
|
"|Anzahl der Prädiktoren|Die ersten 10 Spalten sind numerische Prädiktoren|\n",
|
|
"|Zielvariable|Spalte 11 ist ein quantitativer Messwert für den Krankheitsverlauf ein Jahr nach der Ausgangsmessung|\n",
|
|
"|Informationen zu den Prädiktoren|- Alter in Jahren\n",
|
|
"||- Geschlecht\n",
|
|
"||- bmi Body-Mass-Index\n",
|
|
"||- bp durchschnittlicher Blutdruck\n",
|
|
"||- s1 tc, Gesamtserumcholesterin\n",
|
|
"||- s2 ldl, Low-Density-Lipoproteine\n",
|
|
"||- s3 hdl, High-Density-Lipoproteine\n",
|
|
"||- s4 tch, Gesamtcholesterin / HDL\n",
|
|
"||- s5 ltg, möglicherweise Logarithmus des Serumtriglyceridspiegels\n",
|
|
"||- s6 glu, Blutzuckerspiegel|\n",
|
|
"\n",
|
|
"\n",
|
|
"> 🎓 Denke daran, dies ist überwachtes Lernen, und wir benötigen eine benannte Zielvariable 'y'.\n",
|
|
"\n",
|
|
"Bevor du Daten mit R bearbeiten kannst, musst du die Daten in den Speicher von R importieren oder eine Verbindung zu den Daten herstellen, die R für den Fernzugriff auf die Daten verwenden kann.\n",
|
|
"\n",
|
|
"> Das [readr](https://readr.tidyverse.org/)-Paket, das Teil des Tidyverse ist, bietet eine schnelle und benutzerfreundliche Möglichkeit, rechteckige Daten in R einzulesen.\n",
|
|
"\n",
|
|
"Lass uns nun den Diabetes-Datensatz von der folgenden URL laden: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
|
|
"\n",
|
|
"Außerdem werden wir eine Plausibilitätsprüfung unserer Daten mit `glimpse()` durchführen und die ersten 5 Zeilen mit `slice()` anzeigen.\n",
|
|
"\n",
|
|
"Bevor wir weitermachen, möchten wir noch etwas vorstellen, das du oft in R-Code sehen wirst 🥁🥁: den Pipe-Operator `%>%`\n",
|
|
"\n",
|
|
"Der Pipe-Operator (`%>%`) führt Operationen in logischer Reihenfolge aus, indem er ein Objekt an eine Funktion oder einen Ausdruck weiterleitet. Du kannst dir den Pipe-Operator so vorstellen, als würdest du in deinem Code \"und dann\" sagen.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "KM6iXLH996Cl"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Import the data set\r\n",
|
|
"diabetes <- read_table2(file = \"https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt\")\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Get a glimpse and dimensions of the data\r\n",
|
|
"glimpse(diabetes)\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Select the first 5 rows of the data\r\n",
|
|
"diabetes %>% \r\n",
|
|
" slice(1:5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "Z1geAMhM-bSP"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"`glimpse()` zeigt uns, dass diese Daten 442 Zeilen und 11 Spalten enthalten, wobei alle Spalten den Datentyp `double` haben.\n",
|
|
"\n",
|
|
"<br>\n",
|
|
"\n",
|
|
"> `glimpse()` und `slice()` sind Funktionen aus [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, ein Teil des Tidyverse, ist eine Grammatik für Datenmanipulation, die eine konsistente Reihe von Verben bereitstellt, um die häufigsten Herausforderungen bei der Datenmanipulation zu lösen.\n",
|
|
"\n",
|
|
"<br>\n",
|
|
"\n",
|
|
"Da wir nun die Daten haben, konzentrieren wir uns auf ein Merkmal (`bmi`), das wir für diese Übung verwenden möchten. Dafür müssen wir die gewünschten Spalten auswählen. Wie machen wir das?\n",
|
|
"\n",
|
|
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) ermöglicht es uns, Spalten in einem Dataframe *auszuwählen* (und optional umzubenennen).\n"
|
|
],
|
|
"metadata": {
|
|
"id": "UwjVT1Hz-c3Z"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Select predictor feature `bmi` and outcome `y`\r\n",
|
|
"diabetes_select <- diabetes %>% \r\n",
|
|
" select(c(bmi, y))\r\n",
|
|
"\r\n",
|
|
"# Print the first 5 rows\r\n",
|
|
"diabetes_select %>% \r\n",
|
|
" slice(1:10)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "RDY1oAKI-m80"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 3. Trainings- und Testdaten\n",
|
|
"\n",
|
|
"Es ist gängige Praxis im überwachten Lernen, die Daten in zwei Teilmengen aufzuteilen: einen (in der Regel größeren) Satz, mit dem das Modell trainiert wird, und einen kleineren \"Rückhalte\"-Satz, mit dem überprüft wird, wie gut das Modell funktioniert hat.\n",
|
|
"\n",
|
|
"Da wir nun die Daten vorbereitet haben, können wir prüfen, ob eine Maschine helfen kann, eine logische Aufteilung zwischen den Zahlen in diesem Datensatz zu bestimmen. Wir können das [rsample](https://tidymodels.github.io/rsample/)-Paket verwenden, das Teil des Tidymodels-Frameworks ist, um ein Objekt zu erstellen, das die Informationen darüber enthält, *wie* die Daten aufgeteilt werden sollen. Anschließend können zwei weitere rsample-Funktionen verwendet werden, um die erstellten Trainings- und Testdatensätze zu extrahieren:\n"
|
|
],
|
|
"metadata": {
|
|
"id": "SDk668xK-tc3"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"set.seed(2056)\r\n",
|
|
"# Split 67% of the data for training and the rest for tesing\r\n",
|
|
"diabetes_split <- diabetes_select %>% \r\n",
|
|
" initial_split(prop = 0.67)\r\n",
|
|
"\r\n",
|
|
"# Extract the resulting train and test sets\r\n",
|
|
"diabetes_train <- training(diabetes_split)\r\n",
|
|
"diabetes_test <- testing(diabetes_split)\r\n",
|
|
"\r\n",
|
|
"# Print the first 3 rows of the training set\r\n",
|
|
"diabetes_train %>% \r\n",
|
|
" slice(1:10)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "EqtHx129-1h-"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 4. Trainieren eines linearen Regressionsmodells mit Tidymodels\n",
|
|
"\n",
|
|
"Jetzt sind wir bereit, unser Modell zu trainieren!\n",
|
|
"\n",
|
|
"In Tidymodels spezifizieren Sie Modelle mit `parsnip()`, indem Sie drei Konzepte angeben:\n",
|
|
"\n",
|
|
"- Der **Modelltyp** unterscheidet Modelle wie lineare Regression, logistische Regression, Entscheidungsbaum-Modelle und so weiter.\n",
|
|
"\n",
|
|
"- Der **Modus des Modells** umfasst gängige Optionen wie Regression und Klassifikation; einige Modelltypen unterstützen beide, während andere nur einen Modus haben.\n",
|
|
"\n",
|
|
"- Die **Engine des Modells** ist das rechnerische Werkzeug, das verwendet wird, um das Modell anzupassen. Oft sind dies R-Pakete, wie **`\"lm\"`** oder **`\"ranger\"`**.\n",
|
|
"\n",
|
|
"Diese Modellinformationen werden in einer Modellspezifikation erfasst, also erstellen wir eine!\n"
|
|
],
|
|
"metadata": {
|
|
"id": "sBOS-XhB-6v7"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Build a linear model specification\r\n",
|
|
"lm_spec <- \r\n",
|
|
" # Type\r\n",
|
|
" linear_reg() %>% \r\n",
|
|
" # Engine\r\n",
|
|
" set_engine(\"lm\") %>% \r\n",
|
|
" # Mode\r\n",
|
|
" set_mode(\"regression\")\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Print the model specification\r\n",
|
|
"lm_spec"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "20OwEw20--t3"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Nachdem ein Modell *spezifiziert* wurde, kann das Modell mit der [`fit()`](https://parsnip.tidymodels.org/reference/fit.html)-Funktion `geschätzt` oder `trainiert` werden, typischerweise unter Verwendung einer Formel und einiger Daten.\n",
|
|
"\n",
|
|
"`y ~ .` bedeutet, dass wir `y` als die vorhergesagte Größe/Zielvariable anpassen, erklärt durch alle Prädiktoren/Merkmale, also `.` (in diesem Fall haben wir nur einen Prädiktor: `bmi`).\n"
|
|
],
|
|
"metadata": {
|
|
"id": "_oDHs89k_CJj"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Build a linear model specification\r\n",
|
|
"lm_spec <- linear_reg() %>% \r\n",
|
|
" set_engine(\"lm\") %>%\r\n",
|
|
" set_mode(\"regression\")\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Train a linear regression model\r\n",
|
|
"lm_mod <- lm_spec %>% \r\n",
|
|
" fit(y ~ ., data = diabetes_train)\r\n",
|
|
"\r\n",
|
|
"# Print the model\r\n",
|
|
"lm_mod"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "YlsHqd-q_GJQ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Aus den Modell-Ausgaben können wir die während des Trainings gelernten Koeffizienten erkennen. Sie repräsentieren die Koeffizienten der Ausgleichsgeraden, die den geringsten Gesamtfehler zwischen der tatsächlichen und der vorhergesagten Variablen liefert.\n",
|
|
"<br>\n",
|
|
"\n",
|
|
"## 5. Vorhersagen für den Testdatensatz treffen\n",
|
|
"\n",
|
|
"Nachdem wir nun ein Modell trainiert haben, können wir es verwenden, um die Krankheitsprogression y für den Testdatensatz mithilfe von [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html) vorherzusagen. Dies wird genutzt, um die Linie zwischen den Datenclustern zu ziehen.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "kGZ22RQj_Olu"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Make predictions for the test set\r\n",
|
|
"predictions <- lm_mod %>% \r\n",
|
|
" predict(new_data = diabetes_test)\r\n",
|
|
"\r\n",
|
|
"# Print out some of the predictions\r\n",
|
|
"predictions %>% \r\n",
|
|
" slice(1:5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "nXHbY7M2_aao"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Woohoo! 💃🕺 Wir haben gerade ein Modell trainiert und es verwendet, um Vorhersagen zu treffen!\n",
|
|
"\n",
|
|
"Beim Erstellen von Vorhersagen ist es in der tidymodels-Konvention üblich, immer ein Tibble/Data-Frame mit standardisierten Spaltennamen zu erzeugen. Dies erleichtert es, die Originaldaten und die Vorhersagen in einem nutzbaren Format zu kombinieren, um sie für nachfolgende Operationen wie das Plotten zu verwenden.\n",
|
|
"\n",
|
|
"`dplyr::bind_cols()` verbindet effizient mehrere Data-Frames spaltenweise.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "R_JstwUY_bIs"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Combine the predictions and the original test set\r\n",
|
|
"results <- diabetes_test %>% \r\n",
|
|
" bind_cols(predictions)\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"results %>% \r\n",
|
|
" slice(1:5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "RybsMJR7_iI8"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 6. Modellierungsergebnisse visualisieren\n",
|
|
"\n",
|
|
"Jetzt ist es an der Zeit, dies visuell darzustellen 📈. Wir erstellen ein Streudiagramm aller `y`- und `bmi`-Werte des Testdatensatzes und verwenden dann die Vorhersagen, um eine Linie an der passendsten Stelle zwischen den Datenclustern des Modells zu zeichnen.\n",
|
|
"\n",
|
|
"R bietet mehrere Systeme zur Erstellung von Grafiken, aber `ggplot2` ist eines der elegantesten und vielseitigsten. Es ermöglicht dir, Grafiken durch **Kombination unabhängiger Komponenten** zu erstellen.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "XJbYbMZW_n_s"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Set a theme for the plot\r\n",
|
|
"theme_set(theme_light())\r\n",
|
|
"# Create a scatter plot\r\n",
|
|
"results %>% \r\n",
|
|
" ggplot(aes(x = bmi)) +\r\n",
|
|
" # Add a scatter plot\r\n",
|
|
" geom_point(aes(y = y), size = 1.6) +\r\n",
|
|
" # Add a line plot\r\n",
|
|
" geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "R9tYp3VW_sTn"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"✅ Denk mal darüber nach, was hier genau passiert. Eine gerade Linie verläuft durch viele kleine Datenpunkte, aber was macht sie eigentlich genau? Kannst du erkennen, wie du diese Linie nutzen könntest, um vorherzusagen, wo ein neuer, noch nicht gesehener Datenpunkt in Bezug auf die y-Achse des Plots liegen sollte? Versuche, den praktischen Nutzen dieses Modells in Worte zu fassen.\n",
|
|
"\n",
|
|
"Herzlichen Glückwunsch, du hast dein erstes lineares Regressionsmodell erstellt, eine Vorhersage damit gemacht und es in einem Plot dargestellt!\n"
|
|
],
|
|
"metadata": {
|
|
"id": "zrPtHIxx_tNI"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**Haftungsausschluss**: \nDieses Dokument wurde mithilfe des KI-Übersetzungsdienstes [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, weisen wir darauf hin, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als maßgebliche Quelle betrachtet werden. Für kritische Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die sich aus der Nutzung dieser Übersetzung ergeben.\n"
|
|
]
|
|
}
|
|
]
|
|
} |