I am new with mixed effect models and I need your help please. I have plotted the below graph in ggplot:
ggplot(tempEf,aes(TRTYEAR,CO2effect,group=Myc,col=Myc)) + facet_grid(~N) + geom_smooth(method="lm",se=T,size=1) + geom_point(alpha = 0.3) + geom_hline(yintercept=0, linetype="dashed") + theme_bw()
However, I would like to represent a mixed effects model instead of lm
in geom_smooth
, so I can include SITE
as a random effect.
The model would be the following:
library(lme4) tempEf$TRTYEAR <- as.numeric(tempEf$TRTYEAR) mod <- lmer(r ~ Myc * N * TRTYEAR + (1|SITE), data=tempEf)
I have included TRTYEAR
(year of treatment) because I am also interested in the patterns of the effect, that may increase or decrease over time for some groups.
Next is my best attempt so far to extract the plotting variables out of the model, but only extracted the values for TRTYEAR
= 5, 10 and 15.
library(effects) ef <- effect("Myc:N:TRTYEAR", mod) x <- as.data.frame(ef) > x Myc N TRTYEAR fit se lower upper 1 AM Nlow 5 0.04100963 0.04049789 -0.03854476 0.1205640 2 ECM Nlow 5 0.41727928 0.07342289 0.27304676 0.5615118 3 AM Nhigh 5 0.20562700 0.04060572 0.12586080 0.2853932 4 ECM Nhigh 5 0.24754017 0.27647151 -0.29556267 0.7906430 5 AM Nlow 10 0.08913042 0.03751783 0.01543008 0.1628307 6 ECM Nlow 10 0.42211957 0.15631679 0.11504963 0.7291895 7 AM Nhigh 10 0.30411129 0.03615213 0.23309376 0.3751288 8 ECM Nhigh 10 0.29540744 0.76966410 -1.21652689 1.8073418 9 AM Nlow 15 0.13725120 0.06325159 0.01299927 0.2615031 10 ECM Nlow 15 0.42695986 0.27301163 -0.10934636 0.9632661 11 AM Nhigh 15 0.40259559 0.05990085 0.28492587 0.5202653 12 ECM Nhigh 15 0.34327471 1.29676632 -2.20410343 2.8906529
Suggestions to a completely different approach to represent this analysis are welcome. I thought this question is better suited for stackoverflow because it’s about the technicalities in R rather than the statistics behind. Thanks
The geom_smooth() function in ggplot2 can plot fitted lines from models with a simple structure. Supported model types include models fit with lm() , glm() , nls() , and mgcv::gam() . Fitted lines can vary by groups if a factor variable is mapped to an aesthetic like color or group .
glmer function. Currently, there are two type options to plot diagnostic plots: type = "fe. cor" to plot a correlation matrix between fixed effects and type = "re. qq" to plot a qq-plot of random effects.
Basically, the formula is b0 + b0[r1-rn] + bi * xi (where xi is the estimate of fixed effects, b0 is the intercept of the fixed effects and b0[r1-rn] are all random intercepts). Use type = "ri. slope" for this kind of plots.
Maximal modeling is the most complex random structure that you can apply to the data and it assumes that there is sufficient variance at the subjects and items (and for random slopes at both subjects and items) to sustain this model.
You can represent your model a variety of different ways. The easiest is to plot data by the various parameters using different plotting tools (color, shape, line type, facet), which is what you did with your example except for the random effect site. Model residuals can also be plotted to communicate results. Like @MrFlick commented, it depends on what you want to communicate. If you want to add confidence/prediction bands around your estimates, you'll have to dig deeper and consider bigger statistical issues (example1, example2).
Here's an example taking yours just a bit further.
Also, in your comment you said you didn't provide a reproducible example because the data do not belong to you. That doesn't mean you can't provide an example out of made up data. Please consider that for future posts so you can get faster answers.
#Make up data: tempEf <- data.frame( N = rep(c("Nlow", "Nhigh"), each=300), Myc = rep(c("AM", "ECM"), each=150, times=2), TRTYEAR = runif(600, 1, 15), site = rep(c("A","B","C","D","E"), each=10, times=12) #5 sites ) # Make up some response data tempEf$r <- 2*tempEf$TRTYEAR + -8*as.numeric(tempEf$Myc=="ECM") + 4*as.numeric(tempEf$N=="Nlow") + 0.1*tempEf$TRTYEAR * as.numeric(tempEf$N=="Nlow") + 0.2*tempEf$TRTYEAR*as.numeric(tempEf$Myc=="ECM") + -11*as.numeric(tempEf$Myc=="ECM")*as.numeric(tempEf$N=="Nlow")+ 0.5*tempEf$TRTYEAR*as.numeric(tempEf$Myc=="ECM")*as.numeric(tempEf$N=="Nlow")+ as.numeric(tempEf$site) + #Random intercepts; intercepts will increase by 1 tempEf$TRTYEAR/10*rnorm(600, mean=0, sd=2) #Add some noise library(lme4) model <- lmer(r ~ Myc * N * TRTYEAR + (1|site), data=tempEf) tempEf$fit <- predict(model) #Add model fits to dataframe
Incidentally, the model fit the data well compared to the coefficients above:
model #Linear mixed model fit by REML ['lmerMod'] #Formula: r ~ Myc * N * TRTYEAR + (1 | site) # Data: tempEf #REML criterion at convergence: 2461.705 #Random effects: # Groups Name Std.Dev. # site (Intercept) 1.684 # Residual 1.825 #Number of obs: 600, groups: site, 5 #Fixed Effects: # (Intercept) MycECM NNlow # 3.03411 -7.92755 4.30380 # TRTYEAR MycECM:NNlow MycECM:TRTYEAR # 1.98889 -11.64218 0.18589 # NNlow:TRTYEAR MycECM:NNlow:TRTYEAR # 0.07781 0.60224
Adapting your example to show the model outputs overlaid on the data
library(ggplot2) ggplot(tempEf,aes(TRTYEAR, r, group=interaction(site, Myc), col=site, shape=Myc )) + facet_grid(~N) + geom_line(aes(y=fit, lty=Myc), size=0.8) + geom_point(alpha = 0.3) + geom_hline(yintercept=0, linetype="dashed") + theme_bw()
Notice all I did was change your colour from Myc to site, and linetype to Myc.
I hope this example gives some ideas how to visualize your mixed effects model.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With