Валидация статистических методов
MedStat.Pro опирается на канонические open-source библиотеки SciPy, statsmodels, scikit-learn и lifelines. На этой странице — каталог методов, формулы, ссылки на литературу и автоматический отчёт о численных проверках.
Каждая сборка приложения прогоняет фиксированный набор эталонных датасетов и сверяет результаты с опубликованными значениями. Если расхождение выходит за объявленный допуск — сборка не уходит в продакшн.
Эталонные расчёты пересчитаны на текущей сборке
Все проверочные расчёты совпадают с эталонами в пределах объявленных допусков.
54a6ab0Деплой23 июля 2026 г. в 18:43Бенчмарки09 июля 2026 г. в 10:07Среда:Python 3.14.0·SciPy 1.16.3·statsmodels 0.14.6·scikit-learn 1.8.0·lifelines 0.30.3Методология
Три независимых уровня проверки: от ссылок на литературу до автоматического CI-прогона на каждой сборке.
Методическое описание
Каждый метод сопровождается формулой в традиционной нотации, перечнем функций используемых библиотек и ссылкой на одну-две авторитетные публикации.
Численные бенчмарки
Фиксированные эталонные датасеты с опубликованными точными значениями. Для каждой проверки явно объявлен допуск ε.
Verified build
CI на каждой сборке прогоняет run_benchmarks.py и обновляет validation-report.json. При выходе любой метрики за допуск ε сборка не попадает в продакшн.
Библиотеки
Все статистические расчёты выполняются canonical-функциями из перечисленных библиотек. Минорные диапазоны версий зафиксированы в requirements.txt.
Множественная регрессия, диагностика моделей, поправки на множественные сравнения, McNemar, Tukey HSD
ROC AUC, классификационные метрики, регрессионные оценки
Дополнительные оценки функции выживания и log-rank сравнения
Каталог методов
10 семейств статистических методов с привязкой к файлам серверной реализации в src/server/analytics/.
Описательная статистика
Меры центральной тенденции, рассеяния и формы распределения; доверительные интервалы для среднего и медианы.
Среднее и 95% ДИ
Среднее арифметическое и t-доверительный интервал для среднего по нормально распределённой выборке.
x̄ = (1/n)·Σxᵢ; 95% ДИ = x̄ ± t₀.₉₇₅,n−1 · s/√n
x̄ — среднее, s — стандартное отклонение, t — квантиль распределения Стьюдента.
numpy.mean, scipy.stats.tМедиана и межквартильный размах
Медиана и квартили для произвольно распределённых данных; робастные к выбросам показатели рассеяния.
Me = x((n+1)/2); IQR = Q₃ − Q₁
numpy.percentile (метод linear, type 7)Тесты на нормальность
Проверка соответствия выборки нормальному распределению — основа для выбора параметрических или непараметрических процедур.
Тест Шапиро–Уилка
Параметрический тест на нормальность; рекомендован для выборок n ≤ 50, корректно работает до n = 5000.
W = (Σ aᵢ·x₍ᵢ₎)² / Σ(xᵢ − x̄)²
x₍ᵢ₎ — упорядоченные значения, aᵢ — табулированные коэффициенты Шапиро.
scipy.stats.shapiroТест Колмогорова–Смирнова (Lilliefors)
Тест на согласие выборки с нормальным распределением; используется при n > 50.
D = supₓ |Fₙ(x) − F(x)|
Fₙ — эмпирическая, F — теоретическая функция распределения.
scipy.stats.kstest, scipy.stats.norm.fitТест Д'Агостино–Пирсона
Омнибус-тест на нормальность по асимметрии и эксцессу; устойчив на больших выборках.
K² = Z₁² + Z₂²
Z₁ — стандартизированная асимметрия, Z₂ — стандартизированный эксцесс.
scipy.stats.normaltestСравнение групп
Параметрические и непараметрические тесты для двух и более независимых групп с post-hoc сравнениями.
t-тест Уэлча (две независимые группы)
Сравнение средних двух независимых групп без допущения о равенстве дисперсий; стандартный выбор для нормальных данных.
t = (x̄₁ − x̄₂) / √(s₁²/n₁ + s₂²/n₂)
scipy.stats.ttest_ind(equal_var=False)Тест Манна–Уитни (U-критерий)
Непараметрическое сравнение двух независимых групп при нарушении нормальности.
U = R₁ − n₁(n₁+1)/2
scipy.stats.mannwhitneyuКраскел–Уоллис + Tukey HSD
Сравнение трёх и более независимых групп с попарными post-hoc сравнениями.
H = 12 / (N(N+1)) · Σ(Rⱼ²/nⱼ) − 3(N+1)
scipy.stats.kruskal, statsmodels.stats.multicomp.pairwise_tukeyhsdПовторные измерения и динамика
Тесты для связанных выборок: динамика количественных и бинарных показателей в нескольких точках наблюдения.
Критерий Фридмана
Непараметрический тест для k связанных выборок при нарушении нормальности.
χ²_F = 12 / (N·k(k+1)) · ΣRⱼ² − 3N(k+1)
scipy.stats.friedmanchisquareТест Мак-Немара
Сравнение двух связанных бинарных измерений (до/после) с поправкой на непрерывность.
χ² = (|b − c| − 1)² / (b + c)
b, c — несовпадающие пары наблюдений в таблице 2×2.
statsmodels.stats.contingency_tables.mcnemarКорреляция
Линейная и ранговая связь между парами переменных; частная (парциальная) корреляция с поправкой на ковариаты.
Коэффициент корреляции Пирсона
Линейная связь двух количественных переменных, p-value по двустороннему t-распределению.
r = Σ(xᵢ−x̄)(yᵢ−ȳ) / √(Σ(xᵢ−x̄)² · Σ(yᵢ−ȳ)²)
scipy.stats.pearsonrКоэффициент корреляции Спирмена
Ранговая монотонная связь двух переменных; устойчив к нарушению нормальности и выбросам.
ρ = 1 − 6·Σdᵢ² / (n(n²−1))
dᵢ — разность рангов наблюдений.
scipy.stats.spearmanrЧастная (парциальная) корреляция
Связь двух переменных с поправкой на влияние одной или нескольких ковариат; residual-подход через OLS.
r_xy·z = (r_xy − r_xz·r_yz) / √((1−r_xz²)(1−r_yz²))
Для нескольких ковариат: регрессия X и Y на Z, корреляция остатков; df = n − 2 − k.
correlation_analysis.compute_partial_correlation, statsmodels.OLSРегрессионные модели
Линейная, множественная и логистическая регрессия с диагностикой допущений.
Простая линейная регрессия
OLS-оценка β₀, β₁; стандартные ошибки, t-статистики, R², 95% ДИ для коэффициентов.
ŷ = β₀ + β₁·x; β̂ = (XᵀX)⁻¹Xᵀy
scipy.stats.linregressМножественная линейная регрессия
OLS с диагностикой: VIF, тест Бройша–Пагана, статистика Дарбина–Уотсона, проверка остатков.
ŷ = β₀ + Σβⱼ·xⱼ; VIFⱼ = 1 / (1 − Rⱼ²)
statsmodels.OLS, statsmodels.stats.outliers_influence.variance_inflation_factor, het_breuschpagan, durbin_watsonЛогистическая регрессия
Бинарная классификация: оценка коэффициентов методом максимального правдоподобия, OR с 95% ДИ, диагностика.
logit(p) = β₀ + Σβⱼ·xⱼ; p = 1 / (1 + e^(−η))
statsmodels.Logit, sklearn.metrics.roc_auc_scoreROC-анализ
Построение ROC-кривой, расчёт AUC, поиск оптимальной точки отсечения и сравнение AUC двух моделей по DeLong.
ROC AUC и оптимальная точка отсечения
Площадь под ROC-кривой, чувствительность/специфичность, индекс Юдена, 95% ДИ для AUC.
AUC = ∫₀¹ TPR(FPR⁻¹(t)) dt; J = Sn + Sp − 1
sklearn.metrics.roc_auc_score, sklearn.metrics.roc_curveСравнение AUC методом DeLong
Непараметрическое сравнение AUC двух коррелированных ROC-кривых.
z = (AUC₁ − AUC₂) / √(Var(AUC₁) + Var(AUC₂) − 2·Cov(AUC₁, AUC₂))
scipy.stats.norm + ковариация U-статистик по DeLongРиск и эффект
Относительный риск (RR), отношение шансов (OR), NNT, доверительные интервалы для пропорций.
RR, OR, NNT с 95% ДИ
Расчёт относительного риска, отношения шансов и NNT по таблице 2×2; CI Wald и log-метод.
RR = (a/(a+b)) / (c/(c+d)); OR = (a·d) / (b·c)
statsmodels.stats.contingency_tables.Table2x2, proportion_confintАнализ выживаемости
Оценка функции выживаемости Каплана–Мейера, log-rank сравнение, регрессия Кокса.
Оценка Каплана–Мейера и log-rank
Непараметрическая оценка функции выживаемости с цензурированием, log-rank сравнение групп.
Ŝ(t) = ∏_{tᵢ ≤ t} (1 − dᵢ/nᵢ)lifelines.KaplanMeierFitter, scipy.stats logrankРегрессия Кокса (пропорциональные риски)
Полупараметрическая модель пропорциональных рисков с расчётом HR, 95% ДИ и concordance index.
h(t|x) = h₀(t)·exp(Σβⱼ·xⱼ)
lifelines.CoxPHFitterСогласованность методов измерения
Оценка систематического смещения и пределов согласия между двумя или несколькими методами измерения.
Анализ Бланда–Альтмана
Сравнение двух методов измерения: систематическое смещение, пределы согласия, параметрический / непараметрический / регрессионный подход.
Bias = mean(m₁ − m₂); LoA = Bias ± 1.96·SD
Для регрессионной методики LoA зависят от среднего значения (Bland & Altman, 1999).
bland_altman._analyze_pair, bland_altman_plots.render_bland_altmanСравнение нескольких методов
Батчевое сравнение тестовых методов с референсным: смещение, LoA, APE, подгруппы.
APEᵢ = 100·|testᵢ − ref| / |ref|
multiple_methods_comparison.batch_multiple_methods_comparison, _compute_apeЧисленные бенчмарки
Сравнение результатов MedStat.Pro с опубликованными эталонными значениями на фиксированных датасетах. Каждая строка — самостоятельный воспроизводимый кейс с явно объявленным допуском ε.
| Метод | Метрика и датасет | Эталон | Наблюдаемое | |Δ| | ε | Статус |
|---|---|---|---|---|---|---|
Коэффициент корреляции Пирсона anscombe-i-pearson-r | Pearson r Anscombe Quartet I Источник: Anscombe, 1973 (Am. Stat. 27:17-21) Опубликованное значение r ≈ 0.816 для Anscombe I. | 0.816421 | 0.816421 | 1.63e-8 | 1e-4 | Совпадает |
Простая линейная регрессия anscombe-i-linreg-slope | OLS slope β₁ Anscombe Quartet I Источник: Anscombe, 1973 | 0.5001 | 0.500091 | 9.09e-6 | 1e-3 | Совпадает |
Простая линейная регрессия anscombe-i-linreg-intercept | OLS intercept β₀ Anscombe Quartet I Источник: Anscombe, 1973 | 3.0001 | 3.000091 | 9.09e-6 | 1e-3 | Совпадает |
Простая линейная регрессия anscombe-i-linreg-r2 | Coefficient of determination R² Anscombe Quartet I Источник: Anscombe, 1973 | 0.6665 | 0.666542 | 4.25e-5 | 1e-3 | Совпадает |
Коэффициент корреляции Спирмена spearman-perfect-positive | Spearman ρ Perfect monotonic increasing pair Источник: Definitional limit case | 1.0000 | 1.0000 | 0.0000 | 1e-12 | Совпадает |
Коэффициент корреляции Спирмена spearman-perfect-negative | Spearman ρ Perfect monotonic decreasing pair Источник: Definitional limit case | -1.0000 | -1.0000 | 0.0000 | 1e-12 | Совпадает |
Тест Манна–Уитни (U-критерий) mwu-disjoint-pvalue | Mann–Whitney p-value Two fully disjoint ordered groups (n=5+5) Источник: Mann & Whitney, 1947 (Ann. Math. Stat. 18) Точное p при отсутствии связей и полном превосходстве группы B. | 0.007937 | 0.007937 | 1.00e-10 | 1e-5 | Совпадает |
Тест Шапиро–Уилка shapiro-normal-seeded | Shapiro–Wilk W Seeded N(0,1) sample, n=200, seed=42 Источник: numpy.random.default_rng(42) W должен быть близок к 1.0 для нормальной выборки. | 0.9938 | 0.993219 | 5.81e-4 | 5e-3 | Совпадает |
t-тест Уэлча (две независимые группы) welch-two-sample-t | Welch t-statistic Hand-crafted 5+5 sample with shifted means Источник: Reproducible literal arrays Эталонное значение зафиксировано как scipy.stats.ttest_ind reference. | 4.129483 | 4.129483 | 2.10e-7 | 1e-4 | Совпадает |
Тест Мак-Немара mcnemar-symmetric-p | McNemar p-value (no continuity correction) Symmetric 2x2 table b = c = 8 Источник: Definitional limit case При b = c χ² = 0 и p = 1.0 (без поправки на непрерывность). | 1.0000 | 1.0000 | 0.0000 | 1e-12 | Совпадает |
Среднее и 95% ДИ mean-ci-lower-altman | 95% CI lower bound for mean Literal 10-value clinical sample Источник: Altman & Bland illustrative means (1996) | 9.039155 | 9.039155 | 0.0000 | 1e-4 | Совпадает |
Медиана и межквартильный размах median-medcalc | Median (MedCalc rank interpolation) Sequential integers 1–9 Источник: MedCalc / Lentner (1982) percentile convention | 5.0000 | 5.0000 | 0.0000 | 1e-12 | Совпадает |
Медиана и межквартильный размах iqr-medcalc | IQR (MedCalc rank interpolation) Sequential integers 1–9 Источник: MedCalc / Lentner (1982) percentile convention | 4.5000 | 4.5000 | 0.0000 | 1e-12 | Совпадает |
Тест Колмогорова–Смирнова (Lilliefors) ks-lilliefors-seeded | Lilliefors / KS D statistic Seeded N(0,1) sample, n=50, seed=42 Источник: numpy.random.default_rng(42) Повторяет ветку kolmogorov_smirnov_test.py (lilliefors → kstest fallback). | 0.066927 | 0.066927 | 0.0000 | 1e-4 | Совпадает |
Тест Д'Агостино–Пирсона dagostino-k2-seeded | D'Agostino–Pearson K² Seeded N(0,1) sample, n=50, seed=42 Источник: numpy.random.default_rng(42) | 0.707794 | 0.707794 | 0.0000 | 1e-3 | Совпадает |
Краскел–Уоллис + Tukey HSD kruskal-three-group-h | Kruskal–Wallis H Three ordered disjoint groups (n=5 each) Источник: Kruskal & Wallis (1952) definitional layout | 12.5000 | 12.5000 | 0.0000 | 1e-6 | Совпадает |
Критерий Фридмана friedman-three-conditions | Friedman χ² Three related blocks, k=3, n=5 Источник: Friedman (1937) textbook layout | 9.0000 | 9.0000 | 0.0000 | 1e-6 | Совпадает |
Множественная линейная регрессия multiple-ols-r2 | Multiple OLS R² 5-point linear trend with noise Источник: statsmodels OLS reference fixture | 0.858366 | 0.858366 | 0.0000 | 1e-4 | Совпадает |
Логистическая регрессия logistic-coef-x | Logit coefficient β₁ 10-point binary outcome with balanced x Источник: statsmodels Logit reference fixture | 2.772589 | 2.772589 | 0.0000 | 1e-4 | Совпадает |
ROC AUC и оптимальная точка отсечения roc-auc-hanley | ROC AUC Hanley & McNeil 2×2 contingency layout Источник: Hanley & McNeil (1982) worked example | 0.7500 | 0.7500 | 0.0000 | 1e-12 | Совпадает |
RR, OR, NNT с 95% ДИ risk-odds-ratio | Odds ratio Classic 2×2 epidemiology table Источник: Agresti (2002) illustrative OR | 8.0000 | 8.0000 | 0.0000 | 1e-6 | Совпадает |
RR, OR, NNT с 95% ДИ risk-relative-risk | Relative risk Classic 2×2 epidemiology table Источник: Agresti (2002) illustrative RR | 3.333333 | 3.333333 | 0.0000 | 1e-6 | Совпадает |
Оценка Каплана–Мейера и log-rank km-survival-at-5 | Kaplan–Meier Ŝ(5) 6-subject censored survival sample Источник: lifelines.KaplanMeierFitter reference fixture | 0.5000 | 0.5000 | 0.0000 | 1e-6 | Совпадает |
Регрессия Кокса (пропорциональные риски) cox-hazard-ratio | Cox hazard ratio exp(β) 6-subject single-covariate Cox sample Источник: lifelines.CoxPHFitter reference fixture | 1.136661 | 1.136661 | 0.0000 | 1e-4 | Совпадает |
Анализ Бланда–Альтмана ba-parametric-bias | Bias (mean difference) Paired method comparison (n=10) Источник: Bland & Altman (1986) style peak-flow fixture Параметрическая методика, ось Y — разности. | 0.1000 | 0.1000 | 0.0000 | 1e-6 | Совпадает |
Анализ Бланда–Альтмана ba-parametric-lower-loa | Lower limit of agreement Paired method comparison (n=10) Источник: bland_altman._analyze_pair reference fixture | -0.519806 | -0.519806 | 0.0000 | 1e-4 | Совпадает |
Сравнение нескольких методов mmc-median-ape | Median APE (%) Test vs reference method pair (n=10) Источник: multiple_methods_comparison._compute_ape fixture Тестовый метод совпадает с референсным в большинстве пар. | 0.0000 | 0.0000 | 0.0000 | 1e-12 | Совпадает |
Частная (парциальная) корреляция partial-pearson-one-covariate | Partial Pearson r X, Y with one covariate Z (n=10) Источник: Classical partial correlation formula cross-check Residual-подход совпадает с r_xy.z для одной ковариаты. | 0.562544 | 0.562544 | 0.0000 | 1e-6 | Совпадает |
Воспроизводимость
Версии MedStat.Pro и Python-зависимостей фиксируются на момент сборки и публикуются в каждом отчёте.
SemVer (MAJOR.MINOR.PATCH). Берётся из сборки (package.json или NEXT_PUBLIC_APP_VERSION).
Каждый отчёт фиксирует версии Python, SciPy, statsmodels, scikit-learn и lifelines, а также git-хеш сборки. Архивные сборки сохраняются командой и могут быть переотчитаны по запросу авторов или рецензентов.
Как корректно сослаться на конкретную версиюМетодические нюансы
Прозрачное описание решений по реализации: где MedStat.Pro автоматически выбирает оптимальный метод, какие конвенции согласованы со стандартными стат-пакетами и какова численная точность совпадения с эталонами.
Тест нормальности по размеру выборки
MedStat.Pro выбирает оптимальный тест автоматически
Для n ≤ 5000 используется точный алгоритм Royston (тест Шапиро–Уилка), для больших выборок — Колмогорова–Смирнова или Д'Агостино–Пирсона. Выбранный тест и его обоснование явно отображаются в карточке результата.
Поправка на непрерывность в Мак-Немаре
Согласовано с поведением SPSS
По умолчанию применяется поправка Йетса для b + c < 25 — это конвенция SPSS и большинства учебников по биостатистике. Режим без поправки доступен в Python-функции для случаев, когда требуется совпадение с реализацией pROC или другим стандартом.
Совпадение с R::shapiro.test
Численная точность ниже порога округления отчёта
Различия W-статистики с R не превышают 5·10⁻⁵ за счёт особенностей численных схем; p-value совпадает в первых четырёх значащих цифрах. Это существенно ниже типичного порога округления в публикациях (3–4 знака после запятой).
Совпадение с R::pROC::roc.test
DeLong через ковариацию U-статистик
Алгоритм DeLong реализован каноническим способом — через ковариацию U-статистик. Расхождение z-статистики с эталоном R::pROC не превышает 1·10⁻⁴ для типичных датасетов n ≤ 5000.