DS3 - Vom experimentellen Design zur
explorativen Datenanalyse & Data Mining
Saskia Otto
Universität Hamburg, IMF
Wintersemester 2024/2025
Grafik von Nina Garman (Pixabay)
Beide Verfahren der inferenziellen Statistik beruhen auf unterschiedlichen Stichprobenverteilung:
Was ist zu tun, wenn die Annahmen der besten verfügbaren Methode verletzt werden und wir nicht auf parametrische Tests und allgemeine lineare Modelle zurückgreifen können?
Ein Ansatz, bei dem die Leistungsfähigkeit des Computers genutzt wird, um eine Stichprobenverteilung zu erstellen:
KI_{95\%} = 1.96\cdot\sqrt{\frac{\sigma^2}{n}}
KI_{95\%} = t_{(\alpha/2,df)}\cdot\sqrt{\frac{s^2}{n}}
→ Wir sind uns nun zu 95% sicher, dass der wahre Mittelwert im Bereich 111.8 - 112.4 liegt.
df$res <- residuals(mod_lm)
df$fit <- fitted(mod_lm)
p1 <- ggplot(df, aes(y)) +
geom_histogram(bins = 10, fill = "grey50", colour = "grey10") +
ggtitle("Histogramm von Y")
p2 <- ggplot(df, aes(x, y)) + geom_point() +
geom_smooth(method = "lm", se = TRUE) +
ggtitle("Beziehung Y ~ X")
p3 <- ggplot(df, aes(res)) +
geom_histogram(bins = 10, fill = "grey50", colour = "grey10") +
ggtitle("Histogramm der Residuen")
p4 <- ggplot(df, aes(fit, res)) + geom_point() +
geom_hline(yintercept = 0) +
ggtitle("Residuen vs. fitted")
gridExtra::grid.arrange(p1, p2, p3, p4)
set.seed(32)
it <- 10000
boot_b <- numeric(it)
for (i in 1:it){
n <- nrow(df)
indices <- sample(1:n, replace = T)
y_sample <- df$y[indices]
x_sample <- df$x[indices]
model <- lm(y_sample ~ x_sample)
boot_b[i] <- coef(model)[2]
}
quantile(boot_b,c(0.025,0.975))
2.5% 97.5%
4.663306 11.757071
→ Der Konfidenzbereich liegt nun zwischen 4.7 und 11.8.
Man generiert sich mit Hilfe des Computers seine eigene Zufalls- oder Nullverteilung und prüft dann, ob sich die gefundene Verteilung von dieser Zufallsverteilung unterscheidet.
Webseite: https://www.jwilber.me/permutationtest/
Unterscheiden sich zwei Schneckenarten in ihrer Laufgeschwindigkeit (in m/Stunde)?
A <- c(4,2,7,9,2,8)
B <- c(7,10,9,5,8,11)
Rennen <- data.frame(
Art = c(rep("A", 6), rep("B", 6)),
Geschw = c(A,B)
)
Rennen |>
group_by(Art) |>
summarise(
Mittelwert = mean(Geschw),
Standardabweichung = sd(Geschw)
)
# A tibble: 2 × 3
Art Mittelwert Standardabweichung
<chr> <dbl> <dbl>
1 A 5.33 3.08
2 B 8.33 2.16
Welch Two Sample t-test
data: Geschw by Art
t = -1.9547, df = 8.9658, p-value = 0.08247
alternative hypothesis: true difference in means between group A and group B is not equal to 0
95 percent confidence interval:
-6.473935 0.473935
sample estimates:
mean in group A mean in group B
5.333333 8.333333
Welch Two Sample t-test
data: Geschw by Art
t = -1.9547, df = 8.9658, p-value = 0.04123
alternative hypothesis: true difference in means between group A and group B is less than 0
95 percent confidence interval:
-Inf -0.1853508
sample estimates:
mean in group A mean in group B
5.333333 8.333333
Differenz beider Mittelwerte als Teststatistik
[1] 3
Teststatistik bei neuer Stichprobe
[1] -0.3333333
set.seed(321)
it <- 10000 # 10000 Iterationen
mystats <- numeric(it)
for (i in 1:it){
# Schleifenkörper: wir kopieren den Code von eben
Rennen_neu <- Rennen
Rennen_neu$Geschw <- sample(Rennen_neu$Geschw)
mystats[i] <- mean(Rennen_neu$Geschw[Rennen_neu$Art == "B"]) -
mean(Rennen_neu$Geschw[Rennen_neu$Art == "A"])
}
Call:
lm(formula = body_mass_g ~ flipper_length_mm + sex, data = adelie)
Residuals:
Min 1Q Median 3Q Max
-662.85 -213.18 -6.27 207.42 743.73
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 305.087 755.580 0.404 0.687
flipper_length_mm 16.314 4.019 4.059 8.08e-05 ***
sexmale 599.343 52.246 11.472 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 295.1 on 143 degrees of freedom
Multiple R-squared: 0.5918, Adjusted R-squared: 0.5861
F-statistic: 103.6 on 2 and 143 DF, p-value: < 2.2e-16
Hier gibt es 2 Möglichkeiten der Permutation:
Wir extrahieren zuerst die F-Statistik aus der drop1()
Funktion.
Single term deletions
Model:
body_mass_g ~ flipper_length_mm + sex
Df Sum of Sq RSS AIC F value Pr(>F)
<none> 12450275 1663.6
flipper_length_mm 1 1434486 13884760 1677.5 16.476 8.077e-05 ***
sex 1 11457596 23907871 1756.9 131.598 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Wir schreiben die Schleife
Verteilung der Teststatistik
[1] 0
[1] 0
INTERPRETATION:
1. Bootstrap-Konfidenzintervall bei Graugänsen
2. Permutationstest zur Alpakawolle
Vorbereitung @home
Mit Schleifen programmieren
Dann testen Sie doch Ihr Wissen in folgendem Abschlussquiz…
Bei weiteren Fragen: saskia.otto(at)uni-hamburg.de
Diese Arbeit is lizenziert unter einer Creative Commons Attribution-ShareAlike 4.0 International License mit Ausnahme der entliehenen und mit Quellenangabe versehenen Abbildungen.
Kurswebseite: Data Science 3