How We Validate | Inference Stats

Every statistical method in Inference Stats is checked to numerical precision against an independent reference implementation — SciPy, statsmodels, scikit-learn, lifelines, pingouin, or R — with reproducible generator scripts and 2,900+ automated tests on every change.

How it works

Every method below is run against an independent implementation on the same input, and the results must agree to numerical precision. The reference values are produced by generator scripts kept in the repository, so any claim on this page can be reproduced rather than taken on trust. 38 methods are covered across 8 areas, and the full suite of 2,900+ tests runs on every change — a result cannot ship if it disagrees with its reference.

Group comparisons, post-hoc & effect sizes

MethodChecked againstGenerator script
Welch's / paired / one-sample t-testSciPy — scipy.stats.ttest_ind / ttest_rel / ttest_1sampcomparison_ref.py
One-way ANOVASciPy — scipy.stats.f_onewaycomparison_ref.py
Welch's ANOVApingouin — welch_anovacomparison_ref.py
Kruskal–Wallis · Mann–Whitney USciPy — scipy.stats.kruskal / mannwhitneyu (exact)comparison_ref.py
McNemar · binomial teststatsmodels · SciPy — mcnemar / binomtestcomparison_ref.py
Tukey HSD · Games–Howell · DunnSciPy tukey_hsd · pingouin · scikit-posthocsposthoc_ref.py
p-value adjustment (Holm, BH, …)statsmodels — multipletestsposthoc_ref.py
TOST equivalence (independent / paired)statsmodels — ttost_ind / ttost_pairedtost_ref.py
Effect sizes (Cohen's d, Hedges g, η², rank-biserial, ε²)Derived from the SciPy / pingouin statisticeffectsize_ref.py

ANOVA family

MethodChecked againstGenerator script
Two-way / factorial ANOVA + ANCOVAstatsmodels — ols + anova_lmanova2_ref.py
MANOVA (Wilks, Pillai, Hotelling–Lawley, Roy)statsmodels — MANOVA.mv_test()manova_ref.py
Repeated-measures ANOVA · Mauchly + GG/HFpingouin (sphericity / RM-ANOVA)rm_sphericity_ref.py

Regression

MethodChecked againstGenerator script
OLS linear regression + VIFstatsmodels — OLS + variance_inflation_factorregression_ref.py
Logistic regressionstatsmodels — Logitregression_ref.py
Poisson · negative binomial · ordinalstatsmodels — GLM(Poisson) / NegativeBinomial / OrderedModelregression_ext_ref.py
Diagnostics (Breusch–Pagan, Durbin–Watson)statsmodels — het_breuschpagan / durbin_watsonregression_diagnostics_ref.py
Ridge · Lassoscikit-learn — Ridge / Lassoregularized_ref.py
Linear mixed model (random intercept, REML)statsmodels — MixedLMmixed_ref.py
Multinomial logistic regressionR — VGAM::vglm(multinomial)multinom_ref.R
Weighted logistic regressionR — glm(binomial, weights=)weighted_logreg_ref.R
Firth penalized logistic (profile-likelihood CIs)R — logistf (Heinze & Schemper)firth_ref.R

Survival analysis

MethodChecked againstGenerator script
Kaplan–Meier · RMSTlifelines — KaplanMeierFitter / restricted_mean_survival_timesurvival_ref.py
Log-rank (2 & 3 groups, unstratified)lifelines — logrank_test / multivariate_logrank_testsurvival_ref.py
Cox proportional hazards (Efron) + stratifiedlifelines — CoxPHFitter (strata=)survival_ref.py
Competing risks (cumulative incidence)lifelines — AalenJohansenFittersurvival_ref.py
Stratified log-rankstatsmodels survdiff (≡ R survival::survdiff)survival_ref.py
Proportional-hazards test (Schoenfeld)lifelines — proportional_hazard_testph_test_ref.py

Diagnostics (ROC / AUC)

MethodChecked againstGenerator script
ROC curve + AUCscikit-learn — roc_auc_score / roc_curvediagnostics_ref.py
DeLong paired AUC comparisonR — pROC::roc.test(method="delong")diagnostics_ref.R

Clustering & machine learning

MethodChecked againstGenerator script
K-means · DBSCAN · Gaussian mixture · PCAscikit-learn — KMeans / DBSCAN / GaussianMixture / PCAclustering_ref.py
Silhouette scorescikit-learn — silhouette_scoresilhouette_ref.py
Local Outlier Factor · Mahalanobis distancescikit-learn LOF · NumPy + SciPy chi2anomaly_ref.py
ML models & cross-validationscikit-learn — linear_model / naive_bayes / KFold / StandardScalerml_ref.py

Multiple imputation (MICE)

MethodChecked againstGenerator script
Rubin's rules pooling (Barnard–Rubin df)R — mice::pool.scalar (exact)rubin_ref.R
Data-augmentation prior (Firth-style)R — mice:::augment (exact)mice_augment_ref.R
PMM / logistic / Poisson / NB / polyreg imputationR — mice + pool (distributional provenance check)mice_*_ref.R

EDA & power

MethodChecked againstGenerator script
Normality (Shapiro–Wilk) & EDA statisticsSciPy — scipy.stats (Royston AS R94)eda_ref.py
Power / MDE / required-n (t, ANOVA, χ², r)statsmodels.stats.power + SciPy non-central CDFspower_ref.py

What this does not claim

Agreeing with SciPy or R means the arithmetic is right, not that the method is right for your data. Choosing an inappropriate test and computing it perfectly still gives a wrong answer, which is why the guidance in the app matters as much as the validation does.

Home · Guides · Open the app