This package computes model and semi partial \(R^2\) with confidence limits for the linear and generalized linear mixed model (LMM and GLMM). The \(R^2\) measure from Edwards et al. (2008) is extended to the GLMM using penalized quasi-likelihood (PQL) estimation (see Jaeger et al. (2016)).
The \(R^2\) statistic is a well known tool that describes goodness-of-fit for a statistical model. In the linear model, \(R^2\) is interpreted as the proportion of variance in the data explained by the fixed predictors and semi-partial \(R^2\) provide standardized measures of effect size for subsets of fixed predictors. In the linear mixed model, numerous definitions of \(R^2\) exist and interpretations vary by definition. The r2glmm package computes \(R^2\) using three definitions:
Each interpretation can be used for model selection and is helpful for summarizing model goodness-of-fit. While the information criteria are useful tools for model selection, they do not quantify goodness-of-fit, making the \(R^2\) statistic an excellent tool to accompany values of AIC and BIC. Additionally, in the context of mixed models, semi-partial \(R^2\) and confidence limits are two useful and exclusive features of the r2glmm package.
The most up-to-date version of the r2glmm package is available on Github. To download the package from Github, after installing and loading the devtools package, run the following code from the R console:
::install_github('bcjaeger/r2glmm') devtools
Alternatively, There is a version of the package available on CRAN. To download the package from CRAN, run the following code from the R console:
install.packages('r2glmm')
The main function in this package is called r2beta. The r2beta function summarizes a mixed model by computing the model \(R^2\) statistic and semi-partial \(R^2\) statistics for each fixed predictor in the model. The r2glmm package computes \(R^2\) using three definitions. Below we list the methods, their interpretation, and an example of their application:
library(lme4)
#> Loading required package: Matrix
library(nlme)
#>
#> Attaching package: 'nlme'
#> The following object is masked from 'package:lme4':
#>
#> lmList
library(r2glmm)
library(splines)
data(Orthodont)
# Compute mean models with the r2beta statistic
# using the Kenward-Roger approach.
= lmer(distance ~ bs(age)*Sex + (1|Subject), data = Orthodont)
mer1 = lmer(distance ~ age + (1|Subject), data = Orthodont)
mer2
r2.mer1 = r2beta(mer1, method = 'kr', partial = T, data = Orthodont))
(#> Effect Rsq upper.CL lower.CL
#> 1 Model 0.626 0.734 0.527
#> 2 bs(age) 0.586 0.702 0.465
#> 4 bs(age):Sex 0.086 0.256 0.021
#> 3 Sex 0.072 0.260 0.001
r2.mer2 = r2beta(mer2, method = 'kr', partial = T, data = Orthodont))
(#> Effect Rsq upper.CL lower.CL
#> 1 Model 0.589 0.698 0.468
#> 2 age 0.589 0.698 0.468
# m1 has a compound symmetric (CS) covariance structure.
= lme(distance ~ age*Sex, ~1|Subject, data = Orthodont)
lme1
# m2 is an order 1 autoregressive (AR1) model with
# gender-specific residual variance estimates.
= lme(distance ~ age*Sex, ~1|Subject, data=Orthodont,
lme2 correlation = corAR1(form=~1|Subject),
weights = varIdent(form=~1|Sex))
# Compare the models
r2m1 = r2beta(model=lme1,method='sgv',partial=FALSE))
(#> Effect Rsq upper.CL lower.CL
#> 1 Model 0.559 0.669 0.447
r2m2 = r2beta(model=lme2,method='sgv',partial=FALSE))
(#> Effect Rsq upper.CL lower.CL
#> 1 Model 0.603 0.703 0.498
# Compute the R2 statistic using Nakagawa and Schielzeth's approach.
r2nsj = r2beta(mer1, method = 'nsj', partial = TRUE))
(#> Effect Rsq upper.CL lower.CL
#> 1 Model 0.410 0.551 0.305
#> 2 bs(age) 0.263 0.409 0.149
#> 3 Sex 0.032 0.126 0.000
#> 4 bs(age):Sex 0.024 0.134 0.005
# Check the result with MuMIn's r.squaredGLMM
= MuMIn::r.squaredGLMM(mer1)
r2nsj_mum #> Registered S3 method overwritten by 'MuMIn':
#> method from
#> nobs.multinom broom
all.equal(r2nsj[1,'Rsq'],as.numeric(r2nsj_mum[1]), tolerance = 1e-3)
#> [1] TRUE
The r2glmm package can compute \(R_\beta^2\) for models fitted using the glmer function from the lme4 package. Note that this method is experimental in R and values of \(R_\beta^2\) sometimes exceed 1. We recommend using the SAS macro available at https://github.com/bcjaeger/R2FixedEffectsGLMM/blob/master/Glimmix_R2_V3.sas. \(R_\Sigma^2\) is more stable and can be computed for models fitted using either the glmer function or the glmmPQL function from the MASS package; however, minor differences in model estimation can lead to slight variation in the values of \(R_\Sigma^2\).
library(lattice)
library(MASS)
$period = as.numeric(cbpp$period)
cbpp
# using glmer (based in lme4)
<- glmer(
gm1 formula=cbind(incidence, size-incidence) ~ bs(period) + (1|herd),
data = cbpp, family = binomial)
# using glmmPQL (based on nlme)
<- glmmPQL(
pql1 cbind(incidence, size-incidence) ~ bs(period),
random = ~ 1|herd, family = binomial, data = cbpp
)#> iteration 1
#> iteration 2
#> iteration 3
#> iteration 4
# Note minor differences in R^2_Sigma
r2beta(model = gm1, method = 'sgv', data = cbpp)
#> Effect Rsq upper.CL lower.CL
#> 1 Model 0.24 0.476 0.091
#> 2 bs(period) 0.24 0.476 0.091
r2beta(model = pql1, method = 'sgv', data = cbpp)
#> Effect Rsq upper.CL lower.CL
#> 1 Model 0.22 0.458 0.077
#> 2 bs(period) 0.22 0.458 0.077