Rmd

Mittelwert als Modell (vgl. Field (2012, p. 36) )

Lineare Modelle können verglichen werden.

Mittelwert ist auch das Einfachmodell (0-Modell) bei Modellvergleichen.

Verglichene Modelle müssen hierarchisch sein, d. h. ein Modell muss Teilmodell bzw. Erweiterung des anderen sein.

Modellbewertung über AIC (Akaike Information Criterion) bzw. BIC (Baysian Information Criterion).

Die beiden Informationskriterien können für ein existierendes Modell abgerufen werden.

Prinzip: Ein erweitertes Modell, das das Informationskriterium senkt, wird vorgezogen.

Automatisches Vorgehen (stepwise). In R über Package ‘MASS’ möglich.

Einführendes Beispiel: PACS und BMI

Hier wird aufgebaut auf lm_mult Rmd, html

Einführendes Beispiel mit Kommentaren und Hintergründen.

Zu Daten und das Beispiel vergleiche body_comparison Rmd, html

Fragestellung: - Wie gut lässt sich die Subjektive Vergleichsintensität vorhersagen durch den Vergleich des Körperbaus? - Welchen Beitrag kann der Abitur-Schnitt (grade) und das Geschlecht zusätzlich zur Vorhersage leisten? - Wie gut kann die Subjektive Vergleichsintensität (Attraktivität) vorhergesagt werden durch das Erheben von Einzelaspekten hierzu?

Potenzielle erklärende Variablen: 5 Fragen zu einzelnen Aspekten, Abi-Note, Geschlecht.

Daten einlesen, deskriptive Daten, erster grafischer Eindruck

dd <- read.delim("http://md.psych.bio.uni-goettingen.de/mv/data/virt/v_bmi_preprocessed.txt", fileEncoding = "UTF-8")
attach(dd)
require(psych)
## Loading required package: psych
p_items <- c('c_phys_app', 'c_good_way', 'c_dress', 'c_bad_way', 'c_figure')

# a correlation matrix
cor(cbind(dd$pacs, dd[p_items]))
##               dd$pacs c_phys_app c_good_way    c_dress  c_bad_way   c_figure
## dd$pacs     1.0000000  0.9011681  0.9152262  0.9229043 -0.9641185  0.8732866
## c_phys_app  0.9011681  1.0000000  0.7675161  0.8699426 -0.8450965  0.6739475
## c_good_way  0.9152262  0.7675161  1.0000000  0.7911833 -0.8468327  0.7777649
## c_dress     0.9229043  0.8699426  0.7911833  1.0000000 -0.8790725  0.6922335
## c_bad_way  -0.9641185 -0.8450965 -0.8468327 -0.8790725  1.0000000 -0.8324704
## c_figure    0.8732866  0.6739475  0.7777649  0.6922335 -0.8324704  1.0000000
# an overview of relevant scales
pairs.panels(cbind(dd$pacs, dd[p_items]))

# gender specific
pairs(cbind(dd$pacs, dd[p_items]),panel=function(x,y) text(x,y,gender))

detach(dd)

Rein additives lineares Modell spezifizieren und anpassen

Additives Modell, herantasten über AIC und BIC.

Die Informationskriterien werden kleiner, wenn das erweiterte Modell ‘besser’ ist.

dd <- read.delim("http://md.psych.bio.uni-goettingen.de/mv/data/virt/v_bmi_preprocessed.txt", fileEncoding = "UTF-8")
attach(dd)

# constant only, 0 model
m.0 <- lm(pacs ~ 1)
AIC(m.0)
## [1] 102.75
BIC(m.0)
## [1] 105.5524
# this is mean
mean(pacs)
## [1] 3.18
# model with one explanatory variable c_figure. 1 included for constant term. Usually done automatically. 
m.1 <- lm(pacs ~ 1 + c_figure)
# same model:
m.1 <- lm(pacs ~ c_figure)
AIC(m.1)
## [1] 61.60602
BIC(m.1)
## [1] 65.80961
# model with one more explanatory variable grade
m.2 <- lm(pacs ~ 1 + c_figure + grade)
AIC(m.2)
## [1] 60.26922
BIC(m.2)
## [1] 65.87401
# model with three explanatory variables. We add dichotomous variable gender.
m.3 <- lm(pacs ~ 1 + c_figure + grade + gender)
AIC(m.3)
## [1] 61.1994
BIC(m.3)
## [1] 68.20539
# model tests. Test increase of explained variance
anova(m.0, m.1)
## Analysis of Variance Table
## 
## Model 1: pacs ~ 1
## Model 2: pacs ~ c_figure
##   Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
## 1     29 47.228                                  
## 2     28 11.211  1    36.017 89.959 3.054e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(m.1, m.2)
## Analysis of Variance Table
## 
## Model 1: pacs ~ c_figure
## Model 2: pacs ~ 1 + c_figure + grade
##   Res.Df   RSS Df Sum of Sq      F  Pr(>F)  
## 1     28 11.21                              
## 2     27 10.03  1    1.1801 3.1765 0.08595 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(m.2, m.3)
## Analysis of Variance Table
## 
## Model 1: pacs ~ 1 + c_figure + grade
## Model 2: pacs ~ 1 + c_figure + grade + gender
##   Res.Df     RSS Df Sum of Sq      F Pr(>F)
## 1     27 10.0305                           
## 2     26  9.6791  1   0.35139 0.9439 0.3402
detach(dd)

