#install.packages("lmerTest")
#install.packages("emmeans")

library(lmerTest)
library(emmeans)
library(ggplot2)
library(dplyr)
library(ez)
source(file.path(pfadu, "phoc.txt"))

stimm = read.table(file.path(pfadu, "stimm.df.txt"))
stimm2 = read.table(file.path(pfadu, "stimm2.df.txt"))
soa = read.table(file.path(pfadu, "soa.txt"))
int = read.table(file.path(pfadu, "dbwort.df.txt"))

######################################################################
# 1. Mixed Models: allgemein
######################################################################
# Mit einem Mixed Model (MM) wird geprueft, ob eine
# abhaengige Variable (kontinuierlich oder (!!) kategorial)
# von einem oder mehreren unabhaengigen Faktoren beeinflusst wird.

# Mixed models (MM) haben eine breite Anwendung.
# Sie ersetzen zum Teil die Varianzanalyse;
# sie erweitern die lineare und (!!) die logistische Regression.

# Einige (A-D) Vorteile von einem MM im Vgl. zur Varianzanalyse
#
# A. In einer ANOVA, aber nicht in einem Mixed Model
# muss ueber Wiederholungen gemittelt werden
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
head(stimm)
# Inwiefern wird "vot" von der Artikulationsstelle ("K") und
# vom "Alter" beeinflusst.
# zuerst mitteln: ein Wert pro K-Vpn-Alter-Kombination
stimm.m = stimm %>%
  group_by(K, Vpn, Alter) %>%
  summarise(vot = mean(vot))

stimm.ez = ezANOVA(
  data = stimm.m,
  dv = .(vot),
  wid = .(Vpn),
  within = .(K)
)

stimm.ez
# hier gibt es also keine Probleme. Aber wenn wir den Effekt des Alters
# ermitteln moechten ...
# B. Kein Balanced-design in einem MM erforderlich.
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Balanced design: Die Anzahl der Vpn. muss pro Stufe des Between-Faktors
# gleich sein. Dies ist hier offensichtlich nicht gegeben fuer den
# Between-Faktor Alter.
with(stimm, table(Vpn, Alter))
# Alter
# Vpn Erw Kind
# A   0   16
# B   0   16
# C   0   16
# D  16    0
# E  16    0
# F  16    0
# G   0   16
# H   0   16
# d.h. es gibt 3 Erwachsene und 5 Kinder.
#
# Daher meckert die ANOVA:
#
ezANOVA(
  data = stimm.m,
  dv = .(vot),
  wid = .(Vpn),
  within = .(K),
  between = .(Alter)
)
# Warning: Data is unbalanced (unequal N per group).
#
# Das ist zwar "nur" eine Warnmeldung, aber wir koennen nie sicher sein,
# ob es wirklich "richtig" ist, was wir hier tun

# "unequal N per group" ist aber kein Problem fuer MMs

# C. Fehlende Werte erlaubt
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# In einer ANOVA muss jede Stufe des within-Faktors belegt sein.
# Das ist hier nicht der Fall.
with(stimm2, table(Vpn, K))
# Vpn ba pa
# A  0  8
# B  8  8
# C  8  8
# D  8  0
# E  8  8
# F  8  8
# G  8  8
# H  8  8
# daher kann ANOVA nicht durchgefuehrt werden.
# Mitteln:
stimm2.m = stimm2 %>%
  group_by(K, Vpn, Alter) %>%
  summarise(vot = mean(vot))

ezANOVA(
  data = stimm2.m,
  dv = .(vot),
  wid = .(Vpn),
  within = .(K),
  between = .(Alter)
)
# Error in ezANOVA_main(data = data, dv = dv, wid = wid, within = within,  :
# One or more cells is missing data.
#
# Fehlende Daten sind aber
# kein Problem fuer ein MM

# D. Die Variabilitaet von mehr als nur einem einzigen Faktor ausklammern.
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# In einer ANOVA kann die Variabilitaet hoechstens von einem Faktor
# (z.B. Vpn. ODER Wort) ausgeklammert werden.
# Keine solche Beschraenkung in einem MM (siehe 2. unten).




