---
title: "Statistik 5"
subtitle: "Übung 6"
format: 
  revealjs:
    chalkboard:
      remember-playback: true
      create-playback: true
    slide-number: true
    #embed-resources: true
    css: 
     - webex.css
     - statistics_exercises_reveal.css
    include-after-body: 
      - webex.js
      - webex-pdf-persist.js
    height: 1200
    width: 1800
webexercises:
  storage-key: "Uebung_Statistik5_6"
---

```{r setup}
#| include: false
library("exams2forms")
knitr::opts_knit$set("out.format" = NULL, "rmarkdown.pandoc.to" = NULL)
```

## Einleitung und Ziele der Übung

\

Herzlich Willkommen zur Übung Statistik 5. In dieser Übung wollen wir einfache Poweranalysen mit G\*Power und in R mit Package pwr lösen.

## Agenda

\

- Installation/Vorbereitung
- Poweranalysen (Software-analytisch)
- Funktionen schreiben

## 1. Installation/Vorbereitung - Einführung

\

Bitte führen Sie folgende Schritte durch:

1) Installieren Sie das Package pwr in R und laden Sie es.
2) Installieren Sie G\*Power über folgenden Link
   [Website G\*Power](https://www.psychologie.hhu.de/arbeitsgruppen/allgemeine-psychologie-und-arbeitspsychologie/gpower)

## 2. Poweranalysen - Einführung

\

Auf den nächsten Seiten finden Sie der Reihe nach Aufgaben zur Poweranalyse mit G*\Power und R. 
Diese sind (grob) der Schwierigkeit nach geordnet. Bitte versuchen Sie jede Aufgabe mit beiden Möglichkeiten zu lösen.

## 2. Poweranalysen - Übung 1 (sehr leicht)

\

Bestimmen Sie die Stichprobengrösse für einen Einstichproben *t*-Test:

- ungerichtet
- $\alpha = .01$
- $\beta = .10$
- $d = .25$
- $n =\space$ `r forms_string( "242", width = 7,  obfuscate = FALSE)` 
```{r}
#| eval: false
#| include: false
#| echo: false
pwr.t.test(n = NULL, d = .25, sig.level = 0.01, power = .90, 
    type = "one.sample",
    alternative ="two.sided")
```

## 2. Poweranalysen - Übung 2 (leicht)

\

Bestimmen Sie die notwendige Effektgrösse (3 NKS, Werte zwischen 0 und 1) für eine einfaktorielle Varianzanalyse (ohne Messwiederholung).

- $\alpha = .05$
- $Faktorstufen = 7$
- $Teststaerke = .85$
- $n_{Gesamt} = 280$
- $f =\space$ `r forms_string( ".236", width = 7,  obfuscate = FALSE)` 
```{r}
#| eval: false
#| include: false
#| echo: false
pwr.anova.test(k = 7, n = 40, f = NULL, sig.level = 0.05, power = .85)
```

## 2. Poweranalysen - Übung 3 (mittel)

\

Eine Geschäftsfrau möchte einen neuen Imbiss im Quartier eröffnen. Um zu erfahren, welches Fastfood am besten funktioniert, befragt Sie 100 Personen, 
nach Ihrer Präferenz (Anzahl Antworten in Klammern):

- Pizza (33)
- Döner (20)
- Burger (15)
- Schnitzel mit Pommes (10)
- Salat (22)

Ihre ursprüngliche Hypothese war, dass alles gleich beliebt ist.
Wie gross war Ihr Signifikanzniveau, wenn Sie eine Teststärke von .70 erzielt haben? 
Um die Effektstärke $\omega$ (0-1, 3NKS) zu ermitteln nutzen Sie bitte beide der möglichen Wege: G\*Power und die folgende Formel:

- $\omega=\sqrt{\sum\frac{(p_{beob}-p_{erw})^2}{p_{erw}}}=\space$`r forms_string( ".386", width = 7,  obfuscate = FALSE)`
- $df=k-1=\space$`r forms_string( "4", width = 7,  obfuscate = FALSE)`
- $\alpha=\space$`r forms_string( ".007", width = 7,  obfuscate = FALSE)`

```{r}
#| eval: false
#| include: false
#| echo: false
pwr.chisq.test(w = .386, N = 100, df = 4, sig.level = NULL, power = .70)
```

## 2. Poweranalysen - Übung 4 (mittel)

\

Bestimmen Sie die Teststärke (3 NKS, Werte zwischen 0 und 1) für einen Interaktionsterm einer reinen Messwiederholungs-Anova, diesmal nur mit G*Power.
Gehen Sie von perfekter Sphärizität aus

- $\alpha = .05$
- $n = 50$
- $f = .10$
- $Design = 2x5$
- $\overline r = .75$
- $Teststaerke =\space$ `r forms_string( ".896", width = 7,  obfuscate = FALSE)` 
```{r}
#| eval: false
#| include: false
#| echo: false
pwr.t.test(n = NULL, d = .25, sig.level = 0.01, power = .90, 
    type = "one.sample",
    alternative ="two.sided")
```

## 3. Funktionen schreiben - Einführung

\

Jetzt wollen wir noch eine Übungsweise eine Gruppe von Funktionen schreiben. 
Das Ziel ist Unser Beispiel 3 aus der Vorlesung zum Bootstrap als (mehrere Funktionen) umzusetzen.

## 3. Funktionen schreiben - Übung 1 (leicht)

\

Schreiben Sie eine Funktion *tStat_AS* mit den zwei Argumenten *T1* und *T2*. Die Funktion soll einen *t*-Wert für einen Mittelwertsvergleich zweier abhängiger Stichproben ermitteln.

- Orientieren Sie sich am Codebeispiel der Vorlesung zum Bootstrap
- *T1* soll die Werte der ersten Stichprobe übergeben bekommen (also ein Vektor)
- *T2* soll die Werte der zweiten Stichprobe übergeben bekommen (also ebenfalls ein Vektor)
- Nutzen Sie length() um die Stichprobengrösse zu ermitteln
- Nutzen Sie zusätzlich die Befehle mean(), sd() und sqrt() aber nicht t.test()
- Sie dürfen davon ausgehen, dass keine fehlenden Werte vorhanden sind
- Der Rückgabewert soll der Wert der t-Statistik sein
- Testen Sie Ihre Funktion mit folgenden Werten :

```{r}
#| eval: false
#| include: true
#| echo: true
Gruppe1 <- c(15,14,13,17) 
Gruppe2 <- c(10,8,9,15)
# Ergebnis sollte 4.97709 sein
```

```{r}
#| eval: false
#| include: false
#| echo: false
tStat_AS <- function (T1, T2){
  N               <- length(T1)
  Differenzen     <- T1 - T2
  M_Differenzen   <- mean(Differenzen)
  SD_Differenzen  <- sd(Differenzen)
  SEM_Differenzen <- SD_Differenzen/sqrt(N)
  t <- M_Differenzen/SEM_Differenzen
  return(t)
}

#Probe
Gruppe1 <- c(15,14,13,17) 
Gruppe2 <- c(10,8,9,15)
tStat_AS(Gruppe1,Gruppe2)
```

## 3. Funktionen schreiben - Übung 2 (leicht-mittel)

\

Erweitern Sie Ihre Funktion tStat_AS mit einem dritten Argument *Boot*:

- *Boot* erhält entweder den Wert "ja" oder "nein"
- bei "nein" funktioniert eigentlich alles wie gehabt
- bei "ja"
  - Bestimmen Sie zunächst die Personen, die in der Bootstrap-Stichprobe enthalten sein sollen (N Mal Ziehen mit Zurücklegen aus 1:N)
  - Denken Sie daran: Sie müssen die Personen der Bootstrap-Stichprobe von T1 und T2 nur 1x bestimmen, es sind die gleichen Personen in der gleichen Reihenfolge für beide Zeitpunkte
  - Ersetzen Sie die Werte von T1 und T2 mit den Werten von T1 und T2 für die ermittelten Personen
  - Danach so weiter wie immer (Sie brauchen also am restlichen Code nichts ändern!)
- Testen Sie Ihre Funktion mit folgenden Werten (Vergessen Sie nicht den Code vorher nochmals auszuführen:

```{r}
#| eval: false
#| include: true
#| echo: true
Gruppe1 <- c(15,14,13,17) 
Gruppe2 <- c(10,8,9,15)
set.seed(123)
#1x mit "nein" sollte 4.97709 sein
#2x mit "ja" sollte das 1. Mal 9 sein und das zweite Mal 11 ergeben
```  

```{r}
#| eval: false
#| include: false
#| echo: false
tStat_AS <- function (T1, T2, Boot){
  N               <- length(T1)
  if (Boot =="ja"){
    Personen <- sample(1:N,N,replace=TRUE)
    T1 <- T1[Personen]
    T2 <- T2[Personen]
  }
  Differenzen     <- T1 - T2
  M_Differenzen   <- mean(Differenzen)
  SD_Differenzen  <- sd(Differenzen)
  SEM_Differenzen <- SD_Differenzen/sqrt(N)
  t <- M_Differenzen/SEM_Differenzen
  return(t)
}

#Probe
Gruppe1 <- c(15,14,13,17) 
Gruppe2 <- c(10,8,9,15)

set.seed(123)
tStat_AS(Gruppe1,Gruppe2,"nein")
tStat_AS(Gruppe1,Gruppe2,"ja")
tStat_AS(Gruppe1,Gruppe2,"ja")
```


## 3. Funktionen schreiben - Übung 3 (leicht)

\

Schreiben Sie eine neue Funktion tStat_AS_Boot mit den Argumenten *T1*,*T2* und *Bootstraps*

- *T1* und *T2* sind genauso wie zuvor
- *Bootstraps* enthält die Anzahl an Bootstraps
- Die Funktion soll der Reihe nach folgendes tun:
  - Die vorherige Funktion aufrufen um den originalen t-Wert zu bestimmen und in t_Orig zu speichern
  - replicate() mit folgenden Argumenten ausführen und das Ergebnis in t_Verteilung speichern:
    - Bootstraps
    - unsere vorherige Funktion mit Boot = "ja"
  - t_Verteilung zurückgeben
  
- Testen Sie Ihre Funktion mit folgenden Werten:

```{r}
#| eval: false
#| include: true
#| echo: true
Gruppe1 <- c(15,14,13,17) 
Gruppe2 <- c(10,8,9,15)
Wiederholungen <- 5000
set.seed(234) 
# erste 4 Werte sollten 10.966892  5.018570  4.333333  8.660254 sein
```  

```{r}
#| eval: false
#| include: false
#| echo: false
tStat_AS_Boot <- function (T1, T2, Bootstraps){
  t_Orig <- tStat_AS(T1,T2, "nein")
  t_Verteilung<- replicate(Bootstraps, tStat_AS(T1,T2, "ja"))
  return(t_Verteilung)
}
```

# 3. Funktionen schreiben - Übung 4 (leicht)

\

Bevor wir die Signifikanzprüfung in unsere Funktion einbauen, wollen wir uns die Signifikanzprüfung per Konfidenzintervall "analog" überlegen.

- Bei einer ungerichteten Hypothese für Mittelwertsunterschiede (Bootstrap) muss
  - welche Grenze bestimmt werden? `r forms_schoice( c("untere","obere","beide"), c(F,F,T),  "dropdown",obfuscate = FALSE)`
  - das Signifikanzniveau `r forms_schoice( c("halbiert werden","nicht halbiert werden"), c(T,F), "dropdown",obfuscate = FALSE)`
  - ist das Ergebnis signifikant, wenn 0 `r forms_schoice(c("unter der u. Grenze",
                                                           "über der u. Grenze",
                                                           "unter der o. Grenze",
                                                           "über der o. Grenze",
                                                           "unter der u. Grenze oder über der o. Grenze",
                                                           "über der u. Grenze oder unter der o. Grenze"),
                                                           c(F,F,F,F,T,F), "dropdown",obfuscate = FALSE)` liegt
                                                           
- Bei einer gerichten Hypothese (T1 kleinere Werte) für Mittelwertsunterschiede (Bootstrap) muss
  - welche Grenze bestimmt werden? `r forms_schoice( c("untere","obere","beide"), c(F,T,F),  "dropdown",obfuscate = FALSE)`
  - das Signifikanzniveau `r forms_schoice( c("halbiert werden","nicht halbiert werden"), c(F,T), "dropdown",obfuscate = FALSE)`
  - ist das Ergebnis signifikant, wenn 0 `r forms_schoice(c("unter der u. Grenze",
                                                           "über der u. Grenze",
                                                           "unter der o. Grenze",
                                                           "über der o. Grenze",
                                                           "unter der u. Grenze oder über der o. Grenze",
                                                           "über der u. Grenze oder unter der o. Grenze"),
                                                           c(F,F,F,T,F,F), "dropdown",obfuscate = FALSE)` liegt
                                                           
- Bei einer ungerichteten Hypothese (T1 grössere Werte) für Mittelwertsunterschiede (Bootstrap) muss
  - welche Grenze bestimmt werden? `r forms_schoice( c("untere","obere","beide"), c(T,F,F),  "dropdown",obfuscate = FALSE)`
  - das Signifikanzniveau `r forms_schoice( c("halbiert werden","nicht halbiert werden"), c(F,T), "dropdown",obfuscate = FALSE)`
  - ist das Ergebnis signifikant, wenn 0 `r forms_schoice(c("unter der u. Grenze",
                                                           "über der u. Grenze",
                                                           "unter der o. Grenze",
                                                           "über der o. Grenze",
                                                           "unter der u. Grenze oder über der o. Grenze",
                                                           "über der u. Grenze oder unter der o. Grenze"),
                                                           c(T,F,F,F,F,F), "dropdown",obfuscate = FALSE)` liegt

## 4. Funktionen schreiben - Übung 5 (mittel)

\

Erweitern Sie die Funktion tStat_AS_Boot um zwei weitere Argumente *Gerichtet* und *Alpha*

- *Gerichtet* erhält enweder den Wert "u" (ungerichtet), "k" (kleiner) oder "g" (grösser)
- *Alpha* sei unser Signifikanzniveau (Wert zwischen 0 und 1)
- Passen Sie Ihren Code zusätzlich wie folgt an:
  - Entfernen Sie die Rückgabe der t_Verteilung
  - Bestimmen Sie, ob Ihre t-Statistik signifikant ist:
    - Wenn Gerichtet = "u" ist, gibt es zwei Grenzen und 0 muss kleiner als die untere Grenze oder grösser als die obere Grenze sein
    - Wenn Gerichtet = "k" ist, gibt es nur eine obere Grenze
    - Wenn Gerichtet = "g" ist, gibt es nur eine untere Grenze
    - Die Grenze(n) können Sie mit quantile(), Ihrer *t_Verteilung*-Variable und *Alpha* bestimmen
    - Verwenden Sie bei quantile() als drittes Argument bitte jeweils **na.rm = TRUE**
    - Geben Sie FALSE für nicht signifikant oder TRUE für signifikant zurück (ohne Anführungszeichen).
- Die Testwerte finden Sie auf der nächsten Seite



```{r}
#| eval: false
#| include: false
#| echo: false
tStat_AS_Boot <- function (T1, T2, Bootstraps, Gerichtet, Alpha){
  t_Orig <- tStat_AS(T1,T2, "nein")
  t_Verteilung <- replicate(Bootstraps, tStat_AS(T1,T2, "ja"))
  if (Gerichtet == "u"){
    Grenzen <- quantile(t_Verteilung, c(Alpha/2,1-Alpha/2),na.rm = TRUE)
    return((0 < Grenzen[1]) | (0 > Grenzen[2]))
  } else {
    if (Gerichtet == "k"){
      Grenze <- quantile(t_Verteilung, 1- Alpha,na.rm = TRUE)
      return(0 > Grenze)      
    } else { 
      if(Gerichtet == "g"){
        Grenze <- quantile(t_Verteilung, Alpha,na.rm = TRUE)
        return(0 < Grenze)        
      }
    }
  }
}
```

## 4. Funktionen schreiben - Übung 6

\

Fasst geschafft, testen Sie Ihre Funktion mit folgenden Werten (andere Werte!):


```{r}
#| eval: false
#| include: true
#| echo: true
G1 <- c(14,12,11,13) 
G2 <- c(12,11,12,13)
Wiederholungen <- 5000
Signifikanzniveau = .3
set.seed(234) 
# 3 Tests der Reihe nach 
# ungerichtet (nicht signifikant --> FALSE)
# gerichtet kleiner (nicht signifikant --> FALSE)
# gerichtet grösser (signifikant --> TRUE)
```  

```{r}
#| eval: false
#| include: false
#| echo: false
G1 <- c(14,12,11,13) 
G2 <- c(12,11,12,13)
Wiederholungen <- 5000
Signifikanzniveau = .3
set.seed(234) 
tStat_AS_Boot(G1,G2,Wiederholungen,"u",Signifikanzniveau)
tStat_AS_Boot(G1,G2,Wiederholungen,"k",Signifikanzniveau)
tStat_AS_Boot(G1,G2,Wiederholungen,"g",Signifikanzniveau)
```