Stepwise

Exploratives Vorgehen, bei dem die potenziell beste Kombination von Prädiktoren automatisch gesucht wird. Automatisiertes, exploratives Vorgehen mit stepwise() aus dem Paket ‘MASS.’

Als Bewertungskriterium kommen BIC (Default) oder AIC zum Einsatz. Es wird im Output immer AIC angezeigt, auch wenn BIC das Kriterium ist.

Die library(Rcmdr) implementiert ein Frontend auf stepAIC der library(MASS) mit dem Befehl stepwise. Auf jeder Stufe des Auswahlprozesses werden alle verbliebenen Variablen in ihren potenziellen Auswirkungen geprüft. Unterschied zwischen ‘forward/backward’ und ‘forward’: ‘forward/backward’ prüft bei jedem Schritt auch die Herausnahme von bereits aufgenommenen Prädiktoren in ihren Auswirkungen auf das Kriterium, während bei ‘forward’ nur die potenzielle Hinzunahme der verbleibenden Prädiktoren in ihren Auswirkungen auf das Kriterium geprüft wird. Der Unterschied ‘backward/forward’ und ‘backward’ ist analog. Siehe help(stepwise).

Das Beispiel hier läuft direkt mit stepAIC. Der Parameter k entscheidet über die ‘Bestrafung’ für das Verbrauchen eines Freiheitsgrades. Bei AIC ist k=2 (Default). BIC bzw. SBC kann über k=log(n) angefordert werden.

Wegen Render-Schwierigkeiten sind die Rcmdr-Befehle hier auskommentiert.

# Example using Rcmdr
dd <- read.delim("http://md.psych.bio.uni-goettingen.de/mv/data/virt/v_bmi_preprocessed.txt", fileEncoding = "UTF-8")
#attach(dd)
p_items <- c('c_phys_app', 'c_good_way', 'c_dress', 'c_bad_way', 'c_figure')

# packages MASS is necessary
require("MASS")
## Loading required package: MASS
# model with all explanatory variables pacs answers
m.5 <- lm(bodysatisf ~ c_phys_app + c_good_way + c_dress + c_bad_way + c_figure, data=dd)

# forward/backward, criterion AIC, 
# begin with constant and add appropriate variables
#stepwise(m.5, direction='forward/backward', criterion='AIC')
stepAIC(m.5, direction='both', scope = list(upper = ~ c_phys_app + c_good_way + c_dress + c_bad_way + c_figure, lower = ~ 1))
## Start:  AIC=145.74
## bodysatisf ~ c_phys_app + c_good_way + c_dress + c_bad_way + 
##     c_figure
## 
##              Df Sum of Sq    RSS    AIC
## - c_bad_way   1    167.78 2756.9 145.62
## <none>                    2589.1 145.74
## - c_phys_app  1    208.69 2797.8 146.06
## - c_figure    1    250.29 2839.4 146.50
## - c_dress     1    259.36 2848.5 146.60
## - c_good_way  1    562.61 3151.7 149.63
## 
## Step:  AIC=145.62
## bodysatisf ~ c_phys_app + c_good_way + c_dress + c_figure
## 
##              Df Sum of Sq    RSS    AIC
## - c_dress     1    134.50 2891.4 145.05
## <none>                    2756.9 145.62
## + c_bad_way   1    167.78 2589.1 145.74
## - c_phys_app  1    330.10 3087.0 147.01
## - c_figure    1    697.16 3454.0 150.38
## - c_good_way  1    761.32 3518.2 150.94
## 
## Step:  AIC=145.05
## bodysatisf ~ c_phys_app + c_good_way + c_figure
## 
##              Df Sum of Sq    RSS    AIC
## - c_phys_app  1    195.81 3087.2 145.01
## <none>                    2891.4 145.05
## + c_dress     1    134.50 2756.9 145.62
## + c_bad_way   1     42.92 2848.5 146.60
## - c_good_way  1    641.21 3532.6 149.06
## - c_figure    1    644.28 3535.7 149.08
## 
## Step:  AIC=145.01
## bodysatisf ~ c_good_way + c_figure
## 
##              Df Sum of Sq    RSS    AIC
## <none>                    3087.2 145.01
## + c_phys_app  1    195.81 2891.4 145.05
## + c_bad_way   1    176.98 2910.2 145.24
## + c_dress     1      0.20 3087.0 147.01
## - c_figure    1    817.03 3904.2 150.06
## - c_good_way  1   1470.04 4557.2 154.70
## 
## Call:
## lm(formula = bodysatisf ~ c_good_way + c_figure, data = dd)
## 
## Coefficients:
## (Intercept)   c_good_way     c_figure  
##       7.676        8.047        5.897
#require("Rcmdr")
# compare forward
#stepwise(m.5, direction='forward', criterion='AIC')

