Chapter 7 Multilevel
This section requires the nlme and ggplot2 packages. The example uses one CONTINUOUS_OUTCOME, two fixed effects, one FACTOR_PREDICTOR and one CONTINUOUS_PREDICTOR, and one random effect FACTOR_LEVEL. Complete step by step guide available soon.
7.1 assessing the need for multilevel: random intercepts
7.1.1 same intercepts across FACTOR_LEVEL: the null model
interceptOnly <-gls(CONTINUOUS_OUTCOME ~ 1, data = DF, method = "ML")summary(interceptOnly)
7.1.2 different intercepts across FACTOR_LEVEL: the hierarchical model
randomInterceptOnly <-lme(CONTINUOUS_OUTCOME ~ 1, data = DF, random = ~1|FACTOR_LEVEL, method = "ML")summary(randomInterceptOnly)
7.1.3 comparing same vs different
anova(interceptOnly, randomInterceptOnly)- code chuck with graphic representation of the
interceptOnlyandrandomInterceptOnlymodels:
ggplot(DF, aes(FACTOR_LEVEL, CONTINUOUS_OUTCOME)) + # randomInterceptOnly model
stat_summary(fun.data = 'mean_se', geom = 'errorbar', width = 0.2) +
stat_summary(fun.data = 'mean_se', geom = 'pointrange') +
geom_point(alpha=0.10) +
scale_x_continuous(limit = c(0.5, 10.5), breaks = seq(1,10,1)) +
geom_hline(yintercept = mean(DF$CONTINUOUS_OUTCOME), linetype = "dotted") # interceptOnly model7.2 adding the fixed effects: fixed effects and random intercepts
7.2.1 effect of FACTOR_PREDICTOR on CONTINUOUS_OUTCOME with different intercepts across FACTOR_LEVEL
randomInterceptFACTOR_PREDICTOR <-lme(CONTINUOUS_OUTCOME ~ FACTOR_PREDICTOR, random = ~1|FACTOR_LEVEL, method = "ML", data = DF)summary(randomInterceptFACTOR_PREDICTOR)- code chuck with an tentative graphic representation of the
randomInterceptFACTOR_PREDICTORmodel:
ggplot(DF, aes(FACTOR_PREDICTOR, CONTINUOUS_PREDICTOR, colour = FACTOR_PREDICTOR)) + # effect of FACTOR_PREDICTOR on CONTINUOUS_OUTCOME
stat_summary(fun = mean, geom = "point") +
stat_summary(fun.data = 'mean_se', geom = 'errorbar', width = 0.2) +
stat_summary(fun.data = 'mean_se', geom = 'pointrange') +
geom_point(alpha=0.2) +
geom_hline(yintercept = mean(DF$CONTINUOUS_OUTCOME), linetype = "dotted") +
facet_wrap( ~ FACTOR_LEVEL, nrow = 2) # different intercepts across FACTOR_LEVEL (intercepts not represented)7.2.2 effect of FACTOR_PREDICTOR on CONTINUOUS_OUTCOME controlling for CONTINUOUS_PREDICTOR with different intercepts across FACTOR_LEVEL
randomInterceptFAC&CONT_PREDICTORS <-lme(CONTINUOUS_OUTCOME ~ FACTOR_PREDICTOR + CONTINUOUS_PREDICTOR, random = ~1|FACTOR_LEVEL, method = "ML",data = DF)summary(randomInterceptFAC&CONT_PREDICTORS)- code chuck with an tentative graphic representation of the
randomInterceptFAC&CONT_PREDICTORSmodel:
ggplot(DF, aes(CONTINUOUS_PREDICTOR, CONTINUOUS_OUTCOME, colour = FACTOR_PREDICTOR)) + # effect of FACTOR_PREDICTOR on CONTINUOUS_OUTCOME controlling for CONTINUOUS_PREDICTOR
geom_point(alpha=0.4) +
facet_wrap( ~ FACTOR_LEVEL, nrow = 2) + # different intercepts across FACTOR_LEVEL (intercepts not represented)
geom_hline(yintercept = mean(DF$CONTINUOUS_OUTCOME), linetype = "dotted")7.2.3 comparing adding fixed effects
anova(randomInterceptOnly, randomInterceptFACTOR_PREDICTOR, randomInterceptFAC&CONT_PREDICTORS)
7.3 adding random slopes: fixed effects and random slopes
7.3.1 effect of FACTOR_PREDICTOR on CONTINUOUS_OUTCOME with different intercepts across FACTOR_LEVEL controlling for CONTINUOUS_PREDICTOR
addRandomSlope <- lme(CONTINUOUS_OUTCOME ~ FACTOR_PREDICTOR + CONTINUOUS_PREDICTOR, random = ~FACTOR_PREDICTOR|FACTOR_LEVEL, method = "ML", data = DF)summary(addRandomSlope)- code chuck with an tentative graphic representation of the
addRandomSlopemodel:
ggplot(DF, aes(CONTINUOUS_PREDICTOR, CONTINUOUS_OUTCOME, colour = FACTOR_PREDICTOR)) + # effect of FACTOR_PREDICTOR on CONTINUOUS_OUTCOME controlling for CONTINUOUS_PREDICTOR
geom_point(alpha=0.4) +
geom_smooth(method = "lm", se = FALSE) +
geom_hline(yintercept = mean(DF$CONTINUOUS_OUTCOME), linetype = "dotted") +
facet_wrap( ~ FACTOR_LEVEL, nrow = 2) # with different intercepts across FACTOR_LEVEL 7.3.2 comparing adding random slopes
anova(randomInterceptFAC&CONT_PREDICTORS,addRandomSlope)