library(tidyverse)
library(PupilPre) # installieren, einmalig, nicht vergessen
data("Pupildat")
d <-
Pupildat %>%
select(size = RIGHT_PUPIL_SIZE,
time = TIMESTAMP) %>%
mutate(size = size / 100) # in millimeterpupil-size2
Aufgabe
Pupillendaten sind ein verbreiteter Analysegegenstand in Bereichen wie Psychologie, Marktforschung und Marketing.
Betrachten wir dazu ein R-Paket (zum Vorverbarbeitung, preprocessing) und einen Datensatz der Uni Münster.
ACHTUNG: Das R-Paket PupilPre ist nur noch im Archiv von CRAN verfügbar und muss ggf. manuell installiert werden: Einfach herunterladen und dann mit install.packages("Pfad/zur/Datei/PupilPre_0.1.5.tar.gz", repos = NULL, type = "source") installieren (oder über das Menü und dort bei “Install from” Package Archive File wählen).
Ein Forschungsteam untersucht den Datensatz und möchte ein Modell zur Schätzung der Pupillengröße aufstellen.
Mit dem R-Paket eaystats kann man sich bequem typische Statistiken ausgeben lassen, was das Forschungsteam auch macht.
library(easystats)
d %>%
describe_distribution()| Variable | Mean | SD | IQR | Min | Max | Skewness | Kurtosis | n | n_Missing |
|---|---|---|---|---|---|---|---|---|---|
| size | 1.000562e+01 | 5.107151e+00 | 3.88 | 1.04 | 25.01 | 1.2474408 | 0.3199426 | 45343 | 1607 |
| time | 2.990837e+06 | 9.874538e+05 | 1947161.00 | 1443974.00 | 4062110.00 | -0.4111739 | -1.6982498 | 46950 | 0 |
Ds Forschungsteam verzichtet hier auf eine Aufbereitung der Daten (was eigentlich nötig wäre, aber nicht Gegenstand dieser Übung ist). Stattdessen konzentrieren wir uns auf die Posteriori-Verteilung zur Pupillengröße.
Das Forschungsteam ist interessiert an einem Modell zur Schätzung der (Verteilung der) Pupillengröße; die Posteriori-Verteilung bildet das ab.
Zuerst definiert das Forschungsteam ein Modell:
Für das Modell wird folgende Begründung vom Forschungsteam gegeben:
Aber welche Werte von lambda kommen in Frage? Das Forschungsteam probiert etwas herum:
qexp(p = .5, rate = 1)[1] 0.6931472
Mit p = .5) bei ca. 0.7 mm. Dieser Wert erscheint etwas klein.
qexp(p = .5, rate = 0.2)[1] 3.465736
Hm. Eine Streuung der Pupillengrößen von ca. 3.5mm (im Median) um den Mittelwert herum; das könnte passen.
Die große Stichprobe wird den Priori-Wert vermutlich überstimmen, überlegt das Forschungsteam (und hat im Großen und Ganzen Recht).
Die Modelle wie stan_glm() tun sich leichter, wenn man nur die relevanten Daten, ohne fehlende Werte und schon schön fertig vorverarbeitet, zur Analyse in die Modellberechnung gibt:
d3 <-
d %>%
select(size) %>%
drop_na()Die Posteriori-Verteilung kann man mit dem Paket {rstanarm} d.h. mit der Funktion stan_glm() berechnen:
library(rstanarm)
m_pupil <- stan_glm(size ~ 1,
data = d3,
seed = 42,
refresh = 0)Die Daten sind groß, es kann ein paar Sekunden brauchen…
Hier ist eine nützliche Zusammenfassung der Post-Verteilung.
parameters(m_pupil)| Parameter | Median | CI | CI_low | CI_high | pd | Rhat | ESS | Prior_Distribution | Prior_Location | Prior_Scale |
|---|---|---|---|---|---|---|---|---|---|---|
| (Intercept) | 10.00556 | 0.95 | 9.958776 | 10.05205 | 1 | 1.000263 | 1991.503 | normal | 10.00562 | 12.76788 |
Hier eine Visualisierung der Parameter:
plot(parameters(m_pupil), show_intercept = TRUE)
Natürlich kann man auch die Post-Verteilung plotten (z.B: HDI):
m_hdi <- hdi(m_pupil, ci = c(0.5, 0.95))
plot(m_hdi, show_intercept = TRUE) # Im Default wird der Intercept nicht gezeigt
Hier zur Info die ersten paar Zeilen des Post-Verteilung:
| (Intercept) | sigma |
|---|---|
| 10.04 | 5.13 |
| 10.00 | 5.07 |
| 9.99 | 5.08 |
| 10.00 | 5.08 |
| 9.99 | 5.11 |
Das Forschungsteam lässt sich folgende Statistiken zum Modell ausgeben:
eti(m_pupil)| Parameter | CI | CI_low | CI_high | Effects | Component |
|---|---|---|---|---|---|
| (Intercept) | 0.95 | 9.958776 | 10.05205 | fixed | conditional |
hdi(m_pupil)| Parameter | CI | CI_low | CI_high | Effects | Component |
|---|---|---|---|---|---|
| (Intercept) | 0.95 | 9.95854 | 10.05182 | fixed | conditional |
eti(m_pupil, ci = .89)| Parameter | CI | CI_low | CI_high | Effects | Component |
|---|---|---|---|---|---|
| (Intercept) | 0.89 | 9.966516 | 10.04339 | fixed | conditional |
prior_summary(m_pupil)Priors for model 'm_pupil'
------
Intercept (after predictors centered)
Specified prior:
~ normal(location = 10, scale = 2.5)
Adjusted prior:
~ normal(location = 10, scale = 13)
Auxiliary (sigma)
Specified prior:
~ exponential(rate = 1)
Adjusted prior:
~ exponential(rate = 0.2)
------
See help('prior_summary.stanreg') for more details
Aufgabe Berichten Sie die Breite des 95% Equal Tails Intervalls.
Hinweise:
- Verwenden Sie die Defaults von
rstanarmfür Ihr Modell. - Beachten Sie die üblichen Hinweise des Datenwerks
- Falls Sie Teile der Aufgabe nicht lösen können, weil Ihnen der Stoff dazu fehlt: Einfach ignorieren 😄.
Lösung
Man kann die Breite des 95% ETI aus der Ausgabe von eti() ablesen:
[1] 0.09327839
eti() verwendet im Default eine 95%-Intervall.
Categories:
- probability
- bayes
- regression
- string