# E. Ein Nachteil. Ein MM ist bei einer kleinen Anzahl von Beobachtungen nicht stabil:
# bei weniger als ca. 60 Beobachtungen konvergiert das MM oft nicht
# (obwohl das auch von der Anzahl der Faktoren abhaengt -
# je mehr Faktoren, desto mehr Beobachtungen sind fuer
# eine "Konvergenz" (hier in etwa: "ein stabiles Modell") notwendig).




######################################################################
# 2. Fixed factors, random factors
######################################################################
# In einem MM werden die Faktoren in 'fixed' und 'random' aufgeteilt:
#
# Fixed Factor:
# +++++++++++++
# ein oder mehrere Faktoren, die geprueft werden sollen

# Random Factor:
# +++++++++++++
# ein oder mehrere Faktoren, von denen die Variabilitaet ausgeklammert/reduziert werden soll.
#
# In der Phonetik  sind oft Versuchsperson
# und/oder Item  (Materialien wie Woerter) Random Factors.
#
# Beispiel.
# 20 Sprecher produzierten verschiedene Woerter
# phrasenfinal oder phraseninitial und die Vokaldauer wurde gemessen.
# Inwiefern wird die Vokaldauer von der Phrasenposition beeinflusst?
#
# Abhaengige Variable: Dauer.
#
# Fixed Factor: Phrasenposition (initial vs. final).
#
# Random Factors: Versuchspersonen, Wort
# (weil die Variabilitaet, die wegen
# Versuchspersonen und Wort entsteht, entfernt werden soll).




######################################################################
#3. Was in einem MM berechnet wird
######################################################################
# Ein MM ist in einigen Hinsichten aehnlich wie die lineare Regression.
#
# Die Regression
# +++++++++++++++
#
# yhut = m x + k
# yhut sind die eingeschaetzten Werte,
# (m, k) die Steigung und Intercept

# Mixed Model (MM)
# +++++++++++++++
# In einem MM werden (m, k) in Random und Fixed aufgeteilt:
#
# yhut = (Random.m + Fixed.m) x + (Random.k + Fixed.k)
#
# Die 4 Variablen werden auf eine solche Weise berechnet,
# sodass der Abstand zwischen den tatsaechlichen Werten (y) und
# den eingeschaetzten Werten (yhut) minimiert werden
# (also ganz analog zur linearen Regression).
#
# Fuer das obige Beispiel:
# Abhaengige Variable:
# ++++++++++++++++++++
# vot (= die tatsaechlichen Werte)
#
# Fixed Factor:
# ++++++++++++++++++++
# K (2 Stufen: ba, pa)

# Random Factor:
# ++++++++++++++
# Vpn. Wird in einem MM als (K|Vpn) oder (1|Vpn)
# verschluesselt (mehr dazu in 4 unten).
#
# (K|Vpn) hat die Bedeutung:
# eine Steigung (Random.m) und  ein Intercept (Random.k)
# sollen pro Vpn. berechnet werden.
# (1|Vpn) hat die Bedeutung:
# ein Intercept (Random.k) soll pro Vpn. berechnet werden,
# aber keine Steigung (mehr dazu in 4 unten).

# Funktion: lmer() in library(lmerTest)
stimm.lmer = lmer(vot ~ K + (K | Vpn), data = stimm)


# Fixed.k, Fixed.m
fixef(stimm.lmer)
# (Intercept)         Kpa
# -2.432357           3.900090

# Random.k, Random.m
# N.B. es gibt einen (k, m) pro Versuchsperson
ranef(stimm.lmer)
#
# (Intercept)        Kpa
# A   13.438581  1.5463280
# B  -16.549963  1.1124886
# C   10.580984 -1.5464902
# D   -6.152658  0.3295624
# E  -19.812548 -0.1910332
# F   13.400583 -0.9499770
# G    1.524253  0.6061825
# H    3.570768 -0.9070612

