Code-Erklärung zum Shiny Notebook:

t-Test für abhängige Stichproben

Struktur und Funktionen

YAML-Header

---
title: "t-Test für abhängige Stichproben"
runtime: shiny
output:
  html_notebook:
    code_folding: hide
    number_sections: true
    toc: true
    toc_depth: 3
    toc_float: true
---

Dieser Abschnitt steht ganz oben im RMarkdown-Dokument. Er definiert das Layout, die Laufzeitumgebung (shiny) und Darstellungsoptionen:

Textabschnitte (Markdown)

## Beschreibung

Solche Markdown-Abschnitte dienen der Strukturierung und enthalten erklärenden Text. Je mehr Rauten (#), desto tiefer die Ebene.

Code-Chunks

```{r, echo=FALSE}
# R-Code
```

Code-Chunks führen R-Befehle aus. Mit echo=FALSE wird der Quellcode im HTML-Dokument unterdrückt – nur die Ausgabe erscheint.

Abschnitt 0.1 – Daten einlesen

In diesem Abschnitt wird der Datensatz twins um eine neue Variable erweitert, die die Differenz der IQ-Werte pro Zwilling misst.

zwischen <- twins$IQbio - twins$IQfoster 
twins <- cbind(twins, "Differenz" = zwischen)

zwischen: Berechnet die Differenz zweier IQ-Spalten.

cbind: Fügt die Differenzspalte an den Dataframe twins an.

Abschnitt 0.3 – Voraussetzungen des t-Tests

In diesem Abschnitt wird eine Shiny-Benutzeroberfläche erstellt, die über Reiter (Tabs) organisiert ist. Die Funktion tabsetPanel() enthält mehrere tabPanel()-Elemente, die unterschiedliche Inhalte anzeigen.

Diese UI-Komponenten bilden die Grundlage zur grafischen Überprüfung der Voraussetzungen für den t-Test: Skalenniveau, Verteilung, Symmetrie und Visualisierung.

Hier wird die grafische Oberfläche in Tabs organisiert. Diese helfen bei der Überprüfung, ob die Voraussetzungen für einen t-Test erfüllt sind.

tabsetPanel(
  tabPanel("Abhängige Variable", br(), AV),
  tabPanel("Unabhängige Variable", br(), UV),
  tabPanel("Histogram", br(),
    sliderInput("number_bins_selbst", "Number of Histogramm bins:", value = 6, min = 1, max = 12),
    renderPlot({
      twins %>%
        ggplot(aes(as.numeric(Differenz))) +
        geom_histogram(bins = input$number_bins_selbst, color = "#e9ecef", alpha = 0.7) +
        theme_grey() +
        labs(x = "XX", y = "Anzahl")
    }),
    histogramm_antwort
  ),
  tabPanel("QQPlot", br(),
    renderPlot({
      qqPlot(twins$Differenz, main = "QQPlot für die Var. Differenz")
    }),
    qqplot_antwort
))

Erstellt eine Reiter-basierte UI mit Histogramm und QQPlot.

Abschnitt 0.4 – Deskriptive Statistik & Korrelation

Diese Blöcke liefern sowohl numerische als auch grafische Zusammenfassungen der IQ-Werte. Ziel ist es, Lage- und Streuungsmaße sowie Zusammenhänge zu erkennen.

renderPrint({
  g <- describe(twins)
  print(g)
})

describe: Berechnet Mittelwert, SD, Min, Max usw. für alle Variablen.

renderPlot({
  scatterplot(IQbio ~ IQfoster, data = twins,
              main = "Streudiagramm für die beiden IQ-Werte",
              ylab = "biologische Eltern", xlab = "Adoptiveltern", col = "green")
})

scatterplot: Zeichnet ein Streudiagramm zur visuellen Prüfung der Korrelation.

renderPrint({
  test <- cor.test(twins$IQbio, twins$IQfoster)
  print(test)
})

cor.test: Statistischer Test zur Berechnung des Pearson-Korrelationskoeffizienten.

Abschnitt 0.5 – Ergebnisse des t-Tests

Hier erfolgt die Durchführung des t-Tests für abhängige Stichproben mit t.test(). Die Ausgabe enthält den t-Wert, p-Wert, Mittelwertsdifferenz und Konfidenzintervall.

renderPrint({
  test1 <- t.test(twins$IQbio, twins$IQfoster,
                  alternative = "two.sided",
                  paired = TRUE,
                  conf.level = .95)
  print(test1)
})

t.test: Führt einen gepaarten t-Test durch mit 95% Konfidenzintervall.

Abschnitt 0.6 – Effektstärke: Cohen & Hedges

Zusätzlich zur Signifikanz liefert dieser Abschnitt Maße für die praktische Bedeutung des Effekts.

Cohen & Pearson

renderUI({
  withMathJax(helpText('$$r=\sqrt{\frac{t^2}{t^2+df}}$$'))
})

Mathematische Darstellung für Effektstärke r mit MathJax.

renderPrint({
  eff <- sqrt((test1$statistic^2) / (test1$statistic^2 + test1$parameter))
  sprintf("Die Effektstärke liegt bei %.2f", eff)
})

Berechnet r aus t-Wert und Freiheitsgraden (df).

Hedges g

renderUI({
  withMathJax(helpText('$$Hedges$$'))
})
renderPrint({
  diff <- mean(twins$Differenz)
  sed <- sd(twins$Differenz)
  g <- diff / sed
  g <- as.numeric(g)
  sprintf("Effektstärke: %.4f", g)
})

Berechnet Hedges’ g als Mittelwert der Differenz geteilt durch deren Standardabweichung.

Abschnitt 0.7 – Schluss

Am Ende des Dokuments wird der statistische Befund zusammengefasst und die Nullhypothese kommentiert. Es wird keine signifikante Differenz gefunden – daher bleibt die Nullhypothese bestehen.

Das finale Ergebnis lautet:

t(26) = -0.12438, p = .902, n = 27

Interpretation: Der p-Wert liegt deutlich über .05, daher kein signifikanter Unterschied.

Schlussfolgerung (technisch): Die Nullhypothese (kein Unterschied) wird nicht verworfen. Die beobachtete Differenz könnte durch Zufall entstanden sein.