
Martijn Wieling
University of Groningen
R
R
: logit(p)
(from library car
)R
: plogis(x)
)
head(eye)
# Subject Item TargetDefinite TargetNeuter TargetColor TargetPlace CompColor
# 1 S300 boom 1 0 green 3 brown
# 2 S300 bloem 1 0 red 4 green
# 3 S300 anker 1 1 yellow 3 yellow
# 4 S300 auto 1 0 green 3 brown
# 5 S300 boek 1 1 blue 4 blue
# 6 S300 varken 1 1 brown 1 green
# CompPlace TrialID Age IsMale Edulevel SameColor SameGender TargetFocus CompFocus
# 1 2 1 52 0 1 0 1 43 41
# 2 2 2 52 0 1 0 0 100 0
# 3 2 3 52 0 1 1 1 73 27
# 4 2 4 52 0 1 0 0 100 0
# 5 3 5 52 0 1 1 0 12 21
# 6 3 6 52 0 1 0 0 0 51
lme4
version 1.1.31)library(lme4)
model1 <- glmer(cbind(TargetFocus, CompFocus) ~ (1 | Subject) + (1 | Item), data = eye,
family = "binomial") # intercept-only model
summary(model1) # slides only show relevant part of the summary
# Random effects:
# Groups Name Std.Dev.
# Item (Intercept) 0.326
# Subject (Intercept) 0.588
#
# Fixed effects:
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) 0.848 0.121 7.02 2.26e-12 ***
fixef(model1) # show fixed effects
# (Intercept)
# 0.848
plogis(fixef(model1)["(Intercept)"])
# (Intercept)
# 0.7
model0 <- glmer(cbind(TargetFocus, CompFocus) ~ (1 | Subject), data = eye, family = "binomial")
anova(model0, model1) # random intercept for item is necessary
# Data: eye
# Models:
# model0: cbind(TargetFocus, CompFocus) ~ (1 | Subject)
# model1: cbind(TargetFocus, CompFocus) ~ (1 | Subject) + (1 | Item)
# npar AIC BIC logLik deviance Chisq Df Pr(>Chisq)
# model0 2 128304 128315 -64150 128300
# model1 3 125387 125404 -62690 125381 2919 1 <2e-16 ***
# ---
# Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
glmer
is ML
(i.e. refit
in anova
unnecessary)model2 <- glmer(cbind(TargetFocus, CompFocus) ~ SameColor + (1 | Subject) + (1 | Item),
data = eye, family = "binomial")
summary(model2)$coef # show only fixed effects
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) 1.68 0.1209 13.9 <2e-16 ***
# SameColor -1.48 0.0118 -125.5 <2e-16 ***
SameColor
as this effect will be the most dominant SameColor
varies per subject
model3 <- glmer(cbind(TargetFocus, CompFocus) ~ SameColor + (1 + SameColor | Subject) +
(1 | Item), data = eye, family = "binomial") # always: (1 + factorial predictor | ranef)
anova(model2, model3)$P[2] # random slope necessary (p-value is so low that R shows 0)
# [1] 0
summary(model3)
# Random effects:
# Groups Name Std.Dev. Corr
# Item (Intercept) 0.359
# Subject (Intercept) 1.251
# SameColor 0.949 -0.95
#
# Fixed effects:
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) 1.89 0.246 7.68 1.58e-14 ***
# SameColor -1.71 0.184 -9.28 <2e-16 ***
model4 <- glmer(cbind(TargetFocus, CompFocus) ~ SameColor + SameGender + (1 + SameColor |
Subject) + (1 | Item), data = eye, family = "binomial")
summary(model4)$coef
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) 1.8536 0.2460 7.54 4.87e-14 ***
# SameColor -1.7124 0.1845 -9.28 <2e-16 ***
# SameGender 0.0742 0.0115 6.47 9.97e-11 ***
model5 <- glmer(cbind(TargetFocus, CompFocus) ~ SameColor + SameGender + TargetNeuter +
(1 + SameColor | Subject) + (1 | Item), data = eye, family = "binomial")
summary(model5)$coef # contrast is not significant
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) 1.9398 0.2513 7.72 1.18e-14 ***
# SameColor -1.7125 0.1848 -9.27 <2e-16 ***
# SameGender 0.0742 0.0115 6.47 9.92e-11 ***
# TargetNeuter -0.1723 0.1015 -1.70 0.090
anova(model4, model5)$P[2] # noun type contrast by itself is not needed in a better model
# [1] 0.0944
model6 <- glmer(cbind(TargetFocus, CompFocus) ~ SameColor + SameGender * TargetNeuter +
(1 + SameColor | Subject) + (1 | Item), data = eye, family = "binomial")
summary(model6)$coef
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) 2.067 0.2515 8.22 2.04e-16 ***
# SameColor -1.716 0.1848 -9.29 <2e-16 ***
# SameGender -0.174 0.0164 -10.63 <2e-16 ***
# TargetNeuter -0.416 0.1026 -4.05 5.14e-05 ***
# SameGender:TargetNeuter 0.487 0.0230 21.24 <2e-16 ***
anova(model4, model6)$P[2]
# [1] 1.74e-99
par(mfrow = c(1, 2))
visreg(model6, "SameGender", by = "TargetNeuter", overlay = T) # from library(visreg)
visreg(model6, "SameGender", by = "TargetNeuter", overlay = T, trans = plogis)
eye$TargetColor <- relevel(eye$TargetColor, "brown") # set specific reference level
model7 <- glmer(cbind(TargetFocus, CompFocus) ~ SameColor + SameGender * TargetNeuter +
TargetColor + (1 + SameColor | Subject) + (1 | Item), data = eye, family = "binomial")
summary(model7)$coef # inclusion warranted (anova: p = 0.005; not shown)
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) 2.0528 0.2485 8.26 1.43e-16 ***
# SameColor -1.7165 0.1846 -9.30 <2e-16 ***
# SameGender -0.1743 0.0164 -10.63 <2e-16 ***
# TargetNeuter -0.4155 0.0880 -4.72 2.32e-06 ***
# TargetColor1 -0.3453 0.0936 -3.69 0.000225 ***
# TargetColor2 -0.0702 0.0860 -0.82 0.414
# TargetColor3 0.1484 0.0861 1.72 0.085
# TargetColor4 0.1108 0.0860 1.29 0.197
# SameGender:TargetNeuter 0.4877 0.0230 21.24 <2e-16 ***
summary(glht(model7,linfct=mcp(TargetColor = "Tukey"))) # from library(multcomp)
#
# Simultaneous Tests for General Linear Hypotheses
#
# Multiple Comparisons of Means: Tukey Contrasts
#
#
# Fit: glmer(formula = cbind(TargetFocus, CompFocus) ~ SameColor + SameGender *
# TargetNeuter + TargetColor + (1 + SameColor | Subject) +
# (1 | Item), data = eye, family = "binomial")
#
# Linear Hypotheses:
# Estimate Std. Error z value Pr(>|z|)
# blue - brown == 0 0.27509 0.14328 1.92 0.3063
# green - brown == 0 0.49376 0.14337 3.44 0.0052 **
# red - brown == 0 0.45611 0.14327 3.18 0.0126 *
# yellow - brown == 0 0.50160 0.14328 3.50 0.0042 **
# green - blue == 0 0.21867 0.13516 1.62 0.4856
# red - blue == 0 0.18102 0.13506 1.34 0.6657
# yellow - blue == 0 0.22652 0.13506 1.68 0.4478
# red - green == 0 -0.03764 0.13516 -0.28 0.9987
# yellow - green == 0 0.00785 0.13516 0.06 1.0000
# yellow - red == 0 0.04549 0.13506 0.34 0.9972
# ---
# Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# (Adjusted p values reported -- single-step method)
eye$TargetBrown <- (eye$TargetColor == "brown") * 1
model8 <- glmer(cbind(TargetFocus, CompFocus) ~ SameColor + SameGender * TargetNeuter +
TargetBrown + (1 + SameColor | Subject) + (1 | Item), data = eye, family = "binomial")
summary(model8)$coef
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) 2.139 0.2502 8.55 <2e-16 ***
# SameColor -1.716 0.1849 -9.29 <2e-16 ***
# SameGender -0.174 0.0164 -10.63 <2e-16 ***
# TargetNeuter -0.415 0.0913 -4.55 5.36e-06 ***
# TargetBrown -0.432 0.1215 -3.55 0.000382 ***
# SameGender:TargetNeuter 0.488 0.0230 21.24 <2e-16 ***
anova(model8, model7)$P[2] # N.B. model7 is more complex: model with TargetBrown preferred
# [1] 0.311
# chance to focus on target
# when there is a color
# competitor and a gender
# competitor, while the
# target is common and not
# brown
(logit <- fixef(model8)["(Intercept)"] +
1 * fixef(model8)["SameColor"] +
1 * fixef(model8)["SameGender"] +
0 * fixef(model8)["TargetNeuter"] +
0 * fixef(model8)["TargetBrown"] +
1 * 0 * fixef(model8)["SameGender:TargetNeuter"])
# (Intercept)
# 0.248
plogis(logit) # intercept-only model was 0.7
# (Intercept)
# 0.562
qqnorm(resid(model8))
qqline(resid(model8))
eye2 <- eye[abs(scale(resid(model8))) < 2, ] # 97% of original data included
model8b <- glmer(cbind(TargetFocus, CompFocus) ~ SameColor + SameGender * TargetNeuter +
TargetBrown + (1 + SameColor | Subject) + (1 | Item), data = eye2, family = "binomial")
summary(model8b)$coef
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) 2.582 0.3326 7.76 8.21e-15 ***
# SameColor -1.803 0.2043 -8.82 <2e-16 ***
# SameGender -0.269 0.0174 -15.39 <2e-16 ***
# TargetNeuter -0.514 0.1181 -4.35 1.37e-05 ***
# TargetBrown -0.602 0.1576 -3.82 0.000134 ***
# SameGender:TargetNeuter 0.701 0.0244 28.78 <2e-16 ***
R
-functions are provided to generate all plotsThank you for your attention!