#
# Die eingeschaetzten Werte (yhut)
fitted(stimm.lmer)
#
# Berechnung der eingschaetzten Werte
# yhut = (Random.m + Fixed.m) x + (Random.k + Fixed.k)
#
# x ist hier /ba/ oder /pa/ und wird als 0 und 1 umgesetzt
contrasts(stimm$K)
# ba  0
# pa  1
# d.h. 0 fuer ba, 1 fuer pa.
#
# z.B. yhut der 8en Beobachtung
#
stimm[8, ]
#  vot  K Vpn Alter
#8 -13 pa   B  Kind
#
# Sprecher ist B, K = pa (daher x = 1)
# eingeschaetzter Wert:
# yhut = (Random.m + Fixed.m) x + (Random.k + Fixed.k)
yhut = (1.1124886 + 3.900090) * 1 + (-16.549963 - 2.432357)
yhut
# [1] -13.96974
# das gleiche:
fitted(stimm.lmer)[8]
# -13.96974
# der tatsaechliche Wert -13 (siehe stimm[8,])

#######################################################################
# 4. Mehr zu Random factors und die Wahl
# zwischen (FF|RF) und (1|RF)
#######################################################################

# Zwei Moeglichkeiten,
# um einen Random factor zu deklarieren: (FF|RF) oder (1|RF).

head(soa)
# Drei Sprecher produzierten "Bad", "Pfad", "Start"
# entweder in phrasenmedialer oder -finaler Position.
# Inwiefern wird F1 im Vokal von der Phrasenposition beeinflusst?
#
# Abhaengige Variable: F1
# Fixed Factor:  Pos (medial/final)
# Random Factors: Vpn, W (Versuchsperson, Wort)
#
# Daher 4 Moeglichkeiten:
# 1.
soa.lmer = lmer(F1 ~ Pos + (Pos | Vpn) + (Pos | W), data = soa)
# oder 2.
soa.lmer = lmer(F1 ~ Pos + (1 | Vpn) + (Pos | W), data = soa)
# oder 3.
soa.lmer = lmer(F1 ~ Pos + (Pos | Vpn) + (1 | W), data = soa)
# oder 4.
soa.lmer = lmer(F1 ~ Pos + (1 | Vpn) + (1 | W), data = soa)

# Grundsaetzlich (FF|RF) verwenden (daher 1.),
# es sei denn FF ist eindeutig 'between' im Bezug zu RF.
# Fuer das obige Beispiel ist FF (Pos) 'within' im Bezug zu RF Vpn:
with(soa, table(Vpn, Pos))
# FF ist auch 'within' im Bezug zu Wort
with(soa, table(W, Pos))

# also hier:
soa.lmer = lmer(F1 ~ Pos + (Pos | Vpn) + (Pos | W), data = soa)

# Die Bedeutung von (FF|RF)
# +++++++++++++++++++++++++++++
# 1. Eine Steigung RF.m und Intercept RF.k werden berechnet
# 2. (Wichtiger): die Variabilitaet vom RF wird ausgeklammert,
# unter der Annahme dass RF und FF interagieren koennten.

# d.h. mit (Pos|Vpn) wird geprueft,
# inwiefern Pos und Vpn miteinander interagieren:


ggplot(soa) +
  aes(y = F1, x = Pos) +
  geom_boxplot() +
  facet_wrap(~ Vpn)

# Ebenfalls mit (Pos|W) wird geprueft, inwiefern Pos und W miteinander interagieren"

ggplot(soa) +
  aes(y = F1, x = Pos) +
  geom_boxplot() +
  facet_wrap(~ W)




