The qqmath function makes great caterpillar plots of random effects using the output from the lmer package. That is, qqmath is great at plotting the intercepts from a hierarchical model with their errors around the point estimate. An example of the lmer and qqmath functions are below using the built-in data in the lme4 package called Dyestuff. The code will produce the hierarchical model and a nice plot using the ggmath function.
library("lme4")
data(package = "lme4")
# Dyestuff
# a balanced one-way classiï¬cation of Yield
# from samples produced from six Batches
summary(Dyestuff)
# Batch is an example of a random effect
# Fit 1-way random effects linear model
fit1 <- lmer(Yield ~ 1 + (1|Batch), Dyestuff)
summary(fit1)
coef(fit1) #intercept for each level in Batch
# qqplot of the random effects with their variances
qqmath(ranef(fit1, postVar = TRUE), strip = FALSE)$Batch
The last line of code produces a really nice plot of each intercept with the error around each estimate. But formatting the qqmath function seems to be very difficult, and I’ve been struggling to format the plot. I’ve come up with a few questions that I cannot answer, and that I think others could also benefit from if they are using the lmer/qqmath combination:
- Is there a way to take the qqmath function above and add a few
options, such as, making certain points empty vs. filled-in, or
different colors for different points? For example, can you make the points for A,B, and C of the Batch variable filled, but then the rest of the points empty? - Is it possible to add axis labels for each point (maybe along the
top or right y axis, for example)? - My data has closer to 45 intercepts, so it is possible to add
spacing between the labels so they do not run into each other?
MAINLY, I am interested in distinguishing/labeling between points on the
graph, which seems to be cumbersome/impossible in the ggmath function.
So far, adding any additional option in the qqmath function produce errors where I would not get errors if it was a standard plot, so I’m at a loss.
Also, if you feel there is a better package/function for plotting intercepts from lmer output, I’d love to hear it! (for example, can you do points 1-3 using dotplot?)
EDIT: I’m also open to an alternative dotplot if it can be reasonably formatted. I just like the look of a ggmath plot, so I’m starting with a question about that.
One possibility is to use library
ggplot2to draw similar graph and then you can adjust appearance of your plot.First,
ranefobject is saved asrandoms. Then variances of intercepts are saved in objectqq.Object
rand.interccontains just random intercepts with level names.All objects put in one data frame. For error intervals
sd.intercis calculated as 2 times square root of variance.If you need that intercepts are ordered in plot according to value then
lev.namesshould be reordered. This line can be skipped if intercepts should be ordered by level names.This code produces plot. Now points will differ by
shapeaccording to factor levels.