# forward/backward, criterion AIC, 
# begin with all variables and take one variable out of model at each step
#stepwise(m.5, direction='backward/forward', criterion='AIC')


# criterion="BIC" 
# Note that stepAIC labels the criterion in the output as "AIC" regardless of which criterion is employed.
# forward/backward, criterion BIC, 
# begin with all variables and take one variable out of model at each step
#stepwise(m.5, direction='backward/forward', criterion='BIC')


#detach(dd)

Vorhersage subjektiver PACS, auch mit Interaktionsterm

Mit den drei Vorhersagevariablen c_figure, grade, gender

dd <- read.delim("http://md.psych.bio.uni-goettingen.de/mv/data/virt/v_bmi_preprocessed.txt", fileEncoding = "UTF-8")
#attach(dd)
# packages MASS is necessary
require("MASS")

m.3 <- lm(bodysatisf ~ 1 + c_figure * grade * gender, data=dd)

# forward/backward, criterion AIC, 
# begin with constant and add appropriate variables
# stepwise(m.3, direction='forward/backward', criterion='AIC')
stepAIC(m.3, direction='both', scope = list(upper = ~ c_figure * grade * gender, lower = ~ 1))
## Start:  AIC=139.86
## bodysatisf ~ 1 + c_figure * grade * gender
## 
##                         Df Sum of Sq    RSS    AIC
## - c_figure:grade:gender  1    62.771 1925.9 138.86
## <none>                               1863.1 139.87
## 
## Step:  AIC=138.86
## bodysatisf ~ c_figure + grade + gender + c_figure:grade + c_figure:gender + 
##     grade:gender
## 
##                         Df Sum of Sq    RSS    AIC
## - c_figure:grade         1      0.85 1926.8 136.87
## - grade:gender           1    121.31 2047.2 138.69
## <none>                               1925.9 138.86
## + c_figure:grade:gender  1     62.77 1863.1 139.87
## - c_figure:gender        1   1583.48 3509.4 154.86
## 
## Step:  AIC=136.87
## bodysatisf ~ c_figure + grade + gender + c_figure:gender + grade:gender
## 
##                   Df Sum of Sq    RSS    AIC
## - grade:gender     1    121.17 2047.9 136.70
## <none>                         1926.8 136.87
## + c_figure:grade   1      0.85 1925.9 138.86
## - c_figure:gender  1   1749.73 3676.5 154.25
## 
## Step:  AIC=136.7
## bodysatisf ~ c_figure + grade + gender + c_figure:gender
## 
##                   Df Sum of Sq    RSS    AIC
## <none>                         2047.9 136.70
## + grade:gender     1    121.17 1926.8 136.87
## - grade            1    213.85 2261.8 137.68
## + c_figure:grade   1      0.70 2047.2 138.69
## - c_figure:gender  1   1791.54 3839.5 153.56
## 
## Call:
## lm(formula = bodysatisf ~ c_figure + grade + gender + c_figure:gender, 
##     data = dd)
## 
## Coefficients:
##      (Intercept)          c_figure             grade           genderm  
##           39.232             5.609            -4.413           -34.047  
## c_figure:genderm  
##           11.423
#detach(dd)

mehr zu Interaktionstermen mehr unter lm_moderation Rmdhtml

Ausflug: R-Commander

R-Commander unterstütze Modellvergleiche komfortabel.

Vorgehen:

Beispiele Übungen / Exercises

Trait-Angst und Persönlichkeit

Ermitteln Sie ein geeignetes Modell zur Vorhersage der Trait-Angst mittels der Big-Five-Persönlichkeitsfaktoren. Datensatz ist ‘epi.bfi’ aus dem Paket Psych.

Kurzbeschreibung bzw. über help(epi.bfi)

# we need package psychTools, it includes the data epi.bfi
# read data
dd <- psychTools::epi.bfi

Car wash time, Beispiel aus Everitt