# Die Bedeutung von (1|RF)
# +++++++++++++++++++++++++++++++++++++++++++++++++++++
# 1. Ein Intercept RF.k (aber keine Steigung) wird berechnet.
# 2. (Wichtiger): die Variabilitaet vom RF wird ausgeklammert,
# ohne dass RF und FF interagieren.
#
# (1|RF) soll verwendet werden, wenn der FF 'between' ist im Bezug zum RF. z.B.
head(stimm)
# Inwiefern wird vot vom Alter beeinflusst?
# Fixed factor: Alter
# Random factor: Vpn
# Alter ist between im Bezug zu Vpn:
with(stimm, table(Vpn, Alter))
#
# Alter und Vpn koennen nicht interagieren, da jede Vpn
# entweder Kind oder Erw ist (wie folgender,
# an sich nicht uebermaeßig sinnvoller
# Plot zeigt):
ggplot(stimm) + 
  aes(y = vot, x = Alter) + 
  geom_boxplot() + 
  facet_wrap( ~ Vpn)


# Daher waere  (Alter|Vpn) sinnlos - da dies voraussetzt,
# dass Alter und Vpn interagieren koennen,
# was nicht moeglich ist, wenn FF 'between' ist
# in Bezug zum RF. Daher:
stimm3 = lmer(vot ~ Alter + (1 | Vpn), data = stimm)
# und nicht (Alter|Vpn)

# Im allgemeinen: immer (FF|RF) verwenden,
# abgesehen von dem Fall, in dem FF wirklich
# 'between' ist in Bezug zu RF

#######################################################################
#  5. Mehr als ein Fixed Factor
#######################################################################

dim(stimm)
# VOT wurde in /ba, pa/ von Kindern und Erwachsenen produziert.
# Inwiefern wird "VOT"
# von der Artikulationsstelle (Faktor "K")
# und/oder von der Sprechergruppe
# (ob Kind oder Erwachsener: Faktor "Alter") beeinflusst?

# K ist 'within' im Bezug zu Vpn: daher (K|Vpn)
with(stimm, table(Vpn, K))

# Alter ist 'between' im Bezug zu Vpn daher (1|Vpn).
with(stimm, table(Vpn, Alter))

# (K|Vpn) enthaelt aber bereits (1|Vpn)
# Weil (K|Vpn) bedeutet:
# random-slope und random-intercept berechnen;
# und (1|Vpn) bedeutet: nur random-intercept berechnen.
# Daher (K|Vpn) und NICHT (K|Vpn) + (1|Vpn)

# Zusaetzlich fuer zwei fixed factors:
# K * Alter (bedeutet K, Alter, und deren Interaktion).
# K * Alter ist dasselbe wie: K + Alter + K:Alter
stimm.lmer = lmer(vot ~ K * Alter + (K | Vpn), data = stimm)
# Oder
stimm.lmer = lmer(vot ~ K + Alter + K:Alter + (K | Vpn), data = stimm)


# 2.
dim(int)
# 10 Sprecher (Vpn) davon Maenner und Frauen (Faktor G)
# produzierten zwei Vokale (Faktor V),
# und die Intensitaet wurde gemessen (db).
# Die Vokale kamen in verschiedenen Woertern vor.
# Inwiefern wird die Intensitaet
# vom Vokal und vom Geschlecht beeinflusst?

# Fixed factors: V, G
# Random factors: Wort, Vpn
#
# V ist 'within' im Bezug zu Wort. Daher (V|Wort)
with(int, table(Wort, V))
#  V ist 'within' im Bezug zu Vpn. Daher (V|Vpn)
with(int, table(Vpn, V))
# G ist 'within' im Bezug zu Wort. Daher (G|Wort)
with(int, table(Wort, G))
# G ist 'between' im Bezug zu Vpn. Daher (1|Vpn)
with(int, table(Vpn, G))
# Zusammen: (V+G|Wort) + (V|Vpn)
# und NICHT (V|Wort) + (G|Wort) + (V|Vpn) + (1|Vpn)
# also, die Faktoren, deren Einfluss ausgeklammert
# werden soll (hier also Wort und Vpn),
# sollen nur einmal in der Formel auftauchen
# Daher:
int.lmer = lmer(db ~ V * G + (V + G | Wort) + (V | Vpn), data = int)
# V * G = V + G + V:G
ggplot(int) +
  aes(y = db, x = G, col = V) +
  geom_boxplot()

