Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

plot mixed effects model in ggplot

Tags:

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() 

enter image description here

However, I would like to represent a mixed effects model instead of lmin geom_smooth, so I can include SITEas 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

like image 314
fede_luppi Avatar asked Jun 26 '15 14:06

fede_luppi


People also ask

Can you plot a model with Ggplot?

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 .

How do you plot Glmer results?

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.

How do you plot a random intercept model in R?

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.

What is a maximal random effects structure?

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.


1 Answers

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. lmer with random effects

I hope this example gives some ideas how to visualize your mixed effects model.

like image 114
oshun Avatar answered Oct 15 '22 19:10

oshun