DS3 - Explorative Datenanalyse & Data Mining
Saskia Otto
Universität Hamburg, IMF
Wintersemester 2023/2024
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.4 - 112.4 liegt.
Statt der manuellen Berechnung können wir die boot()
Funktion aus dem gleichnamigen R Paket verwenden:
boot() Funktion im 'boot' Paket
boot(data, statistic, R)
data
repräsentiert den Vektor aus dem die Stichproben gezogen werden.statistic
steht für die Funktion, die pro Iteration angewendet werden soll, in unserem Fall für die Berechnung des Mittelwerts.R
definiert die Anzahl der Wiederholungsstichproben.BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 1000 bootstrap replicates
CALL :
boot.ci(boot.out = boot_results)
Intervals :
Level Normal Basic
95% (111.4, 112.4 ) (111.4, 112.3 )
Level Percentile BCa
95% (111.4, 112.4 ) (111.5, 112.5 )
Calculations and Intervals on Original Scale
Normal
: parametrisches KI, das auf dem Standardfehler des Mittelwerts und dem Stichprobenumfang basiertPercentile
: das sog. Bootstrap-Perzentil-Intervall = Quantil aus den Bootstrap-SchätzungenBCa
: angepasstes Bootstrap-Perzentil-Intervalldf$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)
Estimate Std. Error t value Pr(>|t|)
(Intercept) -55.960944 22.550127 -2.481624 1.761662e-02
x 8.135234 1.464779 5.553899 2.329342e-06
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
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"])
}
y x
1 0.069360916 0.3926972
2 0.817775199 0.8138806
3 0.942621732 0.3762485
4 0.269381876 0.3808122
5 0.169348123 0.2649184
6 0.033895622 0.4393343
7 0.178785004 0.4576072
8 0.641665366 0.5407075
9 0.022877743 0.6656798
10 0.008324827 0.1126989
Einmalig
y x resample_y
1 0.069360916 0.3926972 0.178785004
2 0.817775199 0.8138806 0.641665366
3 0.942621732 0.3762485 0.269381876
4 0.269381876 0.3808122 0.069360916
5 0.169348123 0.2649184 0.817775199
6 0.033895622 0.4393343 0.942621732
7 0.178785004 0.4576072 0.033895622
8 0.641665366 0.5407075 0.008324827
9 0.022877743 0.6656798 0.169348123
10 0.008324827 0.1126989 0.022877743
[1] -0.01818182
[1] 5394
[1] 0.5394
Es gibt das Paket ‘coin’ , das Permutationstests für verschiedene Tests durchführt. Am besten die Vignette anschauen (vignette("coin", package = "coin")
:
Asymptotic Spearman Correlation Test
data: y by x
Z = 0.67273, p-value = 0.5011
alternative hypothesis: true rho is not equal to 0
Call:
lm(formula = body_mass_g ~ flipper_length_mm + sex, data = penguin_subs)
Residuals:
Min 1Q Median 3Q Max
-524.73 -186.57 6.13 128.46 716.22
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 696.634 1112.928 0.626 0.5341
flipper_length_mm 14.095 5.918 2.382 0.0209 *
sexmale 643.629 76.015 8.467 2.34e-11 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 267.3 on 52 degrees of freedom
Multiple R-squared: 0.6585, Adjusted R-squared: 0.6454
F-statistic: 50.13 on 2 and 52 DF, p-value: 7.387e-13
Wir extrahieren zuerst die t- und F-Statistiken aus der summary()
bzw. drop1()
Funktion.
Wir schreiben die Schleife
set.seed(123)
it <- 10000 # 10000 Iterationen
mystats_flipper <- numeric(it)
mystats_sex <- numeric(it)
for (i in 1:it){
# Schleifenkörper
df <- penguin_subs
df$body_mass_g_shuffled <- sample(df$body_mass_g)
mod <- lm(body_mass_g_shuffled ~ flipper_length_mm + sex, df)
mystats_flipper[i] <- summary(mod)$coefficients[2, "t value"]
mystats_sex[i] <- drop1(mod, test = "F")$`F value`[3]
}
Verteilung der Teststatistiken
INTERPRETATION: die Wahrscheinlichkeit, dass die beobachteten Daten unter der Annahme der H0 auftreten, liegt bei beiden Kovariaten unter 5 %. Wir können daher heweils die H0 ablehnen, es gibt einen signifikanten Effekt beider Variablen.
r
R Notebook und Datensätze sind im Moodlekurs (Woche 6) zu finden.
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