ggplot(int, aes(x = V, y = db)) +
  #facet_grid(~Wort) +
  geom_line(aes(group = Vpn, color = factor(Vpn)))



######################################################################
# 6. Die Pruefstatistik
######################################################################
# Die step() Funktion
# (a) vereinfacht das Modell wenn moeglich
# (b) prueft, ob die Faktoren in dem vereinfachten Modell signifikant sind.

# VOT wurde in /ba, pa/ von Kindern und Erwachsenen produziert.
# Inwiefern wird VOT von der Artikulationsstelle (Faktor K) und/oder
# von der Sprechergruppe (ob Kind oder Erwachsen: Faktor Alter) beeinflusst?
# Bild
ggplot(stimm) + 
  aes(y = vot, x = K) + 
  geom_boxplot() + 
  facet_wrap( ~ Alter)

# Mixed Model
stimm.lmer = lmer(vot ~ K * Alter + (K | Vpn), data = stimm)
stimm.step = step(stimm.lmer)
stimm.step
# Teil (a): Modell-Vereinfachung
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Brauchen wir wirklich K + Alter + K:Alter + (K|Vpn)?

# Backward reduced random-effect table:
#   
#   Eliminated npar  logLik    AIC    LRT Df Pr(>Chisq)  
# <none>                       8 -297.30 610.59                       
# K in (K | Vpn)          0    6 -299.82 611.64 5.0439  2     0.0803 .
# ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


# 1. Random effects ist fast signifikant (p = 0.08).
# Daher wird (K|Vpn) behalten. Daher '0' bei 'eliminated'
# d.h. (K|Vpn) wurde nicht durch (1|Vpn) ersetzt.

# 2. Bei den Fixed effects.
# K:Alter und Alter sind nicht signifikant,
# und wurden aus dem Modell entfernt. Aber Faktor K bleibt ('kept').
# Backward reduced fixed-effect table:
#   Degrees of freedom method: Satterthwaite 
# 
# Eliminated  Sum Sq Mean Sq NumDF DenDF F value    Pr(>F)    
# K:Alter          1   1.547   1.547     1     6  0.3511 0.5751381    
# Alter            2   3.305   3.305     1     6  0.7501 0.4197122    
# K                0 180.861 180.861     1     7 41.0563 0.0003647 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Das vereinfachte Modell aus 1. und 2. war
# siehe in stimm.stepp "model found":
#Model found:
#  vot ~ K + (K | Vpn)
get_model(stimm.step)
# ==
lmer(vot ~  K + (K | Vpn), data = stimm)

# wie auch ganz unten berichtet:
stimm.step


# Teil B: Die Pruefstatistik
# ++++++++++++++++++++++++++
# ist fuer das vereinfachte Modell:
anova(get_model(stimm.step))
#Type III Analysis of Variance Table with Satterthwaite's method
#  Sum Sq Mean Sq NumDF DenDF F value    Pr(>F)    
#K 180.86  180.86     1     7  41.056 0.0003647 ***
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

# wie man auch hier sieht (vgl. mit der letzten Zeile):
stimm2.lmer = lmer(vot ~  K + (K | Vpn), data = stimm)
anova(stimm2.lmer)
# Sum Sq Mean Sq NumDF DenDF F.value    Pr(>F)
# K 180.86  180.86     1     7  41.056 0.0003647 ***

# Daher die Schlussfolgerung:
#  VOT wurde signifikant von der Artikulationsstelle
# (F[1, 7] = 41.1, p < 0.001) jedoch
# nicht vom Alter beeinflusst, und
# es gab auch keine Interaktion zwischen diesen Faktoren.

