Lineartransformation, Standardisierung und Korrelation
Beantwortet so kurz wie möglich und nur so ausführlich wie nötig die folgenden offenen Fragen.
Was bedeutet es, wenn es heisst, dass die Standardabweichung und der Mittelwert einer Variablen «skalenabhängig» sind?
Erklären Sie, was eine z-Transformation ist und warum sie in der Statistik verwendet wird.
In einem anderen Semester wurden Studierende nach ihrer Mediennutzungsdauer (in Minuten pro Tag) gefragt. Das Ergebnis: Mittelwert = 180, Standardabweichung = 30. Alex nutzt täglich 240 Minuten Medien. Berechnen Sie den z-Wert für Alex.
Warum bedeutet eine hohe Korrelation zwischen zwei Variablen nicht automatisch, dass eine kausale Beziehung besteht? Geben Sie ein Beispiel aus der Medienforschung.
Sie berechnen eine Pearson-Korrelation von 𝑟 = −0.25 zwischen der Nutzungsdauer sozialer Medien und der Schlafqualität. Wie interpretieren Sie dieses Ergebnis inhaltlich?
Wie nennt man im Zusammenhang mit Korrelationen eine Drittvariable, die dazu führt, dass eine bivariate Korrelation zweier Variablen grösser oder kleiner ausfällt als der tatsächliche Zusammenhang?
In einer kleinen Erhebung wurde mit drei verschiedenen Fragen unterschiedlicher Skalierung dasselbe gemessen. Vervollständigen Sie den folgenden Code und beantworten Sie die Frage, mit welcher Frageform der relativ gesehen kleinste und mit welcher der grösste Durchschnitt erreicht wird.
In einer kleinen Erhebung wurde mit drei verschiedenen Fragen unterschiedlicher Skalierung dasselbe gemessen. Vervollständigen Sie den folgenden Code und beantworten Sie die Frage, mit welcher Frageform der relativ gesehen kleinste und mit welcher der grösste Durchschnitt erreicht wird.
library(tidyverse)
DATEN <- tibble::tibble(
dummy = c(0, 1, 0, 0, 1, 1, 1, 1, 0, 0),
likert5 = c(3, 3, 4, 2, 5, 5, 3, 4, 2, 3),
likert7 = c(4, 3, 5, 7, 2, 1, 6, 5, 4, 2),
)
DATEN |>
mutate(dummy_s = dummy / 1,
likert5_s = (likert5 - 1) / 4, # Skala verschieben und stauchen
likert7_s = (likert7 - 1) / 6) |> # Skala verschieben und stauchen
summarise(dummy_m = mean(dummy_s),
likert5_s = mean(likert5_s),
likert7_s = mean(likert7_s))
In einer kleinen Erhebung wurde mit drei verschiedenen Fragen unterschiedlicher Skalierung dasselbe gemessen. Vervollständigen Sie den folgenden Code und beantworten Sie die Frage, mit welcher Frageform der relativ gesehen kleinste und mit welcher der grösste Durchschnitt erreicht wird.
library(tidyverse)
DATEN <- tibble::tibble(
dummy = c(0, 1, 0, 0, 1, 1, 1, 1, 0, 0),
likert5 = c(3, 3, 4, 2, 5, 5, 3, 4, 2, 3),
likert7 = c(4, 3, 5, 7, 2, 1, 6, 5, 4, 2),
)
DATEN |>
mutate(dummy_s = dummy / 1,
likert5_s = (likert5 - 1) / 4, # Skala verschieben und stauchen
likert7_s = (likert7 - 1) / 6) |> # Skala verschieben und stauchen
summarise(dummy_m = mean(dummy_s),
likert5_s = mean(likert5_s),
likert7_s = mean(likert7_s))
# A tibble: 1 × 3
dummy_m likert5_s likert7_s
<dbl> <dbl> <dbl>
1 0.5 0.6 0.483
MC 5.1: Sind folgende Aussagen richtig oder falsch?
MC_5_1 = [
["Nach einer z-Transformation haben alle Variablen den Mittelwert 1.", "falsch"],
["Eine z-Transformation ändert nicht die Korrelation zwischen Variablen.", "richtig"],
["Zentrierung einer Variablen und z-Tranformation sind dasselbe.", "falsch"],
["Dummyvariablen können auch standardisiert werden.", "richtig"]
]
viewof answers_5_1 = quizInput({
questions: MC_5_1,
options: ["richtig", "falsch"]
})
Punkte_5_1 = {
const Sum =
(answers_5_1[0] == MC_5_1[0][1])*1 +
(answers_5_1[1] == MC_5_1[1][1])*1 +
(answers_5_1[2] == MC_5_1[2][1])*1 +
(answers_5_1[3] == MC_5_1[3][1])*1
var Punkte_5_1 = Sum - 2
if (Punkte_5_1 < 1) {Punkte_5_1 = 0}
return(Punkte_5_1)
}
Punkte:
MC 5.2: Sind folgende Aussagen richtig oder falsch?
MC_5_2 = [
["Ein z-Wert von 2 bedeutet, dass eine Beobachtung genau doppelt so gross ist wie der Mittelwert.", "falsch"],
["Ein z-Wert kann niemals negativ sein.", "falsch"],
["z-Werte helfen dabei, Werte über verschiedene Skalen hinweg zu vergleichen.", "richtig"],
["Nach der z-Transformation mehrerer Variablen können deren Mittelwerte gut verglichen werden.", "falsch"]
]
viewof answers_5_2 = quizInput({
questions: MC_5_2,
options: ["richtig", "falsch"]
})
Punkte_5_2 = {
const Sum =
(answers_5_2[0] == MC_5_2[0][1])*1 +
(answers_5_2[1] == MC_5_2[1][1])*1 +
(answers_5_2[2] == MC_5_2[2][1])*1 +
(answers_5_2[3] == MC_5_2[3][1])*1
var Punkte_5_2 = Sum - 2
if (Punkte_5_2 < 1) {Punkte_5_2 = 0}
return(Punkte_5_2)
}
Punkte:
MC 5.3: Welche Aussagen zur Pearson-Korrelation (r) sind korrekt?
MC_5_3 = [
["r setzt voraus, dass beide Variablen auf mindestens ordinalem Niveau gemessen wurden.", "falsch"],
["r setzt voraus, dass beide Variablen metrisch skaliert sind.", "richtig"],
["r kann auch für Dummyvariablen verwendet werden.", "richtig"],
["r misst lineare Zusammenhänge zwischen zwei Variablen.", "richtig"]
]
viewof answers_5_3 = quizInput({
questions: MC_5_3,
options: ["richtig", "falsch"]
})
Punkte_5_3 = {
const Sum =
(answers_5_3[0] == MC_5_3[0][1])*1 +
(answers_5_3[1] == MC_5_3[1][1])*1 +
(answers_5_3[2] == MC_5_3[2][1])*1 +
(answers_5_3[3] == MC_5_3[3][1])*1
var Punkte_5_3 = Sum - 2
if (Punkte_5_3 < 1) {Punkte_5_3 = 0}
return(Punkte_5_3)
}
Punkte:
MC 5.4: Sind folgende Aussagen richtig oder falsch?
MC_5_4 = [
["Eine hohe Korrelation zwischen Fernsehzeit und Wahlbeteiligung bedeutet, dass Fernsehen zur Wahlmotivation führt.", "falsch"],
["Eine negative Korrelation bedeutet, dass beide Variablen sich tendenziell entgegengesetzt verändern.", "richtig"],
["Die Pearson-Korrelation kann Werte grösser als 1 annehmen.", "falsch"],
["Eine Korrelation von 0 bedeutet, dass kein Zusammenhang besteht.", "falsch"]
]
viewof answers_5_4 = quizInput({
questions: MC_5_4,
options: ["richtig", "falsch"]
})
Punkte_5_4 = {
const Sum =
(answers_5_4[0] == MC_5_4[0][1])*1 +
(answers_5_4[1] == MC_5_4[1][1])*1 +
(answers_5_4[2] == MC_5_4[2][1])*1 +
(answers_5_4[3] == MC_5_4[3][1])*1
var Punkte_5_4 = Sum - 2
if (Punkte_5_4 < 1) {Punkte_5_4 = 0}
return(Punkte_5_4)
}
Punkte:
SC 5.5: Ab welchem Skalenniveau können Korrelationen verwendet werden? Die Skalenniveaus sind nicht aufsteigend geordnet.”
SC_5_5 = [
[
"ordinal",
"kategorial",
"dichotom",
"interval",
"rational"
],
3 // Index der richtigen Antwort
]
viewof answer_SC_5_5 = singleChoiceInput({
options: SC_5_5[0],
correctIndex: SC_5_5[1]
})
Punkte_SC_5_5 = {
const correctIndex = SC_5_5[1];
return answer_SC_5_5 === correctIndex ? 1 : 0;
}
Punkte:
TRT 5.6: Setzen Sie den richtigen Befehl ein, um die Variable standardisierte Variable E201_02_z zu erhalten (Tipp: mean, sd, corr, var, sqrt, scale, !is.na, standz, z_trans)..
TRT_5_6 = [
`DATEN <- DATEN |>
mutate(E201_02_m = mean(E201_02, na.rm = TRUE),
E201_02_z = (E201_02 - E201_02_m)/{{input}}(E201_02, na.rm = TRUE))`, // Text
" ", // Placeholder
"sd", // Correct Text
"monospace", // Font Family
"#0000FF" // Color
];
viewof answer_TRT_5_6 = textReplacementWithText({
text: TRT_5_6[0],
placeholder: TRT_5_6[1],
correctText: TRT_5_6[2],
fontFamily: TRT_5_6[3],
color: TRT_5_6[4]
});
TRT 5.7. Setzen Sie den richtigen Befehl ein, um die E201_02 zu zentrieren (Tipp: Mögliche NA sollen ignoriert werden. Möglichkeiten: mean, sd, corr, var, sqrt, scale, !is.na, na.rm = TRUE, na.rm = FALSE).
TRT_5_7 = [
`DATEN <- DATEN |>
mutate(E201_02_z = E201_02 - {{input}})`, // Text
"", // Placeholder
"mean(E201_02, na.rm = TRUE)", // Correct Text
"monospace", // Font Family
"#0000FF" // Color
];
viewof answer_TRT_5_7 = textReplacementWithText({
text: TRT_5_7[0],
placeholder: TRT_5_7[1],
correctText: TRT_5_7[2],
fontFamily: TRT_5_7[3],
color: TRT_5_7[4]
});
TRT 5.8. Setzen Sie den richtigen Befehl ein, um die pearsonsche Korrelation zwischen E201_02 und E201_08 zu erhalten (Tipp: mean, sd, var, sqrt, scale, !is.na, cor, z_trans).
TRT_5_8 = [
`DATEN |>
select(E201_02, E201_08) |>
filter(!is.na(E201_02) & !is.na(E201_08)) |>
{{input}}()`, // Text
" ", // Placeholder
"cor", // Correct Text
"monospace", // Font Family
"#0000FF" // Color
];
viewof answer_TRT_5_8 = textReplacementWithText({
text: TRT_5_8[0],
placeholder: TRT_5_8[1],
correctText: TRT_5_8[2],
fontFamily: TRT_5_8[3],
color: TRT_5_8[4]
});
MC 5.9: Sie haben in R folgende Pipe geschrieben:
Sie bekommen daraufhin die Fehlermeldung: Error: object 'Daten' not found
. Was könnte der Fehler sein und wie könnten sie ihn beheben?
MC_5_9 = [
["Der Datensatz wird anders geschrieben.", "richtig"],
["Die Daten wurden nicht richtig geladen.", "richtig"],
["Ich korrigiere die Bezeichnung des Datenobjekts (links vom <-).", "falsch"],
["Ich ergänze beim filter na.rm = TRUE", "falsch"]
]
viewof answers_5_9 = quizInput({
questions: MC_5_9,
options: ["richtig", "falsch"]
})
Punkte_5_9 = {
const Sum =
(answers_5_9[0] == MC_5_9[0][1])*1 +
(answers_5_9[1] == MC_5_9[1][1])*1 +
(answers_5_9[2] == MC_5_9[2][1])*1 +
(answers_5_9[3] == MC_5_9[3][1])*1
var Punkte_5_9 = Sum - 2
if (Punkte_5_9 < 1) {Punkte_5_9 = 0}
return(Punkte_5_9)
}
Punkte:
MC 5.10: Sie haben in R folgende Pipe geschrieben:
Sie bekommen daraufhin die Fehlermeldung: Error: Incomplete expression:
. Was könnte der Fehler sein und wie könnten sie ihn beheben?
MC_5_10 = [
["Der Name des Datensatzes ist unvollständig.", "falsch"],
["Die Funktion 'summarise' ist falsch geschrieben.", "falsch"],
["Am Ende ist ein Pipe-Operator zu viel.", "richtig"],
["Ich muss den letzten Pipe-Operator löschen.", "richtig"]
]
viewof answers_5_10 = quizInput({
questions: MC_5_10,
options: ["richtig", "falsch"]
})
Punkte_5_10 = {
const Sum =
(answers_5_10[0] == MC_5_10[0][1])*1 +
(answers_5_10[1] == MC_5_10[1][1])*1 +
(answers_5_10[2] == MC_5_10[2][1])*1 +
(answers_5_10[3] == MC_5_10[3][1])*1
var Punkte_5_10 = Sum - 2
if (Punkte_5_10 < 1) {Punkte_5_10 = 0}
return(Punkte_5_10)
}
Punkte:
MC 5.11: Sie haben in R folgende Pipe geschrieben:
Sie bekommen daraufhin die Fehlermeldung: Error: unexpected symbol in: ...
. Was könnte der Fehler sein und wie könnten sie ihn beheben?
MC_5_11 = [
["Die Funktion 'summarise' muss 'summarize' geschrieben werden.", "falsch"],
["Vor 'na.rm' fehlt ein Komma.", "richtig"],
["Bei select fehlt eine Klammer.", "falsch"],
["Die Variable E201_02 existiert nicht.", "falsch"]
]
viewof answers_5_11 = quizInput({
questions: MC_5_11,
options: ["richtig", "falsch"]
})
Punkte_5_11 = {
const Sum =
(answers_5_11[0] == MC_5_11[0][1])*1 +
(answers_5_11[1] == MC_5_11[1][1])*1 +
(answers_5_11[2] == MC_5_11[2][1])*1 +
(answers_5_11[3] == MC_5_11[3][1])*1
var Punkte_5_11 = Sum - 2
if (Punkte_5_11 < 1) {Punkte_5_11 = 0}
return(Punkte_5_11)
}
Punkte:
Punkte_5_max = 10
Punkte_5_Gesamt = Punkte_5_1 + Punkte_5_2 + Punkte_5_3 + Punkte_5_2
Prozent_5_Gesamt = round(100*Punkte_5_Gesamt/Punkte_5_max, 0)
Note_5_grob = round((round(Punkte_5_Gesamt/Punkte_5_max,1)*10+2)/2, 1)
round = (n, places) => {
if (!places) return Math.round(n);
const d = 10 ** places;
return Math.round(n * d) / d;
}
function textReplacementWithText({ text, placeholder, correctText, fontFamily = "monospace", color = "#000000" }) {
const parts = text.split(/\{\{input\}\}/); // Teilt den Text an den Eingabestellen
const root = htl.html`<div style="font-size: HUGE; margin-top: -40; margin-bottom: -40; margin-left: -50px; line-height: 1.8; font-family: ${fontFamily}; color: ${color}; white-space: pre-wrap; text-indent: 0; display: flex; align-items: baseline;">
<div style="flex: 1;">
${parts.map((part, index) =>
htl.html`${part}${index < parts.length - 1 ? htl.html`<span style="display: inline-flex; align-items: baseline;">
<input
type="text"
placeholder="${placeholder}"
style="padding: 3px; font-size: HUGE; border: 1px solid #ccc; margin-left: 35px; border-radius: 4px; width: calc(${correctText.length}ch + 1em); font-family: ${fontFamily}; color: ${color}; text-align: right; box-sizing: border-box; margin-right: 0.2em;"
oninput=${(e) => {
const feedbackElement = root.querySelector(`#feedback-final`);
const allInputsCorrect = Array.from(root.querySelectorAll("input")).every((input) => input.value.trim() === correctText.trim());
if (allInputsCorrect) {
feedbackElement.textContent = "💚";
feedbackElement.style.color = "green";
} else {
feedbackElement.textContent = "🔴";
feedbackElement.style.color = "red";
}
}}
/></span>` : ""}`
)}
</div>
<span id="feedback-final" style="font-weight: bold; font-size: HUGE; margin-left: 0.5em; color: inherit;"></span>
</div>`;
return root;
}
function textReplacementTask({ placeholder, correctText, width = "300px", fontFamily = "monospace", color = "black" }) {
let enteredText = "";
const root = htl.html`<div style="font-size: 14px; line-height: 1.5; margin-bottom: 20px;">
<h4>Bitte ersetzen Sie den Text:</h4>
<!-- Eingabefeld -->
<div style="display: flex; align-items: center;">
<input
type="text"
placeholder="${placeholder}"
style="padding: 5px; font-size: 14px; border: 1px solid #ccc; border-radius: 4px; width: ${width}; font-family: ${fontFamily}; color: ${color};"
onInput=${(e) => {
enteredText = e.target.value;
root.value = enteredText;
root.dispatchEvent(new CustomEvent("input"));
updateFeedback();
}}
/>
<!-- Feedback -->
<div id="feedback" style="font-weight: bold; font-size: 14px; margin-left: 10px; text-align: left; white-space: nowrap; color: inherit;"></div>
</div>
</div>`;
// Funktion zur Aktualisierung des Feedbacks
function updateFeedback() {
const feedbackElement = root.querySelector("#feedback");
if (enteredText.trim() === correctText.trim()) {
feedbackElement.textContent = "💚";
feedbackElement.style.color = "green";
} else if (enteredText.trim() === "") {
feedbackElement.textContent = "";
} else {
feedbackElement.textContent = "🔴";
feedbackElement.style.color = "red";
}
}
root.value = null;
return root;
}
function singleChoiceInput({ options, correctIndex }) {
let selectedAnswer = null;
const root = htl.html`<div style="font-size: HUGE; line-height: 1.5; margin-bottom: 0px;">
<!-- Antworten -->
<div style="display: grid; row-gap: 12px;">
${options.map(
(option, index) =>
htl.html`<div style="display: flex; align-items: center;">
<!-- Radiobutton und Option -->
<label style="display: flex; align-items: center; padding-left: 4pt; font-weight: normal;">
<input
type="radio"
name="singleChoice"
value=${index}
style="margin-right: 10px;"
onChange=${() => {
selectedAnswer = index;
root.value = selectedAnswer;
root.dispatchEvent(new CustomEvent("input"));
updateFeedback();
}}
/>
<span>${option}</span>
</label>
<!-- Feedback -->
<div id="feedback-${index}" style="font-weight: bold; font-size: 14px; margin-left: 10px; text-align: left; white-space: nowrap; color: inherit;"></div>
</div>`
)}
</div>
</div>`;
// Funktion zur Aktualisierung des Feedbacks
function updateFeedback() {
options.forEach((_, index) => {
const feedbackElement = root.querySelector(`#feedback-${index}`);
if (selectedAnswer === index) {
feedbackElement.textContent =
index === correctIndex ? "💚" : "🔴";
feedbackElement.style.color = index === correctIndex ? "green" : "red";
} else {
feedbackElement.textContent = ""; // Löscht Feedback für nicht ausgewählte Optionen
}
});
}
root.value = null;
return root;
}
function quizInput({ questions, options}) {
let answers = questions.map(() => null);
let root = htl.html`<div
style="
display: grid;
grid-template-columns: 10% 10% 70% 10%;"
>
${options.map(
(opt) => htl.html`<div style="font-weight: bold; font-size: HUGE">${opt}</div>`
)}
<div style="font-weight: bold">Aussagen</div>
<div style="font-weight: bold"></div>
${Array.from(questions.entries(), ([i, [question, correct]]) =>
quizInputRow({
question,
options,
correct,
onChange: (newAnswer) => {
answers[i] = newAnswer;
root.value = answers;
root.dispatchEvent(new CustomEvent("input"));
}
})
)}
</div>`;
root.value = answers;
return root;
}
function quizInputRow({
question,
options,
correct,
onChange = () => {}
}) {
let root = htl.html`<div>`;
function setAnswer(answer, initial = false) {
morph(
root,
htl.html`<div style="display: contents">
<form style="display: contents">
${options.map(
(opt) =>
htl.html`<label> </label>
<input
name=${question}  
type="radio"
value="${opt}"
checked=${opt === answer}
onChange=${() => setAnswer(opt)}
>
</input>`
)}
</form>
<div>${question}</div>
<div>   ${
answer === null ? "" : answer === correct ? "💚" : "🔴"
}</div>
</div>`
);
root.value = answer;
if (!initial) {
root.dispatchEvent(new CustomEvent("input"));
onChange(answer);
}
}
setAnswer(null, true);
return root;
}
morph = require("https://bundle.run/nanomorph@5.4.2")
Laden Sie sich die Datei Dritte-Hausaufgabe.qmd herunter.
Öffnen Sie Ihr Projekt (über die «KW-Statistik-E-Projekt.Rproj»).
Gehen Sie rechts (meistens unten) auf «Files» und klicken dort auf «Dritte-Hausaufgabe.qmd» (Youtube Tutorial).
Arbeiten Sie sich durch die Datei
Ablauf etwa gleich wie letztes Mal:
Gerne könnt ihr auch im Forum Feedback geben!
Bis nächste Woche!