visreg-faq {visreg} | R Documentation |
Frequently Asked Questions for visreg
Description
This page tries to answer some of the questions that I get asked most often about how to use the visreg package. If you have a question that does not appear below, I can be reached at <patrick-breheny@uiowa.edu>.
Frequent asked questions
-
What is the difference between 'conditional' and 'contrast' plots?
Suppose our data looked like:
SBP Sex Age 140 M 56 135 F 47 ... we fit a model with
fit <- lm(SBP~Sex+Age)
and we want to plot the relationship between Age and SBP. A 'conditional' plot illustrates the relationship between the two, conditional on the sex being, say, Male (the default in visreg is to choose the most common category).
The 'contrast' plot in visreg, on the other hand, illustrates the effect on SBP of a change in age – the default in visreg is to use the mean age as the reference point for this change. Since the above model does not have an interaction, this effect will be the same for men and women, and thus does not require you to specify a sex for the plot.
Both conditional and contrast plots answer subtly different questions, and both are useful in different situations.
-
Can visreg can be used for mixed models (i.e., from the 'nlme' or 'lme4' packages)?
Sort of. The underlying basis on which visreg operates is by using the predict method to plot predictions from the model. Predictions for mixed models are complicated. In particular, there is no
se.fit
option provided by thepredict
methods in thenlme
andlme4
packages, so you cannot obtain confidence bands for conditional plots. Nevertheless,visreg
will produce plots of estimated coefficients and partial residuals.In addition, there may be certain nesting structures among the covariates that
visreg
cannot be aware of; for example, if you are trying to plot the effect of age for various individuals, fixing sex atsex=Male
, this may involve setting the sex of female subjects toMale
for the sake of the plot. Whether such a plot has any meaning, you will have to judge for yourself. In general, contrast plots are more trustworthy than than conditional plots, given the intricacies of setting up conditions in a hierarchical model.Keep in mind that depending on what sort of predictions (BLUPs) you are interested in, you may need to manually control the inclusion of random effects in your predictions. By default, visreg includes no random effects (i.e.,
level=0
fornlme
models andre.form=NA
forlme4
models). If you are including a random effect as aby
variable invisreg
, you most likely want to add those effects back in, and you will have to do so manually, by directly specifying the appropriatelevel
orre.form
argument topredict
(see?predict.nlme
or?predict.merMod
). Handling this appropriately is the user's responsibility; I cannot hope to automatically decide this for all possible mixed models that could be passed to visreg.As mentioned above, you cannot obtain confidence bands for conditional plots. In the words of the authors of the
lme4
package, "There is no option for computing standard errors of predictions because it is difficult to define an efficient method that incorporates uncertainty in the variance parameters"; hence nose.fit
option. You can, however, get confidence bands for'contrast'
plots. In a contrast plot, the random effects cancel and the above issue is avoided.If you are running into difficulty using
visreg
with mixed models, feel free to e-mail me; mixed models have been less extensively tested withvisreg
than fixed-effect models, and there may still be bugs to work out. -
How do I use visreg for a model with offset terms?
By default, visreg is set up to provide conditional plots in which all other terms are set to their median value (or most common category). This includes offset terms. It is not uncommon, however, to want to see results with the offset included. To obtain these results, one needs to specify the offset among the arguments to cond. For example, using the Insurance data from the MASS package:
utils::data(Insurance, package="MASS")
fit <- glm(Claims ~ District + Group + Age + offset(log(Holders)), data = Insurance, family = poisson)
visreg(fit, "Group", scale="response")
This will provide the model's predictions for the expected number of claims given the median number of holders (here, 136). To obtain the expected number of claims per holder, we need to specify Holders=1 in cond:
visreg(fit, "Group", scale="response", cond=list(Holders=1))
Note also that to ensure proper functionality with all of visreg's options, the use of the
offset()
function, rather than theoffset=
argument, is recommended. -
Why doesn't visreg work with models I fit with package XXX?
visreg()
relies on being able to call certain generic functions to interface with the fitted model object that is passed to it. Specifically, iffit
is the fit of a model that is passed tovisreg
, the following have to work:model.frame(fit)
formula(fit)
If they do not, there is nothing I can really do on the
visreg
end to get it to work – the author of the package would need to add support for those generic functions to make it more portable. If the above lines of code do work andvisreg
still fails, please let me know – perhaps there is a bug somewhere that I can fix.
Author(s)
Patrick Breheny and Woodrow Burchett
Maintainer: Patrick Breheny <patrick-breheny@uiowa.edu>
References
Breheny, P. and Burchett, W. (2017), Visualizing regression models using visreg. https://journal.r-project.org/archive/2017/RJ-2017-046/index.html