# Ein ähnliches, aber nicht identisches Ergebnis bekommt man, wenn man anova() 
# direkt auf das ursprüngliche Modell anwendet (F wird kleiner, p daher groesser)
anova(stimm.lmer)
#Type III Analysis of Variance Table with Satterthwaite's method
#         Sum Sq Mean Sq NumDF DenDF F value   Pr(>F)   
#K       146.223 146.223     1     6 33.1933 0.001192 **
#Alter     2.204   2.204     1     6  0.5003 0.505889   
#K:Alter   1.547   1.547     1     6  0.3511 0.575138   
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

# Die Methode mit step() und anova(get_model(MODELL.step)) ist vorzuziehen;
# leider scheitert sie bei manchen Modellen (Fehlermeldung), und muss dann durch
# die Anwendung von anova() auf das ursprünglich erdachte Modell ersetzt werden.




######################################################################
# 7. Post-hoc Tests
######################################################################
# Wenn fixed factors interagieren, sollen aehnlich wie in der Varianzanalyse
# post-hoc tests durchgefuehrt werden.

head(int)
# 10 Sprecher produzierten 6 verschiedene Woerter
# entweder mit einem /i/ oder /a/ Vokal (Faktor V).
# Die Intensitaet wurde (db) wurde pro Vokal gemessen.

# Wir hatten festgestellt, dass V und G 'within' sind
# im Bezug zu Wort und nur V ist 'within' im Bezug zu Vpn.
# Daher hatten wir:
int.lmer = lmer(db ~ V * G + (V + G | Wort) + (V | Vpn), data = int)
int.step = step(int.lmer)
int.step
# Das vereinfachte Modell:
#Model found:
#  db ~ V + G + (V | Vpn) + (1 | Wort) + V:G
anova(get_model(int.step))

# Es gibt eine signifikante Interaktion:
#Type III Analysis of Variance Table with Satterthwaite's method
#     Sum Sq Mean Sq NumDF DenDF F value    Pr(>F)    
#V   126.660 126.660     1     8 29.8298 0.0006003 ***
#G    47.313  47.313     1     8 11.1428 0.0102603 *  
#V:G  31.969  31.969     1     8  7.5291 0.0252958 *  
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#  Daher post-hoc test anwenden (mit dem package emmeans).
# Hierfür nehmen wir a) das reduzierte Modell aus get_model(int.step)
#                    b) und stecken es in pairs(emmeans())
library(emmeans)
int.ph = pairs(emmeans(get_model(int.step),  ~ V:G))
int.ph

# wie von anderen post-hoc-Tests bekannt, koennen wir die Funktion phsel() benutzen, um nur die relevanten
# Vergleiche auszuwaehlen:

phsel(int.ph, 1)
#        adj.method        t df    prob.adj sig
#a:f-i:f      tukey 1.921743  8 0.291886578    
#a:m-i:m      tukey 5.802222  8 0.001810568  **
phsel(int.ph, 2)
#        adj.method         t df   prob.adj sig
#a:f-a:m      tukey -3.965322  8 0.01744736   *
#i:f-i:m      tukey -2.143688  8 0.21865058    

# Post-hoc Tukey korrigierte t-tests zeigten
# signikante Unterschiede zwischen /i/ und /a/ in
# Maennern (p < 0.01), jedoch nicht in Frauen,
# und signifikante Unterschiede zwischen Maennern und Frauen
# in /a/ (p < 0.05) jedoch nicht in /i/.


#Zusammenfassung:
#Bedingung: Sie haben relativ viele Beobachtungen in NICHTGEMITTELT.df
#1. Sie haben eine numerische abhaengige Variable (AV)
#2. Sie haben mehrere unabhaengige Variablen (UV), von denen mindestens eine
#   ausgeklammert werden soll (die Random Factors (RV),
#   die anderen heißen Fixed Factors (FF))

# dann koennen Sie, bzw. muessen Sie
# (muessen, wenn mehr als 2 RFs da sind,
# oder wenn Sie fehlende Werte haben), ein Mixed Model anwenden:

