v0.1.6
What's fixed
Statistical correctness
pairs(apply_kenward_roger(em))now matchesapply_kenward_roger(pairs(em))to floating-point precision. The 0.1.4 KR-idempotency guard was short-circuiting on freshly-built contrast results that inheritdf_method="kenward_roger"from the source EMM but whoseSEwas still computed from the uncorrectedV_beta— so the KR-corrected SE was never written. Same fix applied to Satterthwaite. Bug surfaced as ~1e-4 SE drift onpairs(em_kr)vsapply_kenward_roger(pairs(em)).apply_satterthwaite/apply_kenward_rogernow refuse cross-correction inputs. Previouslyapply_satterthwaite(apply_kenward_roger(em))silently rebuiltSEfrom the uncorrectedV_beta, discarding the KR step while keeping the Satt df. Both functions now raiseValueErrorwith a steer-the-user message; same-method idempotency short-circuits are unchanged.joint_testsrefuses posterior-derived inputs. The 0.1.4 EMMResult dispatch path accepted any input that exposedmodel_info, including posteriorEMMResults, and silently returned NaN.- Cox PH detection no longer false-positives on class-name collision. 0.1.5 matched on bare class names (
{"PHReg", "PHRegResults", "PHRegResultsWrapper"}); the check is now a module-qualifiedisinstanceagainststatsmodels.duration.hazard_regression.
Tooling
benchmarks/bench_performance.pynow passesmax_contrasts=Nonetopairs(emmeans(model, "group"))sopairwise_k20…pairwise_k200rows indocs/PERFORMANCE_REPORT.mdare reachable; added a failure-collection gate so future regressions can't produce a partial report.ruff check src testsclean.- Narrow
filterwarningsregex on the pbmodcomp convergence test.
Documentation
- README banner:
v0.1.5→v0.1.6;docs/index.md,docs/PERFORMANCE_REPORT.md,CITATION.cffsynced. - Performance highlights:
~14×→~11.5×,~8×→~7.7×so README matchesdocs/PERFORMANCE_REPORT.mdexactly. pytest --doctest-modules src/pymmeansis now clean (ml.py::from_predictexample was crashing collection on an unindented function body;emmeans.py's doctest gained+NORMALIZE_WHITESPACE;cld.pyseeded its RNG).- Empty-parenthetical scrub artifacts cleaned from ~40 docstrings/comments across 13 source files.
Install
pip install pymmeans[tutorial] now pulls linearmodels>=5.0, so the documented install reaches the full 313-test public surface without a separate install step.