lme-python 0.2.3__tar.gz → 0.2.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lme_python-0.2.4/AGENTS.md +148 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/CHANGELOG.md +53 -4
- {lme_python-0.2.3 → lme_python-0.2.4}/CONTRIBUTING.md +9 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/Cargo.lock +1 -1
- {lme_python-0.2.3 → lme_python-0.2.4}/Cargo.toml +4 -1
- {lme_python-0.2.3 → lme_python-0.2.4}/GUIDE.md +1 -1
- {lme_python-0.2.3 → lme_python-0.2.4}/PKG-INFO +1 -1
- {lme_python-0.2.3 → lme_python-0.2.4}/README.md +1 -1
- {lme_python-0.2.3 → lme_python-0.2.4}/REPO_COMPLETION_BY_AREA.md +1 -1
- {lme_python-0.2.3 → lme_python-0.2.4}/Taskfile.yml +5 -0
- lme_python-0.2.4/docs/rustdoc.css +157 -0
- lme_python-0.2.4/docs/rustdoc.md +131 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/Cargo.lock +2 -2
- {lme_python-0.2.3 → lme_python-0.2.4}/python/Cargo.toml +1 -1
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/lme_ci.py +2 -1
- {lme_python-0.2.3 → lme_python-0.2.4}/src/bootstrap.rs +1 -1
- {lme_python-0.2.3 → lme_python-0.2.4}/src/contrast.rs +79 -2
- {lme_python-0.2.3 → lme_python-0.2.4}/src/cv.rs +1 -1
- {lme_python-0.2.3 → lme_python-0.2.4}/src/ddf.rs +1 -1
- {lme_python-0.2.3 → lme_python-0.2.4}/src/emmeans.rs +6 -18
- {lme_python-0.2.3 → lme_python-0.2.4}/src/intercept_blocked.rs +125 -9
- {lme_python-0.2.3 → lme_python-0.2.4}/src/kr_modcomp.rs +48 -32
- {lme_python-0.2.3 → lme_python-0.2.4}/src/lib.rs +39 -83
- {lme_python-0.2.3 → lme_python-0.2.4}/src/mcp.rs +31 -5
- {lme_python-0.2.3 → lme_python-0.2.4}/src/perf_diag.rs +1 -1
- {lme_python-0.2.3 → lme_python-0.2.4}/src/predict.rs +11 -6
- {lme_python-0.2.3 → lme_python-0.2.4}/src/robust.rs +1 -1
- {lme_python-0.2.3 → lme_python-0.2.4}/src/satterthwaite.rs +1 -1
- {lme_python-0.2.3 → lme_python-0.2.4}/src/simulate.rs +29 -5
- {lme_python-0.2.3 → lme_python-0.2.4}/src/studentized_range.rs +15 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/ci_consolidated.rs +4 -0
- lme_python-0.2.4/tests/test_bug_hunt_edges.rs +255 -0
- lme_python-0.2.4/tests/test_inference_guards.rs +187 -0
- lme_python-0.2.3/AGENTS.md +0 -113
- {lme_python-0.2.3 → lme_python-0.2.4}/.JuliaFormatter.toml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/.github/FUNDING.yml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/.github/dependabot.yml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/audit.yml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/benchmarks.yml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/cache-prime.yml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/ci.yml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/crate-publish-dry-run.yml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/fuzz-smoke.yml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/pages.yml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/python-release.yml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/repo-metadata.yml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/.gitignore +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/BENCHMARKS.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/BENCHMARK_COVERAGE.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/CI_PERFORMANCE.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/LICENSE +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/LICENSES/Apache-2.0.txt +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/LICENSES/BSD-3-Clause-OpenBLAS.txt +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/LICENSES/GPL-2.0-or-later.txt +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/LICENSES/Intel-Simplified-Software-License.txt +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/LICENSES/LGPL-2.1-only.txt +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/OPTIMIZATION.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/RELEASING.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/RELINKING.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/THIRD_PARTY_NOTICES.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/USABILITY.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benches/bench_load_production.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benches/bench_math.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/external-nlmm-inference-python-timings-2026-08-14.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-04.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-06.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-08.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09-direct-intercept-gram.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09-full-lmm.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09-glmm.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09-large-intercept-setup.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09-large-slopes-linear-cache.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09-large-slopes.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09-sleepstudy-slopes.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-10-cold-setup-followup.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-16-cold-fit-lt1.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-22-full-tier-a.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-09-09-refactor.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/refactor-2026-09-09.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/COMPARISONS.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/bench_external_timings.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/bench_fair_julia_perf.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/bench_fair_julia_timing.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/bench_fair_rust_julia.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/bench_perf_breakdown.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/categorical_anova.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/categorical_anova.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/categorical_anova.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/categorical_anova.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/comparison_chart.png +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_cbpp.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_cbpp.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_cbpp.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_cbpp.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_gaussian.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_gaussian.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_gaussian.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_gaussian.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_grouseticks.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_grouseticks.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_grouseticks.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_grouseticks.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmer_weighted.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmer_weighted.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmer_weighted.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmer_weighted.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_dyestuff.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_dyestuff.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_dyestuff.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_dyestuff.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_pastes.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_pastes.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_pastes.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_pastes.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_penicillin.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_penicillin.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_penicillin.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_penicillin.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/nlmm_sspower.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/glmm_offset.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/glmm_offset.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/glmm_probit.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/glmm_probit.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/glmm_weighted.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/glmm_weighted.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/parity_r_setup.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/sleepstudy_offset.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/sleepstudy_offset.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity_export.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/pastes_emmeans.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/pastes_glht.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/r_setup.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy_confint_profile.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy_ml.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy_ml.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy_ml.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy_ml.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/completion_manifest.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/docs/CALO_CALIBRATION.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/docs/EXAMPLES.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/docs/README.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/docs/TROUBLESHOOTING.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/docs/benchmarks/app.js +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/docs/benchmarks/data/latest.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/docs/benchmarks/index.html +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/docs/benchmarks/styles.css +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/docs/index.html +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/examples/batch_sspower_cpu.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/examples/bench_external_timings.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/examples/dump_cascade_fixtures.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/examples/explore_formula_ast.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/examples/explore_mcp_adjust.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/examples/explore_theta_grid.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/examples/nlmm_fixture_dump.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/lefthook.yml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/legal/dependency-license-exceptions.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/legal/fixture-provenance.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/lme-rs-icon.png +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/lme-rs.png +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/mise.toml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/pyproject.toml +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/PYTHON_GUIDE.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/README.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/glmer_cbpp.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/glmer_grouseticks.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/lm_basics.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/lmer_sleepstudy.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/model_comparison.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/.gitignore +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/README.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/compare_plots.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/figure_specs.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/find_rscript.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/numeric_overlay.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/paths.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/plot_demo.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/plot_r.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/run_all.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/verification_project/README.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/verification_project/conftest.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/verification_project/parity.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/verification_project/paths.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/verification_project/run.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/verification_project/test_parity.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/lme_python.pyi +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/src/controls.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/src/fitting.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/src/input.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/src/lib.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_api_parity.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_basic.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_cv.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_dataframe_inputs.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_golden_parity.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_model_contracts.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_nlmer_custom_mean.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_simulate_scale.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_wheel_notices.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/python/uv.lock +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/build_benchmark_site.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/README.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/check_completion_score.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/check_legal_compliance.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/julia_format.jl +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/package_wheel_notices.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/r_format.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/run.sh +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/dump_dyestuff.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/dump_pastes.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/explorations/README.md +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/local_ci.ps1 +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/local_ci.sh +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/make_penicillin_csv.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/plot_comparisons.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/run_cross_language_benchmarks.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/run_external_timings.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/run_fair_rust_julia_benchmark.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/run_perf_breakdown.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/sync_github_repo_metadata.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/scripts/verify_cross_language_parity.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/anova.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/anova_contrasts.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/basis.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/display.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/execution.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/family.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/formula.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/glmm_math.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/kenward_roger.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/kr_vcov_adj.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/math.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/model.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/model_matrix.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/block_solve.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/fit.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/formula.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/mean.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/mean_fn.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/mod.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/predict.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/re_cov.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/self_start.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssasymp.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssasympoff.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssasymporig.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssbiexp.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssfpl.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssgompertz.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/sslogis.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssmicmen.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/sspower.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssweibull.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/ols.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/optimizer.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/prepared.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/profile_ci.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/src/quadrature.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/categorical_anova_test.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/cbpp_binary.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/cbpp_binary_weighted.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/dyestuff.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/dyestuff_intercept_reml.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_binomial.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_binomial_agq.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_binomial_cloglog.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_binomial_probit.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_binomial_weighted.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_gamma_dyestuff.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_poisson.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_poisson_offset.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/golden_parity_manifest.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/grouseticks.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/intercept_only.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/mock_crossed.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/mock_ml.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/orange.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/orange_nlmer.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/pastes.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/pastes_cask_reml.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/pastes_emmeans.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/pastes_glht_tukey.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/penicillin.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/penicillin.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/r_edge_case_matrix.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/random_slopes.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/sleepstudy.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/sleepstudy_confint_profile.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/sleepstudy_confint_profile_vc.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/sleepstudy_offset_reml.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssasymp_synthetic.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssasympoff_nlmer.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssasympoff_synthetic.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssasymporig_nlmer.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssasymporig_synthetic.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssbiexp_nlmer.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssbiexp_synthetic.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssfol_nlmer.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssfpl_nlmer.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssfpl_synthetic.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssgompertz_nlmer.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssgompertz_synthetic.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssmicmen_nlmer.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssmicmen_synthetic.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/sspower_nlmer.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/sspower_synthetic.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssweibull_nlmer.json +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssweibull_synthetic.csv +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/gen_nlmm_extras.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/generate_mock_data.py +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/generate_nlmm_fixtures.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/generate_r_edge_case_matrix.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/generate_test_data.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_anova.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_anova_types.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_bootstrap.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_bug_hunt.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_bug_hunt_more.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_bug_hunt_numerics.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_conditional_real.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_confint_profile.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_confint_simulate.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_contrast.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_coverage_edge_cases.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_coverage_gaps.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_crossed_mock.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_cv.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_e2e_lmer.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_edge_cases.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_emmeans.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_errors.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_explorations.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_external_timings_artifact.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_failure_modes.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_formula.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_formula_stress.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_gaps.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_glmm.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_glmm_links.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_glmm_offset_grouseticks.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_glmm_weighted.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_golden_parity.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_intercept_only.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_kenward_roger.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_kr_modcomp_pastes.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_mcp.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_ml_optimization.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_model_contracts.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_agq.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_bounds.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_custom_mean.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_orange.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_orange_multi_re.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_self_start.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_ss_new_means.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_ssasymp.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_ssasymp_off_orig.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_ssfol.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_ssmicmen.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_sspower.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_no_intercept.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_numerical_parity.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_predict.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_production_load.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_r_edge_case_matrix.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_random_slopes.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_robust.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_sandwich_math.R +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_satterthwaite.rs +0 -0
- {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_statistical_identities.rs +0 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Agent guide
|
|
2
|
+
|
|
3
|
+
This is a Rust statistical library (`lme-rs`) with PyO3/maturin Python bindings
|
|
4
|
+
(`lme_python`). There is no application server to start. Run commands from the
|
|
5
|
+
repository root unless stated otherwise.
|
|
6
|
+
|
|
7
|
+
## Start here
|
|
8
|
+
|
|
9
|
+
1. Inspect `git status --short --branch` and the relevant diff. Preserve unrelated
|
|
10
|
+
changes; do not reset, stash, switch branches, or update dependencies as routine setup.
|
|
11
|
+
2. Use `rg` and the map below to find the implementation and existing tests. Read
|
|
12
|
+
relevant guides rather than scanning the whole repository before a focused fix.
|
|
13
|
+
3. Choose required checks before editing. Reproduce bugs with focused tests, fix
|
|
14
|
+
the cause, and verify both the regression and affected behavior.
|
|
15
|
+
4. Update [CHANGELOG.md](CHANGELOG.md) under `Unreleased` for user-visible fixes,
|
|
16
|
+
features, and compatibility changes. Instruction-only edits need no entry.
|
|
17
|
+
5. Review the final diff. Report changes, validation, and failures/skips/limitations;
|
|
18
|
+
do not claim unrun checks.
|
|
19
|
+
|
|
20
|
+
## Code map
|
|
21
|
+
|
|
22
|
+
| Area | Start with |
|
|
23
|
+
|---|---|
|
|
24
|
+
| Public API, contracts, reusable fits | `src/lib.rs`, `src/model.rs`, `src/prepared.rs` |
|
|
25
|
+
| Formulas and design matrices | `src/formula.rs`, `src/model_matrix.rs`, `src/basis.rs` |
|
|
26
|
+
| LMM / GLMM / nonlinear fitting | `src/math.rs`, `src/optimizer.rs`, `src/intercept_blocked.rs` / `src/glmm_math.rs`, `src/family.rs` / `src/nlmm/` |
|
|
27
|
+
| Inference and post-fit behavior | `src/contrast.rs`, `src/ddf.rs`, `src/satterthwaite.rs`, `src/kenward_roger.rs`, `src/kr_modcomp.rs`; named modules such as `predict.rs`, `simulate.rs`, `emmeans.rs`, `mcp.rs`, `robust.rs` |
|
|
28
|
+
| Python API and tests | `python/src/lib.rs`, `python/tests/` |
|
|
29
|
+
| Regression tests and reference evidence | `tests/`, `tests/data/`, `comparisons/` |
|
|
30
|
+
| Checks, aliases, hooks, tool versions | [scripts/ci/lme_ci.py](scripts/ci/lme_ci.py), [Taskfile.yml](Taskfile.yml), [lefthook.yml](lefthook.yml), [mise.toml](mise.toml) |
|
|
31
|
+
|
|
32
|
+
## Required validation
|
|
33
|
+
|
|
34
|
+
Use the smallest tier covering the change. Requirements from multiple rows combine;
|
|
35
|
+
a successful broader check can satisfy its component checks.
|
|
36
|
+
|
|
37
|
+
| Change | Minimum checks and escalation |
|
|
38
|
+
|---|---|
|
|
39
|
+
| Rust code | `task lint`, `task test:fast`, and affected integration tests; use `task rust` for cross-module or public-API changes |
|
|
40
|
+
| Python bindings | `task lint:python`, `task python` |
|
|
41
|
+
| CI, manifests, release tooling | `task preflight`; use `task ci` before a release or broad refactor |
|
|
42
|
+
| R / Julia comparison scripts | `task lint:comparisons`; use `task lint:comparisons:required` when formatters are installed |
|
|
43
|
+
| Documentation (including this file) or portable examples | `task docs:check`; add `task consumer:smoke` when install or example behavior changes |
|
|
44
|
+
| LMM throughput paths (`src/math.rs`, `src/optimizer.rs`, related caches/solvers) | Read [OPTIMIZATION.md](OPTIMIZATION.md) and run applicable fair-harness cases in addition to Rust checks |
|
|
45
|
+
| `README.md`, `REPO_COMPLETION_BY_AREA.md`, `completion_manifest.json`, `scripts/ci/check_completion_score.py` | `task completion:check` |
|
|
46
|
+
|
|
47
|
+
### Avoid redundant work
|
|
48
|
+
|
|
49
|
+
- Start with `cargo test --locked --test <test_target> <test_filter>` or
|
|
50
|
+
`cargo test --locked --lib <test_filter>`. Selecting zero tests proves nothing.
|
|
51
|
+
- `task rust` includes Rust lint, all-target compilation, unit/integration tests,
|
|
52
|
+
doctests, and documentation generation. Add `task lint:python` for the Ruff part
|
|
53
|
+
of `task lint`; do not separately repeat `task test:fast`.
|
|
54
|
+
- `task test` runs the full Rust suite. On Windows/macOS, `task test:consolidated`
|
|
55
|
+
runs unit and integration tests with one integration executable, checks examples,
|
|
56
|
+
and runs doctests. It can replace `task test` when linking is costly. An equivalent
|
|
57
|
+
Rust validation slice is `task lint:rust`, `task check`, `task test:consolidated`,
|
|
58
|
+
and `python scripts/ci/lme_ci.py doc`.
|
|
59
|
+
- `task ci` includes Rust, bindings, portable examples, lint, compilation, legal,
|
|
60
|
+
documentation, and completion checks. It does not replace audits/metadata in
|
|
61
|
+
`task preflight`, R/Julia checks, or performance harnesses. `task ci:fast` skips
|
|
62
|
+
the isolated-wheel pass; report that limitation.
|
|
63
|
+
- Reuse passing results for unchanged files/dependencies in the same task. Rerun
|
|
64
|
+
affected checks after edits; broaden when scope or evidence requires it.
|
|
65
|
+
Keep hooks enabled even when they repeat earlier checks.
|
|
66
|
+
- Serialize Cargo commands sharing a target directory. Capture verbose logs and
|
|
67
|
+
inspect exit status and summaries. A timeout or compilation in progress is not a failed test.
|
|
68
|
+
|
|
69
|
+
## Correctness and evidence
|
|
70
|
+
|
|
71
|
+
- Add regression coverage for bug fixes. Prefer statistical identities, explicit
|
|
72
|
+
expected behavior, and independent fixtures over duplicating the implementation.
|
|
73
|
+
- Register new integration test files in [tests/ci_consolidated.rs](tests/ci_consolidated.rs).
|
|
74
|
+
- For R/Julia parity, match rows, formula, family/link, weights, offsets, and ML/REML.
|
|
75
|
+
Explain tolerances; do not loosen them just to make a failure pass.
|
|
76
|
+
- Tie benchmark claims to the revision, environment, and measured cases. Follow
|
|
77
|
+
[BENCHMARKS.md](BENCHMARKS.md) and [OPTIMIZATION.md](OPTIMIZATION.md); a focused
|
|
78
|
+
speedup does not establish general parity or completion.
|
|
79
|
+
|
|
80
|
+
### Completion scores are generated claims
|
|
81
|
+
|
|
82
|
+
[completion_manifest.json](completion_manifest.json) governs the README headline
|
|
83
|
+
and all percentages in [REPO_COMPLETION_BY_AREA.md](REPO_COMPLETION_BY_AREA.md).
|
|
84
|
+
It declares weighted binary commitments, locked `scope` strings, evidence paths,
|
|
85
|
+
and a `gap` for every incomplete criterion.
|
|
86
|
+
|
|
87
|
+
- Complete an item only when its locked scope is met and evidence is current.
|
|
88
|
+
Partial, stale, or substituted evidence earns zero; an API or focused benchmark is insufficient.
|
|
89
|
+
- Do not narrow/replace `scope` to earn credit or edit generated percentages by hand.
|
|
90
|
+
Update the manifest and supporting evidence together.
|
|
91
|
+
- `task completion:check` validates schema version 2, names/scopes/gaps, evidence
|
|
92
|
+
paths, arithmetic, report rows, and the README headline. `task ci` includes it.
|
|
93
|
+
|
|
94
|
+
## Setup and recovery
|
|
95
|
+
|
|
96
|
+
- [mise.toml](mise.toml) configures Rust stable, Python 3.11, uv, Task, and Lefthook.
|
|
97
|
+
Use `task setup` for tools and hooks; run `mise install` first if Task is missing.
|
|
98
|
+
With tools already installed, use `task hooks:install`. Pre-push audits also
|
|
99
|
+
require `cargo-audit` (`cargo install cargo-audit`).
|
|
100
|
+
- For missing PATH entries, use `mise exec -- task <name>`. Locate installed tools
|
|
101
|
+
before reinstalling. Verify subprocess discovery in the actual environment with
|
|
102
|
+
`python -c "import shutil; print(shutil.which('uv'))"` when necessary.
|
|
103
|
+
- Without Task, use `python scripts/ci/lme_ci.py <subcommand>` (`python3` where
|
|
104
|
+
appropriate). Mappings are in [Taskfile.yml](Taskfile.yml): `test:fast` → `test-fast`,
|
|
105
|
+
`rust` → `rust-all`, `lint:python` → `ruff-lint`, `docs:check` → `docs-check`.
|
|
106
|
+
Use `--help` for all commands. Implement new checks in this runner, not duplicate shell logic.
|
|
107
|
+
- For Git dubious ownership, use `git -c safe.directory=C:/path/to/lme-rs <command>`
|
|
108
|
+
with this checkout's absolute forward-slash path; do not trust all directories globally.
|
|
109
|
+
- x86_64 builds link static Intel MKL via `ndarray-linalg`; first builds can be slow.
|
|
110
|
+
Run numerical examples with `--release`, e.g. `cargo run --release --locked --example sleepstudy`.
|
|
111
|
+
Leave the CI runner's own build profiles unchanged.
|
|
112
|
+
- Windows linker errors `LNK1318`/`LNK1106` can indicate disk exhaustion. Check space
|
|
113
|
+
and active builds first. Before cleaning, verify the target belongs to this checkout
|
|
114
|
+
and no build uses it; avoid broad cache deletion.
|
|
115
|
+
- `uv sync` can uninstall the editable Python extension. Restore it from `python/`
|
|
116
|
+
with `uv run --no-sync maturin develop --release`, or rerun `task python`.
|
|
117
|
+
Run Python examples there with `uv run --no-sync python examples/<name>.py`.
|
|
118
|
+
|
|
119
|
+
## Git, hooks, and release boundaries
|
|
120
|
+
|
|
121
|
+
- Follow the user's commit/push scope; commit authorization alone does not authorize
|
|
122
|
+
pushing. When already authorized, complete validation and delivery without asking again.
|
|
123
|
+
- For requested updates, fetch before comparing branches; fast-forward only when
|
|
124
|
+
ancestry and local changes permit it. After pushing, verify HEAD, the tracking ref,
|
|
125
|
+
and live remote branch SHA agree, and report remaining local changes.
|
|
126
|
+
- Lefthook checks matching staged files: Rust format/Clippy, Python Ruff, comparison
|
|
127
|
+
formatting, manifests, benchmarks/dashboard, and metadata. Hooks may auto-stage
|
|
128
|
+
formatting; inspect the result. They do not run full Rust/bindings suites or `pip-audit`.
|
|
129
|
+
- Pre-push runs `task preflight`: lint, all-target compilation, Cargo audits,
|
|
130
|
+
legal/provenance, and metadata validation. Use `--no-verify` only when explicitly
|
|
131
|
+
necessary; report the bypass and omitted checks.
|
|
132
|
+
- Hosted validation runs on PRs, `v*` tags, and manual dispatch, not ordinary branch
|
|
133
|
+
pushes. Cache-prime is not validation. Hosted coverage adds the OS/Python matrix,
|
|
134
|
+
production-load gates, and `pip-audit`; PRs skip the four heavy ignored cases.
|
|
135
|
+
- Inspect the exact failing CI job/log before changing code. Do not merge with a
|
|
136
|
+
failing security audit. For metadata authentication, use `REPO_ADMIN_TOKEN` with
|
|
137
|
+
`task repo-metadata`; a hosted `401` requires checking/rotating the Actions secret.
|
|
138
|
+
- Preserve full-SHA action pins and readable version comments. After BLAS target-table
|
|
139
|
+
or release-workflow changes, run `task ci` or manually dispatch CI before tagging;
|
|
140
|
+
Windows/Linux cannot validate macOS Apple Silicon BLAS.
|
|
141
|
+
- Tag CI gates crates.io publishing and dispatches PyPI only after validation succeeds.
|
|
142
|
+
Keep PyPI top-level for Trusted Publishing attestations; publishing workflows must
|
|
143
|
+
not independently listen to tags. Read [RELEASING.md](RELEASING.md) before releases.
|
|
144
|
+
- R/Julia benchmark workflow coverage belongs in tag/manual runs. `task benchmarks:preflight`
|
|
145
|
+
includes Rust smoke and R smoke when R/lme4 is installed. Optional tool skips are not passes.
|
|
146
|
+
|
|
147
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for extended guidance and
|
|
148
|
+
[Taskfile.yml](Taskfile.yml) for less common commands.
|
|
@@ -5,14 +5,65 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.2.4] - 2026-09-10
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Rework the Rust API documentation landing page with model-specific entry points,
|
|
15
|
+
prediction and inference guidance, and explicit published/development version
|
|
16
|
+
boundaries. Add responsive styling for rustdoc's light, dark, and Ayu themes,
|
|
17
|
+
shared by docs.rs builds and the local documentation checks.
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- Reject likelihood-ratio comparisons that mix ML and REML, use differing or
|
|
22
|
+
unavailable REML fixed-effects designs, or contain nonfinite deviances. Refit
|
|
23
|
+
models with ML when comparing different fixed effects; comparisons of REML
|
|
24
|
+
random-effects structures with identical fixed-effects designs remain supported.
|
|
25
|
+
- Keep coefficient and marginal-mean confidence intervals finite at confidence
|
|
26
|
+
levels just below one. Reject unavailable/invalid denominator degrees of freedom
|
|
27
|
+
instead of replacing them with one, and honor valid positive fractional values.
|
|
28
|
+
- Preserve unavailable p-values through Bonferroni, Holm, and Tukey adjustments;
|
|
29
|
+
Holm retains the original comparison-family size while excluding missing values
|
|
30
|
+
from its ordering. Invalid Tukey statistics or degrees of freedom remain unavailable.
|
|
31
|
+
- Preserve very small asymptotic p-values in marginal-mean comparisons, multiple
|
|
32
|
+
comparisons, and robust coefficient tests, and small chi-squared p-values in
|
|
33
|
+
likelihood-ratio model comparisons.
|
|
34
|
+
- Retain small nonzero contrast weights in Satterthwaite tests instead of treating
|
|
35
|
+
them as zero when selecting cached single-coefficient results.
|
|
36
|
+
- Make the blocked LMM optimizer objective agree with the final deviance for
|
|
37
|
+
nested random effects such as `(1 | batch/cask)`. Correct the sparse cross-block
|
|
38
|
+
transpose and dense Schur subtraction; regression coverage includes ML, REML,
|
|
39
|
+
zero-variance boundaries, and the converged fit
|
|
40
|
+
([#25](https://github.com/x4g4p3x/lme-rs/issues/25)).
|
|
41
|
+
- Keep Satterthwaite and Kenward-Roger contrast tests invariant to very small,
|
|
42
|
+
very large, or negative rescalings of the same hypothesis.
|
|
43
|
+
- Reduce redundant Kenward-Roger contrast rows to an independent basis so
|
|
44
|
+
duplicate restrictions and differing row units do not cause singular solves
|
|
45
|
+
or change the test's degrees of freedom. Reject all-zero contrast matrices.
|
|
46
|
+
- Preserve very small Satterthwaite coefficient and contrast p-values by
|
|
47
|
+
evaluating upper-tail probabilities directly instead of subtracting from one.
|
|
48
|
+
- Respect observation precision weights in Gamma simulation, with variance
|
|
49
|
+
proportional to dispersion divided by the observation weight.
|
|
50
|
+
- Reject Gaussian and Gamma simulation when residual variance or dispersion is
|
|
51
|
+
missing, nonfinite, or invalid, including saturated OLS fits with no estimated
|
|
52
|
+
residual variance. Zero Gaussian residual variance remains valid and produces
|
|
53
|
+
noiseless draws; Gamma dispersion must be positive. Apply the same checks to
|
|
54
|
+
sequential and parallel simulation.
|
|
55
|
+
- Return an error for overflowing simulation index ranges instead of panicking
|
|
56
|
+
or wrapping indices; the last representable single index remains valid.
|
|
57
|
+
|
|
8
58
|
## [0.2.3] - 2026-09-09
|
|
9
59
|
|
|
10
60
|
### Fixed
|
|
11
61
|
|
|
12
62
|
- Preserve offsets and observation weights throughout Satterthwaite and Kenward-Roger inference.
|
|
13
63
|
- Use one Kenward-Roger covariance adjustment for marginal and joint tests, confidence
|
|
14
|
-
intervals, estimated marginal means,
|
|
15
|
-
for very small p-values and reject nonfinite
|
|
64
|
+
intervals, estimated marginal means, multiple comparisons, and printed model
|
|
65
|
+
summaries; retain precision for very small p-values and reject nonfinite
|
|
66
|
+
contrast inputs.
|
|
16
67
|
- Respect precision weights in observation-level and cluster-robust standard errors.
|
|
17
68
|
- Keep nested grouping labels distinct when components contain underscores or backslashes.
|
|
18
69
|
- Honor requested grouped cross-validation fold counts, accept supported numeric
|
|
@@ -20,8 +71,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
20
71
|
- Preserve predictors and responses named `intercept` in formula models.
|
|
21
72
|
- Reject nonfinite confidence levels and mismatched or missing robust-inference data.
|
|
22
73
|
- Leave uncertainty unavailable when an OLS fit has no residual degrees of freedom.
|
|
23
|
-
|
|
24
|
-
|
|
25
74
|
- Preserve formula offsets in population/conditional predictions and OLS fitting.
|
|
26
75
|
- Preserve precision weights in Gaussian simulation and bootstrap refits; weighted
|
|
27
76
|
residual resampling uses standardized residuals.
|
|
@@ -133,6 +133,15 @@ matching scripts. The tag/manual benchmark workflow requires the formatters.
|
|
|
133
133
|
|
|
134
134
|
Use [the documentation index](docs/README.md) as the navigation map.
|
|
135
135
|
|
|
136
|
+
The Rust API landing page comes from [docs/rustdoc.md](docs/rustdoc.md), included
|
|
137
|
+
by [src/lib.rs](src/lib.rs). Its theme extension is
|
|
138
|
+
[docs/rustdoc.css](docs/rustdoc.css). Run `task doc` to build the styled preview
|
|
139
|
+
at `target/doc/lme_rs/index.html`; `task docs:check` also tests its Rust examples
|
|
140
|
+
and intra-doc links. Keep the stylesheet arguments in `Cargo.toml` and the
|
|
141
|
+
shared CI runner aligned. Check light, dark, and Ayu themes and a narrow viewport
|
|
142
|
+
after styling changes. docs.rs builds the published crate, so repository edits
|
|
143
|
+
reach that site with a new release, following [RELEASING.md](RELEASING.md).
|
|
144
|
+
|
|
136
145
|
| Content | Canonical location |
|
|
137
146
|
|:--------|:-------------------|
|
|
138
147
|
| Introduction and first successful fit | [README.md](README.md) |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "lme-rs"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.4"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
authors = ["Martin Huck <x4g4p3x@users.noreply.github.com>"]
|
|
6
6
|
description = "Rust port of R's lme4: linear, generalized, and nonlinear mixed-effects models"
|
|
@@ -11,6 +11,9 @@ readme = "README.md"
|
|
|
11
11
|
keywords = ["statistics", "lme4", "mixed-effects", "glmm", "regression"]
|
|
12
12
|
categories = ["science", "mathematics"]
|
|
13
13
|
|
|
14
|
+
[package.metadata.docs.rs]
|
|
15
|
+
rustdoc-args = ["--extend-css", "docs/rustdoc.css"]
|
|
16
|
+
|
|
14
17
|
[features]
|
|
15
18
|
# Enables `bench_load_production` (large synthetic workloads; not run by default `cargo bench`).
|
|
16
19
|
slow-production-benches = []
|
|
@@ -6,7 +6,7 @@ This file gives an **evidence-weighted implementation-coverage score** for major
|
|
|
6
6
|
|
|
7
7
|
**Last assessed:** 2026-09-09 (full post-refactor Rust/Julia run records current strict-throughput gaps).
|
|
8
8
|
|
|
9
|
-
**Versions checked:** `lme-rs` **0.2.
|
|
9
|
+
**Versions checked:** `lme-rs` **0.2.4-dev.0** (root [`Cargo.toml`](Cargo.toml)); Python extension **`lme_python` 0.2.4-dev.0** ([`python/Cargo.toml`](python/Cargo.toml)).
|
|
10
10
|
|
|
11
11
|
Repository completion is judged on **three** axes, not features alone:
|
|
12
12
|
|
|
@@ -50,6 +50,11 @@ tasks:
|
|
|
50
50
|
cmds:
|
|
51
51
|
- '{{.RUN}} completion-check'
|
|
52
52
|
|
|
53
|
+
doc:
|
|
54
|
+
desc: Build the styled Rust API documentation for local preview
|
|
55
|
+
cmds:
|
|
56
|
+
- '{{.RUN}} doc'
|
|
57
|
+
|
|
53
58
|
docs:check:
|
|
54
59
|
desc: Validate Markdown links, Rust examples/doctests, and generated docs
|
|
55
60
|
cmds:
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/* Shared by docs.rs and `task doc` / `task docs:check`.
|
|
2
|
+
* Extend the built-in rustdoc themes without replacing navigation or search.
|
|
3
|
+
* Keep all fonts and assets local to rustdoc; no remote dependencies.
|
|
4
|
+
*/
|
|
5
|
+
:root {
|
|
6
|
+
--lme-accent: #08756c;
|
|
7
|
+
--lme-tint: #f0f8f6;
|
|
8
|
+
--lme-muted: #536662;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
:root[data-theme="dark"] {
|
|
12
|
+
--lme-accent: #80d9c6;
|
|
13
|
+
--lme-tint: #253532;
|
|
14
|
+
--lme-muted: #b4c7c2;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
:root[data-theme="ayu"] {
|
|
18
|
+
--lme-accent: #80ddd2;
|
|
19
|
+
--lme-tint: #192b2c;
|
|
20
|
+
--lme-muted: #b0c5c7;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
body.rustdoc main .docblock {
|
|
24
|
+
font-family: "Fira Sans", system-ui, sans-serif;
|
|
25
|
+
line-height: 1.7;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
body.rustdoc main .docblock a {
|
|
29
|
+
color: var(--lme-accent);
|
|
30
|
+
text-underline-offset: 0.18em;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
body.rustdoc main .docblock a:hover {
|
|
34
|
+
text-decoration: underline;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
body.rustdoc main .docblock h2 {
|
|
38
|
+
margin-top: 2.2rem;
|
|
39
|
+
padding-bottom: 0.5rem;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
body.rustdoc main .docblock pre {
|
|
43
|
+
border: 1px solid var(--border-color);
|
|
44
|
+
border-radius: 8px;
|
|
45
|
+
padding: 1.1rem;
|
|
46
|
+
line-height: 1.55;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
body.rustdoc main .docblock table {
|
|
50
|
+
width: 100%;
|
|
51
|
+
margin: 1rem 0;
|
|
52
|
+
font-size: 0.95em;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
body.rustdoc main .docblock th,
|
|
56
|
+
body.rustdoc main .docblock td {
|
|
57
|
+
padding: 0.85rem 1rem;
|
|
58
|
+
vertical-align: top;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.lme-hero {
|
|
62
|
+
margin: 1.5rem 0 2rem;
|
|
63
|
+
padding: 1.75rem 2rem;
|
|
64
|
+
background: var(--lme-tint);
|
|
65
|
+
border: 1px solid var(--border-color);
|
|
66
|
+
border-left: 4px solid var(--lme-accent);
|
|
67
|
+
border-radius: 4px 12px 12px 4px;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.lme-hero .lme-eyebrow {
|
|
71
|
+
margin: 0 0 0.65rem;
|
|
72
|
+
color: var(--lme-muted);
|
|
73
|
+
font-size: 0.75rem;
|
|
74
|
+
font-weight: 500;
|
|
75
|
+
letter-spacing: 0.1em;
|
|
76
|
+
text-transform: uppercase;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.lme-hero .lme-title {
|
|
80
|
+
margin: 0;
|
|
81
|
+
font-size: clamp(1.6rem, 3vw, 2.35rem);
|
|
82
|
+
font-weight: 500;
|
|
83
|
+
line-height: 1.2;
|
|
84
|
+
letter-spacing: -0.035em;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.lme-jump {
|
|
88
|
+
display: flex;
|
|
89
|
+
flex-wrap: wrap;
|
|
90
|
+
gap: 0.6rem;
|
|
91
|
+
margin-top: 1.35rem;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.lme-jump a {
|
|
95
|
+
padding: 0.35rem 0.85rem;
|
|
96
|
+
border: 1px solid var(--lme-accent);
|
|
97
|
+
border-radius: 6px;
|
|
98
|
+
font-size: 0.85rem;
|
|
99
|
+
font-weight: 500;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.lme-pathways {
|
|
103
|
+
display: grid;
|
|
104
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
105
|
+
gap: 0.9rem;
|
|
106
|
+
margin-top: 1rem;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.lme-path {
|
|
110
|
+
min-width: 0;
|
|
111
|
+
padding: 1rem 1.2rem;
|
|
112
|
+
border: 1px solid var(--border-color);
|
|
113
|
+
border-radius: 8px;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.lme-path p:first-child {
|
|
117
|
+
margin-top: 0;
|
|
118
|
+
font-size: 1.1rem;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.lme-path p:last-child {
|
|
122
|
+
margin-bottom: 0;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.lme-note {
|
|
126
|
+
margin: 1.25rem 0;
|
|
127
|
+
padding: 0.1rem 1.25rem;
|
|
128
|
+
background: var(--lme-tint);
|
|
129
|
+
border-left: 3px solid var(--lme-accent);
|
|
130
|
+
border-radius: 0 6px 6px 0;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@media (max-width: 700px) {
|
|
134
|
+
.lme-hero {
|
|
135
|
+
padding: 1.25rem;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.lme-pathways {
|
|
139
|
+
grid-template-columns: 1fr;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
body.rustdoc main .docblock th,
|
|
143
|
+
body.rustdoc main .docblock td {
|
|
144
|
+
padding: 0.65rem;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
@media print {
|
|
149
|
+
.lme-hero,
|
|
150
|
+
.lme-note {
|
|
151
|
+
background: transparent;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.lme-path {
|
|
155
|
+
break-inside: avoid;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
Linear, generalized linear, and nonlinear mixed-effects models with
|
|
2
|
+
`lme4`-style formulas and Polars DataFrames.
|
|
3
|
+
|
|
4
|
+
<div class="lme-hero">
|
|
5
|
+
<p class="lme-eyebrow">lme-rs · Rust API reference</p>
|
|
6
|
+
<p class="lme-title">From formula to fitted model.</p>
|
|
7
|
+
<p>Fit a model, inspect its numerical diagnostics, and choose the prediction or
|
|
8
|
+
inference method that matches your question.</p>
|
|
9
|
+
<nav class="lme-jump" aria-label="Getting started">
|
|
10
|
+
<a href="#choose-a-model">Choose a model</a>
|
|
11
|
+
<a href="#first-fit">First fit</a>
|
|
12
|
+
<a href="#use-the-result">Use the result</a>
|
|
13
|
+
</nav>
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
# Choose a model
|
|
17
|
+
|
|
18
|
+
<div class="lme-pathways">
|
|
19
|
+
<div class="lme-path">
|
|
20
|
+
|
|
21
|
+
**Linear regression**
|
|
22
|
+
|
|
23
|
+
[`lm_df`] fits ordinary least squares from a formula. Use [`lm`] when you already
|
|
24
|
+
have response and design arrays.
|
|
25
|
+
|
|
26
|
+
</div>
|
|
27
|
+
<div class="lme-path">
|
|
28
|
+
|
|
29
|
+
**Linear mixed models**
|
|
30
|
+
|
|
31
|
+
[`lmer`] fits Gaussian mixed models using REML or maximum likelihood.
|
|
32
|
+
[`lmer_weighted`] adds observation precision weights.
|
|
33
|
+
|
|
34
|
+
</div>
|
|
35
|
+
<div class="lme-path">
|
|
36
|
+
|
|
37
|
+
**Generalized mixed models**
|
|
38
|
+
|
|
39
|
+
[`glmer`] fits a selected [`family::Family`]. [`glmer_with_link`] selects the link;
|
|
40
|
+
[`FitDiagnostics`] records the quadrature order actually used.
|
|
41
|
+
|
|
42
|
+
</div>
|
|
43
|
+
<div class="lme-path">
|
|
44
|
+
|
|
45
|
+
**Nonlinear mixed models**
|
|
46
|
+
|
|
47
|
+
[`nlmer`] fits built-in nonlinear mean functions. [`nlmer_with_mean`] accepts a
|
|
48
|
+
custom mean; [`NlmerOptions`] configures fitting.
|
|
49
|
+
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
# First fit
|
|
54
|
+
|
|
55
|
+
This small example fits a random intercept for each group. The final `true`
|
|
56
|
+
selects REML; use `false` for maximum likelihood.
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
use lme_rs::lmer;
|
|
60
|
+
use polars::prelude::*;
|
|
61
|
+
|
|
62
|
+
# fn main() -> anyhow::Result<()> {
|
|
63
|
+
let data = df!(
|
|
64
|
+
"y" => [
|
|
65
|
+
10.0, 12.0, 13.0, 15.0,
|
|
66
|
+
9.0, 11.0, 14.0, 17.0,
|
|
67
|
+
8.0, 10.0, 12.0, 14.0,
|
|
68
|
+
],
|
|
69
|
+
"x" => [0.0, 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 3.0,
|
|
70
|
+
0.0, 1.0, 2.0, 3.0],
|
|
71
|
+
"group" => ["a", "a", "a", "a", "b", "b", "b", "b",
|
|
72
|
+
"c", "c", "c", "c"],
|
|
73
|
+
)?;
|
|
74
|
+
|
|
75
|
+
let fit = lmer("y ~ x + (1 | group)", &data, true)?;
|
|
76
|
+
let population_predictions = fit.predict(&data)?;
|
|
77
|
+
assert_eq!(population_predictions.len(), data.height());
|
|
78
|
+
# Ok(())
|
|
79
|
+
# }
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
The result is an [`LmeFit`]. Inspect its coefficients, variance estimates, and
|
|
83
|
+
`diagnostics` before interpreting a fit. With [`FitControl`], you can set iteration
|
|
84
|
+
limits, supply starting values, and require numerical convergence through
|
|
85
|
+
[`fit_prepared_with_control`] or [`fit_prepared_glmer_with_control`].
|
|
86
|
+
|
|
87
|
+
# Use the result
|
|
88
|
+
|
|
89
|
+
| Your question | API and interpretation |
|
|
90
|
+
| --- | --- |
|
|
91
|
+
| Predictions from fixed effects? | [`LmeFit::predict`] omits group effects. For GLMMs it returns the linear predictor, including any offset. |
|
|
92
|
+
| Predictions for known groups? | [`LmeFit::predict_conditional`] includes stored group effects. Its `allow_new_levels` option controls the fallback for unseen groups. |
|
|
93
|
+
| GLMM response means? | [`LmeFit::predict_response`] and [`LmeFit::predict_conditional_response`] apply the inverse link, with group effects omitted or included respectively. |
|
|
94
|
+
| Confidence intervals? | [`LmeFit::confint`] gives Wald intervals. [`profile_ci`] provides profile-likelihood alternatives and documents supported parameters. |
|
|
95
|
+
| Fixed-effect hypotheses? | [`contrast`] provides Wald F-tests; [`emmeans`] provides reference-grid marginal means and pairwise comparisons. |
|
|
96
|
+
| Compare nested LMMs? | [`anova()`] compares likelihoods. Use the same observations and fit with ML when fixed effects differ; REML comparisons require identical fixed-effects designs. |
|
|
97
|
+
| Assess predictions on held-out groups? | [`cv_grouped`] and [`cv_grouped_glmer`] preserve grouping structure when splitting folds. |
|
|
98
|
+
| Simulate or bootstrap? | [`LmeFit::simulate`] draws responses from fitted conditional means. [`boot_lmer`] and [`boot_glmer`] perform bootstrap refits. |
|
|
99
|
+
|
|
100
|
+
# Reuse a design
|
|
101
|
+
|
|
102
|
+
For repeated fits with the same design, start with [`prepare_lmer`] or
|
|
103
|
+
[`prepare_glmer`]. The resulting [`LmerPrepared`] and [`GlmerPrepared`] objects
|
|
104
|
+
retain the design and model metadata. Fit with [`fit_prepared`] or
|
|
105
|
+
[`fit_prepared_glmer`], or replace only the response with
|
|
106
|
+
[`fit_prepared_with_response`] or [`fit_prepared_glmer_with_response`].
|
|
107
|
+
[`LmerWorkspace`] provides reusable buffers for repeated LMM responses.
|
|
108
|
+
|
|
109
|
+
# Scope and versions
|
|
110
|
+
|
|
111
|
+
<div class="lme-note">
|
|
112
|
+
|
|
113
|
+
**Read the documentation for the version you use.**
|
|
114
|
+
|
|
115
|
+
On docs.rs, the version selector identifies the published crate documented on
|
|
116
|
+
this page. Changes on the repository's development branch appear here only after
|
|
117
|
+
a new crate release. The [development changelog](https://github.com/x4g4p3x/lme-rs/blob/master/CHANGELOG.md)
|
|
118
|
+
separates **Unreleased** changes from published releases.
|
|
119
|
+
|
|
120
|
+
</div>
|
|
121
|
+
|
|
122
|
+
Numerical compatibility is established for tested models and reference fixtures.
|
|
123
|
+
Formula syntax, quadrature, and post-fit inference cover a subset of R's mixed-model
|
|
124
|
+
ecosystem; support varies by model and method. See each API's documented limits
|
|
125
|
+
and check fit diagnostics, including approximation warnings.
|
|
126
|
+
|
|
127
|
+
Continue with the [Rust guide](https://github.com/x4g4p3x/lme-rs/blob/master/GUIDE.md),
|
|
128
|
+
[documentation index](https://github.com/x4g4p3x/lme-rs/blob/master/docs/README.md), or
|
|
129
|
+
[workflow assessment](https://github.com/x4g4p3x/lme-rs/blob/master/USABILITY.md).
|
|
130
|
+
These repository links follow `master`; select the matching release tag when
|
|
131
|
+
reading about a published version. The API index below belongs to this build.
|
|
@@ -1262,7 +1262,7 @@ checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"
|
|
|
1262
1262
|
|
|
1263
1263
|
[[package]]
|
|
1264
1264
|
name = "lme-rs"
|
|
1265
|
-
version = "0.2.
|
|
1265
|
+
version = "0.2.4"
|
|
1266
1266
|
dependencies = [
|
|
1267
1267
|
"ahash",
|
|
1268
1268
|
"anyhow",
|
|
@@ -1286,7 +1286,7 @@ dependencies = [
|
|
|
1286
1286
|
|
|
1287
1287
|
[[package]]
|
|
1288
1288
|
name = "lme_python"
|
|
1289
|
-
version = "0.2.
|
|
1289
|
+
version = "0.2.4"
|
|
1290
1290
|
dependencies = [
|
|
1291
1291
|
"lme-rs",
|
|
1292
1292
|
"ndarray 0.16.1",
|
|
@@ -220,7 +220,8 @@ def cargo_doctest() -> None:
|
|
|
220
220
|
def cargo_doc() -> None:
|
|
221
221
|
run(
|
|
222
222
|
["cargo", "doc", "--no-deps", "--verbose", "--locked"],
|
|
223
|
-
|
|
223
|
+
# Match the stylesheet in package.metadata.docs.rs for local previews.
|
|
224
|
+
env={"RUSTDOCFLAGS": "-D warnings --extend-css docs/rustdoc.css"},
|
|
224
225
|
)
|
|
225
226
|
|
|
226
227
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//! Parametric and residual bootstrap refits for
|
|
1
|
+
//! Parametric and residual bootstrap refits for LMMs, and parametric refits for GLMMs.
|
|
2
2
|
//!
|
|
3
3
|
//! Mirrors R's `lme4::bootMer` workflow: simulate or resample responses, refit,
|
|
4
4
|
//! and summarize bootstrap draws. Uses [`crate::prepare_lmer`] + [`crate::fit_prepared_with_response`]
|