#--> NG.lmer=lmer(AV~FF1 * FF2 ...
#            + (FF1+FF2|RF1) + (FF1+FF2|RF2),
#            data=NICHTGEMITTELT.df)
# wenn FF1 und FF2 jeweils "within" in bezug zu RF1 bzw. RF2 sind
# ist z.B. FF1 in Bezug zu RF1 "between" --> (1|RF1)
#
# dann: NG.step=step(NG.lmer)
# wenn das klappt: anova(get_model(NG.step)), ansonsten zur Not anova(NG.lmer)
# ggf.: post-hoc testen:
#       NG.ph = pairs(emmeans(get_model(NG.step), ~FF1:FF2)) 
#       oder, falls step() scheitert:
#       NG.ph = pairs(emmeans(NG.lmer),~FF1:FF2)
# Paare auswaehlen:
#       phsel(NG.ph,1)
#       phsel(NG.ph,2) ...
# Bericht schreiben ...




# Nachwort:
# Wir muessen immer beachten, dass wir genuegend Beobachtungen haben.
# Was "genuegend" ist, haengt auch von der Anzahl der Faktoren (fixed und random) ab: bei
# nur einem Fixed und nur einem Random Factor geht man als Faustregel von mindestens 
# 60 Beobachtungen aus. Aber:
# Nicht immer wird der lmer()-Befehl scheitern, wenn man eigentlich laut dieser Faustregel 
# zuwenige Beobachtungen hat.
# Z.B. oben hatten wir
soa.lmer = lmer(F1 ~ Pos + (Pos | Vpn) + (Pos | W), data = soa)
#... und das funktionierte nur MIT Warnmeldung!
# Tatsächlich hat soa nur 18 Beobachtungen:
soa
# ... und das sind sicherlich zu wenige, insbesondere bei drei unabhaengigen Variablen
# (1xFF, 2xRF)
# Eine ausführlichere Warnmeldung erhalten wir erst bei Anwendung von step()
step(soa.lmer)
#u.a.
#Warnmeldungen:
#     1: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :
#         unable to evaluate scaled gradient
#     2: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :
#         Model failed to converge: degenerate  Hessian with 1 negative eigenvalues

# Da wir zuwenige Beobachtungen fuer ein Mixed Model haben,
# sollten wir stattdessen eine Varianzanalyse durchfuehren
# (hier auch nicht unkritisch: zuerst muessen wir ja mitteln, da eine Anova nur einen einzigen 
# Random Factor erlaubt, 
# z.B. hier mitteln ueber Wort.
# dann verbleiben fuer den Vergleich nur 3(Vpn)*2(Pos) = 6 Werte).
# Da wir nur einen Faktor mit nur zwei Stufen haben, könnten wir sogar einen
# gepaarten t-Test durchführen:

soa.m = soa %>%
  group_by(Vpn,Pos) %>%
  summarise(F1 = mean(F1))

soa.diff = soa.m %>%
  group_by(Vpn) %>%
  summarise(F1 = diff(F1))

shapiro.test(soa.diff$F1)
t.test(soa.diff$F1)

# Dieser wäre allerdings - obwohl formal die Voraussetzungen eingehalten werden - recht fragwürdig
# (Bedenken Sie: Wir testen mit lediglich drei (!!) Zahlen, ob diese signifikant von 0 abweichen)

# Weitere Anmerkungen:
# Die Fixed Factors in MMs
# koennen kategorial sein (also Faktoren mit Stufen),
# aber auch numerisch (wie bei lm() )
#Drittens:
# Es gibt auch den Fall, dass die
# abhaengige Variable nicht numerisch, sondern kategorial ist.
# Der Befehl heißt dann statt lmer() glmer() (generalized linear mixed effects regression models)
# (vgl. lm() und glm() )
# ABER: glmer() kommt in diesem Seminar nicht vor!!
# Bedenken Sie aber, dass das einem Mixed Model mit logistischer Regression entspricht.
# Sollten Sie ein solches Modell für Ihre Abschlussarbeit benötigen, melden Sie sich bitte
# bei einem der Herren Harrington / Reubold.


