phit

Logistic regression

Verification

Scope

Coefficients, covariance matrices, standard errors, z statistics, p-values, confidence intervals, fitted values, residuals, log likelihood, deviance, null deviance, and AIC. Identical design matrices and missing-data exclusions across implementations.

References

Reference
R glm(family = binomial)
Versions
R 4.6.1, statsmodels 0.15.0, numpy 2.5.4, Python 3.14.7, PHP 8.5.10

Data

Inputs
Six saved R fixtures: the simulated learning sample, one predictor, no intercept, intercept only, correlated columns, and imbalanced outcomes, plus a listwise-deletion case with two dropped rows.

Method

Each design is fitted by R, statsmodels, and phit's matrix function, with the intercept supplied as a column. Every quantity is compared with R, and each case's status is recomputed from the saved values.

Check
Comparison with a reference implementation
Recorded
2026-11-01, PHP 8.5.10, macOS 27.0.1 (arm64), commit 066e2e1

Tolerances

|x − r| ≤ 1e-9 + 1e-7 × |r|

Applies to: Numerical results

exact equality

Applies to: Row indices, counts, and warnings

x: package value; r: reference value. Absolute error: |x − r|. Max errors are over the values a row compares. statsmodels: that implementation’s error against the same reference.

Results

91 comparisons in 7 cases: 91 pass, 0 fail, 0 skipped.

By case

