Skip to content

check_collinearity() returns artificially inflated VIFs for ordinal::clmm models #900

@jmgirard

Description

@jmgirard

I have noticed an issue where performance::check_collinearity() seems to miscalculate or heavily inflate Variance Inflation Factors (VIFs) when applied to Cumulative Link Mixed Models (clmm objects from the ordinal package).

When passing perfectly orthogonal, simulated predictors into a clmm, the resulting VIFs are flagged as highly collinear. Fitting a standard linear mixed model (lmer) to the exact same predictors correctly returns VIFs near 1.0.

I suspect the VIF calculation algorithm might be accidentally catching the multiple ordinal threshold estimates (the internal intercepts) from the clmm variance-covariance matrix, which artificially explodes the collinearity penalty for the fixed predictors.

Reproducible Example:

library(ordinal)
library(lme4)
#> Loading required package: Matrix
library(performance)

set.seed(999)
n <- 500

# 1. Simulate perfectly orthogonal predictors
x_continuous <- rnorm(n, mean = 0, sd = 1)
x_binary <- sample(c(-0.5, 0.5), size = n, replace = TRUE, prob = c(0.85, 0.15)) 
subject_id <- factor(rep(1:50, each = 10))

# 2. Generate an ordinal outcome with MANY categories
random_intercepts <- rnorm(50, 0, 1)
latent_y <- 2 * x_continuous + 3 * x_binary + random_intercepts[as.numeric(subject_id)] + rlogis(n)

# Cut into 15 categories to generate 14 distinct thresholds
y_ordinal <- cut(
  latent_y, 
  breaks = 15, 
  ordered_result = TRUE
)

dat <- data.frame(y_ordinal, x_continuous, x_binary, subject_id)

# 3. Fit models
mod_lmer <- lmer(as.numeric(y_ordinal) ~ x_continuous + x_binary + (1 | subject_id), data = dat)
mod_clmm <- clmm(y_ordinal ~ x_continuous + x_binary + (1 | subject_id), data = dat)

# 4. Compare Collinearity Checks
check_collinearity(mod_lmer)
#> # Check for Multicollinearity
#> 
#> Low Correlation
#> 
#>          Term  VIF  VIF 95% CI adj. VIF Tolerance Tolerance 95% CI
#>  x_continuous 1.00 [1.00, Inf]     1.00      1.00     [0.00, 1.00]
#>      x_binary 1.00 [1.00, Inf]     1.00      1.00     [0.00, 1.00]

check_collinearity(mod_clmm)
#> # Check for Multicollinearity
#> 
#> Low Correlation
#> 
#>          Term  VIF   VIF 95% CI adj. VIF Tolerance Tolerance 95% CI
#>  x_continuous 1.79 [1.60, 2.04]     1.34      0.56     [0.49, 0.63]
#>      x_binary 4.36 [3.77, 5.08]     2.09      0.23     [0.20, 0.27]

Created on 2026-04-21 with reprex v2.1.1

Expected Behavior:

The VIF values for the fixed effects in the clmm object should roughly match the VIF values of the lmer object, as the fixed-effect design matrix is identical.

System Information:

R version 4.5.3 (2026-03-11 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26100)

Matrix products: default
  LAPACK version 3.12.1

locale:
[1] LC_COLLATE=English_United States.utf8 
[2] LC_CTYPE=English_United States.utf8   
[3] LC_MONETARY=English_United States.utf8
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.utf8    

time zone: America/Chicago
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] performance_0.16.0 lme4_2.0-1         Matrix_1.7-5      
[4] ordinal_2025.12-29

loaded via a namespace (and not attached):
 [1] numDeriv_2016.8-1.1 lattice_0.22-9      splines_4.5.3      
 [4] ucminf_1.2.3        cli_3.6.6           Rdpack_2.6.6       
 [7] nloptr_2.2.1        grid_4.5.3          reformulas_0.4.4   
[10] compiler_4.5.3      boot_1.3-32         rbibutils_2.4.1    
[13] rstudioapi_0.18.0   tools_4.5.3         nlme_3.1-169       
[16] minqa_1.2.8         Rcpp_1.1.1-1        rlang_1.2.0        
[19] MASS_7.3-65         insight_1.5.0      

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions