Skip to main content

Mixed-effects models in Python: LMM, GLMM, CLMM, and Cox frailty with crossed random effects, validated against R

Project description

interlace

interlace

Documentation

Pure-Python mixed-effects modelling library — linear (LMM), generalised (GLMM), ordinal (CLMM), and survival (Cox frailty) — validated against R's lme4, glmer, ordinal, and coxme.

Designed as a drop-in replacement for statsmodels.MixedLM in diagnostics pipelines that require crossed grouping factors (e.g. (1|worker) + (1|company)), which statsmodels does not support.

Installation

pip install interlace-lme

Requires Python ≥ 3.13.

For materially faster random-slopes LMM and GLMM fits (~3-10x), install the [fast] extra to pull in scikit-sparse (CHOLMOD):

pip install 'interlace-lme[fast]'

CHOLMOD requires SuiteSparse system libraries (libsuitesparse-dev on Debian/Ubuntu, brew install suite-sparse on macOS). Without [fast], fits fall back to SuperLU and you'll see a one-shot warning at fit time on the slow path.

Quick start

import pandas as pd
from interlace import fit

result = fit(
    formula="score ~ hours_studied + prior_gpa",
    data=df,
    groups=["student_id", "school_id"],   # crossed random intercepts
)

print(result.fe_params)          # fixed-effect coefficients
print(result.variance_components) # per-factor variance components
print(result.scale)              # residual variance σ²

groups accepts a single string (one random intercept) or a list (crossed intercepts). The first entry is the primary grouping factor.

Model types

Linear mixed models (LMM)

from interlace import fit

result = fit(
    formula="score ~ hours_studied + prior_gpa",
    data=df,
    groups=["student_id", "school_id"],
    method="REML",           # or "ML" for likelihood-ratio tests
    df_method="satterthwaite", # or "kenward-roger"
)

Supports crossed and nested random intercepts, random slopes ((1 + x | g)), observation-level weights, AR(1) and compound-symmetry residual correlation structures, and Satterthwaite or Kenward-Roger denominator degrees of freedom.

Generalised linear mixed models (GLMM)

from interlace import glmer

result = glmer(
    formula="incidence / size ~ period",
    data=df,
    family="binomial",       # or "poisson", "gaussian", "negativebinomial"
    groups="herd",
    weights=df["size"].values,
)

Families: binomial, Poisson, Gaussian, NB1, NB2, Beta, Gamma, zero-inflated Poisson/NB2, hurdle Poisson, zero-one-inflated Beta. Supports Laplace approximation and adaptive Gauss-Hermite quadrature.

Cumulative link mixed models (CLMM)

from interlace import clmm

result = clmm(
    formula="rating ~ condition",
    data=df,
    groups="subject",
)

Ordinal regression with random effects, matching R's ordinal::clmm().

Cox frailty models

from interlace import coxme

result = coxme(
    formula="Surv(time, event) ~ treatment + age",
    data=df,
    groups="centre",
)

Cox proportional hazards with Gaussian frailty, matching R's coxme::coxme().

Diagnostics

from interlace import hlm_resid, leverage, hlm_influence, hlm_augment

resid_df = hlm_resid(result, type="conditional")  # or "marginal"
lev = leverage(result)                              # hat-matrix diagonal
infl = hlm_influence(result, level=1)               # Cook's D, MDFFITS, etc.
aug = hlm_augment(result)                           # data + residuals + influence

# Plotting (all return plotnine.ggplot objects)
from interlace import plot_resid, plot_influence, dotplot_diag

plot_resid(resid_df, type="resid_vs_fitted")
plot_influence(infl, measure="cooks_d")
dotplot_diag(infl, variable="cooks_d", cutoff="internal")

statsmodels compatibility

CrossedLMEResult exposes the same interface as statsmodels.MixedLMResults so it can be used as a drop-in in downstream code that accesses fe_params, resid, scale, fittedvalues, random_effects, predict(), and model.exog / model.groups / model.data.frame.

hlm_resid, hlm_influence, and hlm_augment all accept either a CrossedLMEResult or a statsmodels MixedLMResults object.

Parity with R

Results are validated against R reference implementations to the following tolerances:

Model type R reference Fixed effects Variance components
LMM lme4::lmer() abs diff < 1e-4 rel diff < 5%
GLMM lme4::glmer() abs diff < 1e-3 rel diff < 5%
CLMM ordinal::clmm() abs diff < 1e-3 rel diff < 5%
Cox frailty coxme::coxme() abs diff < 1e-3 rel diff < 10%
AR(1) / CS nlme::lme() abs diff < 1e-3 rel diff < 5%

Contributing

Bug reports, documentation fixes, and new features are welcome — see CONTRIBUTING.md for how to get started. To open an issue or ask a question, use the GitHub issue tracker.

Attribution

  • lme4 — the reference implementation for mixed-effects models in R; interlace targets parity with lme4::lmer() and lme4::glmer().
  • ordinal — R package for cumulative link models; interlace's clmm() targets parity with ordinal::clmm().
  • coxme — R package for Cox models with random effects; interlace's coxme() targets parity with coxme::coxme().
  • nlme — R package for linear mixed models with correlation structures; AR(1) and CS validation benchmarks.
  • HLMdiag — the R package whose diagnostics API (hlm_resid, hlm_influence, hlm_augment, dotplot_diag) interlace replicates in Python.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

interlace_lme-0.3.0.tar.gz (12.3 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

interlace_lme-0.3.0-py3-none-any.whl (165.2 kB view details)

Uploaded Python 3

File details

Details for the file interlace_lme-0.3.0.tar.gz.

File metadata

  • Download URL: interlace_lme-0.3.0.tar.gz
  • Upload date:
  • Size: 12.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for interlace_lme-0.3.0.tar.gz
Algorithm Hash digest
SHA256 be00f1eea57decff7c5e02c45b5bbff0e334265018fe0217405b35cb0a227d72
MD5 ded13096241176f58316a3a6dec9a2c5
BLAKE2b-256 dbd1a98411cc6b535799ccc491dfc5fd4587ba75eea32e3003b81f35f3132a5e

See more details on using hashes here.

Provenance

The following attestation bundles were made for interlace_lme-0.3.0.tar.gz:

Publisher: publish.yml on heliopais/interlace

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file interlace_lme-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: interlace_lme-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 165.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for interlace_lme-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 43f55c3904fc3389c81b410a1809aad9b6821749bdb9fbab0384034a2959966c
MD5 a38edf33186bf70080b0e71c4def6840
BLAKE2b-256 1788a3d32a7ca96ba446d1ac03a074c0981b1ef3ed37ffac6b1e7b5084d0e932

See more details on using hashes here.

Provenance

The following attestation bundles were made for interlace_lme-0.3.0-py3-none-any.whl:

Publisher: publish.yml on heliopais/interlace

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page