Results by case
Case Comparisons Largest abs. error Status
Simulated learning sample 13 1.1e-11 pass
One predictor 13 1.8e-12 pass
No intercept 13 3.8e-12 pass
Intercept only 13 6.5e-13 pass
Correlated predictors 13 1.0e-12 pass
Imbalanced outcomes 13 3.5e-8 pass
Listwise deletion of missing values 13 1.4e-11 pass
All 91 comparisons
Every comparison
Case Quantity Criterion Values Package value Reference value Max abs. error statsmodels Status
Simulated learning sample Coefficients |x − r| ≤ 1e-9 + 1e-7 × |r| 3 1.1e-14 2.5e-16 pass
Covariance matrix |x − r| ≤ 1e-9 + 1e-7 × |r| 9 8.6e-13 9.0e-13 pass
Standard errors |x − r| ≤ 1e-9 + 1e-7 × |r| 3 2.9e-13 3.0e-13 pass
z statistics |x − r| ≤ 1e-9 + 1e-7 × |r| 3 4.1e-13 4.4e-13 pass
p-values |x − r| ≤ 1e-9 + 1e-7 × |r| 3 1.1e-11 6.7e-14 pass
Confidence intervals |x − r| ≤ 1e-9 + 1e-7 × |r| 6 5.8e-13 6.0e-13 pass
Fitted values |x − r| ≤ 1e-9 + 1e-7 × |r| 80 1.2e-15 7.8e-16 pass
Residuals |x − r| ≤ 1e-9 + 1e-7 × |r| 80 1.2e-15 7.8e-16 pass
Log likelihood |x − r| ≤ 1e-9 + 1e-7 × |r| 1 -49.48432506 -49.48432506 1.4e-14 2.1e-14 pass
Deviance |x − r| ≤ 1e-9 + 1e-7 × |r| 1 98.96865011 98.96865011 2.8e-14 4.3e-14 pass
Null deviance |x − r| ≤ 1e-9 + 1e-7 × |r| 1 104.7748889 104.7748889 1.4e-13 1.3e-13 pass
AIC |x − r| ≤ 1e-9 + 1e-7 × |r| 1 104.9686501 104.9686501 2.8e-14 4.3e-14 pass
Residual degrees of freedom |x − r| ≤ 1e-9 + 1e-7 × |r| 1 77 77 0 0 pass
One predictor Coefficients |x − r| ≤ 1e-9 + 1e-7 × |r| 2 1.1e-15 2.2e-16 pass
Covariance matrix |x − r| ≤ 1e-9 + 1e-7 × |r| 4 3.2e-13 3.2e-13 pass
Standard errors |x − r| ≤ 1e-9 + 1e-7 × |r| 2 2.8e-13 2.8e-13 pass
z statistics |x − r| ≤ 1e-9 + 1e-7 × |r| 2 1.4e-12 1.4e-12 pass
p-values |x − r| ≤ 1e-9 + 1e-7 × |r| 2 1.8e-12 6.9e-14 pass
Confidence intervals |x − r| ≤ 1e-9 + 1e-7 × |r| 4 5.6e-13 5.6e-13 pass
Fitted values |x − r| ≤ 1e-9 + 1e-7 × |r| 80 1.9e-16 1.1e-16 pass
Residuals |x − r| ≤ 1e-9 + 1e-7 × |r| 80 2.2e-16 1.1e-16 pass
Log likelihood |x − r| ≤ 1e-9 + 1e-7 × |r| 1 -50.19852352 -50.19852352 7.1e-15 1.4e-14 pass
Deviance |x − r| ≤ 1e-9 + 1e-7 × |r| 1 100.397047 100.397047 2.8e-14 4.3e-14 pass
Null deviance |x − r| ≤ 1e-9 + 1e-7 × |r| 1 104.7748889 104.7748889 1.4e-13 1.3e-13 pass
AIC |x − r| ≤ 1e-9 + 1e-7 × |r| 1 104.397047 104.397047 1.4e-14 2.8e-14 pass
Residual degrees of freedom |x − r| ≤ 1e-9 + 1e-7 × |r| 1 78 78 0 0 pass
No intercept Coefficients |x − r| ≤ 1e-9 + 1e-7 × |r| 2 1.4e-16 3.5e-18 pass
Covariance matrix |x − r| ≤ 1e-9 + 1e-7 × |r| 4 3.0e-15 3.0e-15 pass
Standard errors |x − r| ≤ 1e-9 + 1e-7 × |r| 2 1.5e-14 1.5e-14 pass
z statistics |x − r| ≤ 1e-9 + 1e-7 × |r| 2 4.4e-13 4.3e-13 pass
p-values |x − r| ≤ 1e-9 + 1e-7 × |r| 2 3.8e-12 4.7e-14 pass
Confidence intervals |x − r| ≤ 1e-9 + 1e-7 × |r| 4 3.0e-14 2.9e-14 pass
Fitted values |x − r| ≤ 1e-9 + 1e-7 × |r| 80 2.2e-16 1.7e-16 pass
Residuals |x − r| ≤ 1e-9 + 1e-7 × |r| 80 2.2e-16 2.2e-16 pass
Log likelihood |x − r| ≤ 1e-9 + 1e-7 × |r| 1 -51.9402042 -51.9402042 7.1e-15 7.1e-15 pass
Deviance |x − r| ≤ 1e-9 + 1e-7 × |r| 1 103.8804084 103.8804084 1.4e-14 1.4e-14 pass
Null deviance |x − r| ≤ 1e-9 + 1e-7 × |r| 1 110.9035489 110.9035489 0 0 pass
AIC |x − r| ≤ 1e-9 + 1e-7 × |r| 1 107.8804084 107.8804084 1.4e-14 1.4e-14 pass
Residual degrees of freedom |x − r| ≤ 1e-9 + 1e-7 × |r| 1 78 78 0 0 pass
Intercept only Coefficients |x − r| ≤ 1e-9 + 1e-7 × |r| 1 1.1e-16 1.1e-16 pass
Covariance matrix |x − r| ≤ 1e-9 + 1e-7 × |r| 1 3.1e-16 3.3e-16 pass
Standard errors |x − r| ≤ 1e-9 + 1e-7 × |r| 1 6.7e-16 6.9e-16 pass
z statistics |x − r| ≤ 1e-9 + 1e-7 × |r| 1 6.7e-15 7.1e-15 pass
p-values |x − r| ≤ 1e-9 + 1e-7 × |r| 1 6.5e-13 3.0e-16 pass
Confidence intervals |x − r| ≤ 1e-9 + 1e-7 × |r| 2 1.6e-15 1.6e-15 pass
Fitted values |x − r| ≤ 1e-9 + 1e-7 × |r| 80 0 0 pass
Residuals |x − r| ≤ 1e-9 + 1e-7 × |r| 80 0 0 pass
Log likelihood |x − r| ≤ 1e-9 + 1e-7 × |r| 1 -52.38744444 -52.38744444 7.1e-14 6.4e-14 pass
Deviance |x − r| ≤ 1e-9 + 1e-7 × |r| 1 104.7748889 104.7748889 1.8e-13 1.7e-13 pass
Null deviance |x − r| ≤ 1e-9 + 1e-7 × |r| 1 104.7748889 104.7748889 1.4e-13 1.3e-13 pass
AIC |x − r| ≤ 1e-9 + 1e-7 × |r| 1 106.7748889 106.7748889 1.4e-13 1.3e-13 pass
Residual degrees of freedom |x − r| ≤ 1e-9 + 1e-7 × |r| 1 79 79 0 0 pass
Correlated predictors Coefficients |x − r| ≤ 1e-9 + 1e-7 × |r| 3 9.3e-15 3.8e-14 pass
Covariance matrix |x − r| ≤ 1e-9 + 1e-7 × |r| 9 9.6e-13 1.3e-12 pass
Standard errors |x − r| ≤ 1e-9 + 1e-7 × |r| 3 2.8e-13 3.8e-13 pass
z statistics |x − r| ≤ 1e-9 + 1e-7 × |r| 3 1.0e-12 1.1e-12 pass
p-values |x − r| ≤ 1e-9 + 1e-7 × |r| 3 1.9e-13 7.8e-14 pass
Confidence intervals |x − r| ≤ 1e-9 + 1e-7 × |r| 6 5.7e-13 7.8e-13 pass
Fitted values |x − r| ≤ 1e-9 + 1e-7 × |r| 80 1.2e-15 2.1e-15 pass
Residuals |x − r| ≤ 1e-9 + 1e-7 × |r| 80 1.2e-15 2.1e-15 pass
Log likelihood |x − r| ≤ 1e-9 + 1e-7 × |r| 1 -50.03090901 -50.03090901 0 7.1e-15 pass
Deviance |x − r| ≤ 1e-9 + 1e-7 × |r| 1 100.061818 100.061818 0 1.4e-14 pass
Null deviance |x − r| ≤ 1e-9 + 1e-7 × |r| 1 104.7748889 104.7748889 1.4e-13 1.3e-13 pass
AIC |x − r| ≤ 1e-9 + 1e-7 × |r| 1 106.061818 106.061818 0 1.4e-14 pass
Residual degrees of freedom |x − r| ≤ 1e-9 + 1e-7 × |r| 1 77 77 0 0 pass
Imbalanced outcomes Coefficients |x − r| ≤ 1e-9 + 1e-7 × |r| 3 4.4e-15 1.8e-15 pass
Covariance matrix |x − r| ≤ 1e-9 + 1e-7 × |r| 9 3.5e-8 3.5e-8 pass
Standard errors |x − r| ≤ 1e-9 + 1e-7 × |r| 3 5.3e-9 5.3e-9 pass
z statistics |x − r| ≤ 1e-9 + 1e-7 × |r| 3 2.7e-9 2.7e-9 pass
p-values |x − r| ≤ 1e-9 + 1e-7 × |r| 3 7.5e-10 7.4e-10 pass
Confidence intervals |x − r| ≤ 1e-9 + 1e-7 × |r| 6 1.0e-8 1.0e-8 pass
Fitted values |x − r| ≤ 1e-9 + 1e-7 × |r| 80 2.2e-16 3.3e-16 pass
Residuals |x − r| ≤ 1e-9 + 1e-7 × |r| 80 2.2e-16 3.3e-16 pass
Log likelihood |x − r| ≤ 1e-9 + 1e-7 × |r| 1 -14.63309801 -14.63309801 7.1e-15 7.1e-15 pass
Deviance |x − r| ≤ 1e-9 + 1e-7 × |r| 1 29.26619601 29.26619601 1.4e-14 1.4e-14 pass
Null deviance |x − r| ≤ 1e-9 + 1e-7 × |r| 1 31.76243894 31.76243894 4.6e-14 4.6e-14 pass
AIC |x − r| ≤ 1e-9 + 1e-7 × |r| 1 35.26619601 35.26619601 1.4e-14 1.4e-14 pass
Residual degrees of freedom |x − r| ≤ 1e-9 + 1e-7 × |r| 1 77 77 0 0 pass
Listwise deletion of missing values Coefficients |x − r| ≤ 1e-9 + 1e-7 × |r| 3 6.2e-15 1.6e-14 pass
Covariance matrix |x − r| ≤ 1e-9 + 1e-7 × |r| 9 1.1e-12 1.2e-12 pass
Standard errors |x − r| ≤ 1e-9 + 1e-7 × |r| 3 3.8e-13 4.1e-13 pass
z statistics |x − r| ≤ 1e-9 + 1e-7 × |r| 3 5.2e-13 5.6e-13 pass
p-values |x − r| ≤ 1e-9 + 1e-7 × |r| 3 1.4e-11 9.3e-14 pass
Confidence intervals |x − r| ≤ 1e-9 + 1e-7 × |r| 6 7.6e-13 8.1e-13 pass
Fitted values |x − r| ≤ 1e-9 + 1e-7 × |r| 78 1.2e-15 2.4e-15 pass
Residuals |x − r| ≤ 1e-9 + 1e-7 × |r| 78 1.2e-15 2.4e-15 pass
Log likelihood |x − r| ≤ 1e-9 + 1e-7 × |r| 1 -48.882739 -48.882739 7.1e-15 1.4e-14 pass
Deviance |x − r| ≤ 1e-9 + 1e-7 × |r| 1 97.76547801 97.76547801 1.4e-14 2.8e-14 pass
Null deviance |x − r| ≤ 1e-9 + 1e-7 × |r| 1 102.9450296 102.9450296 4.3e-14 2.8e-14 pass
AIC |x − r| ≤ 1e-9 + 1e-7 × |r| 1 103.765478 103.765478 1.4e-14 2.8e-14 pass
Residual degrees of freedom |x − r| ≤ 1e-9 + 1e-7 × |r| 1 75 75 0 0 pass

Limitations

Exclusions

  • Separated and quasi-separated designs are rejected; their tests are in the test-suite record, not compared with R.

Known differences

  • R intervals come from confint.default() (Wald), not profile-likelihood confint().
  • phit reports the covariance at the converged coefficients; R glm() evaluates it at the last IRLS iterate. With the tight fitting tolerances used here the difference is negligible. See the R compatibility page for details.
  • Without an intercept, the null deviance uses probability 0.5.

Reproduction

From the repository root
cargo build -p phit --release --locked
.context/notebooks-venv/bin/python docs/verifications/compare_logistic.py
Raw record
site/verifications/logistic.json
Full results
docs/verifications/logistic-results.json
Input data
docs/data/learning.csv