Analysis of a Linear Mixed Model
The following data is used to run an example analysis of a linear mixed model, where the random effect is Subject, and Trial is nested in Keyboard and Posture.
mbltxttrials.csv
Subject | Keyboard | Posture | Posture_Order | Trial | WPM | Error_Rate |
---|---|---|---|---|---|---|
1 | iPhone | Sit | 1 | 1 | 21.05 | 0.01 |
1 | iPhone | Sit | 1 | 2 | 15.95 | 0.02 |
1 | iPhone | Sit | 1 | 3 | 21.51 | 0.01 |
1 | iPhone | Sit | 1 | 4 | 24.37 | 0.00 |
1 | iPhone | Sit | 1 | 5 | 22.58 | 0.05 |
1## Linear Mixed Model (LMM) on WPM
2
3mbltxttrials = read.csv("mbltxttrials.csv")
4View(mbltxttrials)
5mbltxttrials$Subject = factor(mbltxttrials$Subject) # convert to nominal factor
6mbltxttrials$Keyboard = factor(mbltxttrials$Keyboard) # Rv4
7mbltxttrials$Posture = factor(mbltxttrials$Posture) # Rv4
8mbltxttrials$Posture_Order = factor(mbltxttrials$Posture_Order) # convert to nominal factor
9mbltxttrials$Trial = factor(mbltxttrials$Trial) # convert to nominal factor
10summary(mbltxttrials)
11
12library(plyr)
13ddply(mbltxttrials, ~ Keyboard * Posture, function(data) summary(data$WPM))
14ddply(mbltxttrials, ~ Keyboard * Posture, summarise, WPM.mean=mean(WPM), WPM.sd=sd(WPM))
15
16hist(mbltxttrials[mbltxttrials$Keyboard == "iPhone" & mbltxttrials$Posture == "Sit",]$WPM)
17hist(mbltxttrials[mbltxttrials$Keyboard == "iPhone" & mbltxttrials$Posture == "Stand",]$WPM)
18hist(mbltxttrials[mbltxttrials$Keyboard == "iPhone" & mbltxttrials$Posture == "Walk",]$WPM)
19hist(mbltxttrials[mbltxttrials$Keyboard == "Galaxy" & mbltxttrials$Posture == "Sit",]$WPM)
20hist(mbltxttrials[mbltxttrials$Keyboard == "Galaxy" & mbltxttrials$Posture == "Stand",]$WPM)
21hist(mbltxttrials[mbltxttrials$Keyboard == "Galaxy" & mbltxttrials$Posture == "Walk",]$WPM)
22boxplot(WPM ~ Keyboard * Posture, data=mbltxttrials, xlab="Keyboard.Posture", ylab="WPM") # boxplots
23with(mbltxttrials, interaction.plot(Posture, Keyboard, WPM, ylim=c(0, max(mbltxttrials$WPM)))) # interaction?
24
25library(lme4) # for lmer
26library(lmerTest)
27library(car) # for Anova
28
29contrasts(mbltxttrials$Keyboard) <- "contr.sum"
30contrasts(mbltxttrials$Posture) <- "contr.sum"
31contrasts(mbltxttrials$Posture_Order) <- "contr.sum"
32contrasts(mbltxttrials$Trial) <- "contr.sum"
33
34m = lmer(WPM ~ (Keyboard * Posture_Order)/Trial + (1|Subject), data=mbltxttrials)
35Anova(m, type=3, test.statistic="F")
36
37m = lmer(WPM ~ (Keyboard * Posture)/Trial + (1|Subject), data=mbltxttrials)
38Anova(m, type=3, test.statistic="F")
39
40#m = lmer(WPM ~ (Keyboard * Posture)/(1|Trial) + (1|Subject), data=mbltxttrials) # incorrect in video
41m = lmer(WPM ~ Keyboard * Posture + (1|Keyboard:Posture:Trial) + (1|Subject), data=mbltxttrials) # new, correct
42Anova(m, type=3, test.statistic="F")
43
44library(multcomp) # for glht
45library(emmeans) # for emm
46summary(glht(m, emm(pairwise ~ Keyboard * Posture)), test=adjusted(type="holm"))
47with(mbltxttrials, interaction.plot(Posture, Keyboard, WPM, ylim=c(0, max(mbltxttrials$WPM)))) # for convenience
References
#designing_running_and_analyzing_experiments #week9 #experiment #generalized #regression #nested_effects #linear_model #coursera #random_effects #rlang #fixed_effects #within_subjects #design #theory #test #mixed #statistics