NextStatNextStat

Регрессия и GLM

NextStat включает полный стек GLM: линейную, логистическую, Пуассона и отрицательную биномиальную регрессию, с MLE-фитом, байесовским семплированием, кросс-валидацией и интерфейсом формул. Все вычисления выполняются в Rust; Python предоставляет API.

Линейная регрессия

import nextstat.glm.linear as lm

fit = lm.fit(X, y)
print(fit.params, fit.se, fit.confint())

# Через интерфейс формул
fit = lm.from_formula("y ~ x1 + x2 + x3", data)

# Гребневая регрессия (ridge, MAP/L2 prior)
fit = lm.fit(X, y, prior_scale=1.0)

Логистическая регрессия

import nextstat.glm.logistic as logit

fit = logit.fit(X, y)

# Предупреждение об отделимости (separation) включается автоматически
# Интерфейс from_formula
fit = logit.from_formula("outcome ~ age + treatment", data)

Пуассон и отрицательная биномиальная

import nextstat.glm.poisson as pois
import nextstat.glm.negbin as nb

fit = pois.fit(X, y, exposure=offset)
fit = nb.fit(X, y)

# Интерфейс формул
fit = pois.from_formula("counts ~ x1 + x2", data, exposure="log_pop")

Кросс-валидация

from nextstat.glm.cv import cross_val_score, kfold_indices
from nextstat.glm.metrics import rmse, log_loss, poisson_deviance

scores = cross_val_score(lm.fit, X, y, k=5, metric=rmse)

Иерархические модели

import nextstat.hier as hier

# Случайный интерсепт
fit = hier.linear_random_intercept(X, y, groups)

# Случайный интерсепт + наклон
fit = hier.linear_random_slope(X, y, groups)

# Коррелированные случайные эффекты (LKJ + Cholesky)
fit = hier.logistic_correlated_intercept_slope(X, y, groups)

# Интерфейс формул
fit = hier.linear_random_intercept_from_formula(
    "y ~ x1 + x2", data, group_col="school"
)

Сводки и робастные SE

from nextstat.summary import fit_summary, summary_to_str
from nextstat.robust import hc0, hc1, hc2, hc3, cluster_1way

summary = fit_summary(fit)
print(summary_to_str(summary))

# Робастная ковариация
robust_cov = hc3(fit)
cluster_cov = cluster_1way(fit, groups)

Адаптеры scikit-learn

from nextstat.sklearn import (
    NextStatLinearRegression,
    NextStatLogisticRegression,
    NextStatPoissonRegressor,
)

model = NextStatLinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

Gamma GLM

Гамма-распределение с log-связкой для строго положительных непрерывных откликов (страховые выплаты, стоимость госпитализации).

import nextstat

fit = nextstat.gamma_glm(y, X)
print(fit['params'])       # коэффициенты
print(fit['alpha'])        # общий параметр формы
print(fit['se'])           # стандартные ошибки
print(fit['nll'])          # отрицательный log-likelihood

Tweedie GLM

Составная Пуассон-Гамма со степенью p ∈ (1, 2) и log-связкой. Обрабатывает точные нули — идеально для агрегатных страховых требований, данных об осадках.

fit = nextstat.tweedie_glm(y, X, p=1.5)
print(fit['params'])       # коэффициенты
print(fit['phi'])          # дисперсия
print(fit['p'])            # параметр степени

GEV и GPD (экстремальные значения)

Обобщённое распределение экстремальных значений (GEV) для блочных максимумов и обобщённое Парето (GPD) для пиков над порогом.

# GEV — блочные максимумы (наводнения, ветер, температура)
gev = nextstat.gev_fit(block_maxima)
print(f"mu={gev['mu']:.2f}, sigma={gev['sigma']:.2f}, xi={gev['xi']:.3f}")
print(f"100-летний уровень возврата: {gev['return_level_100']:.1f}")

# GPD — пики над порогом (VaR, ES)
gpd = nextstat.gpd_fit(exceedances)
print(f"sigma={gpd['sigma']:.2f}, xi={gpd['xi']:.3f}")
print(f"99-й перцентиль превышения: {gpd['quantile_99']:.1f}")

Мета-анализ

Фиксированные эффекты (inverse-variance) и случайные эффекты (DerSimonian-Laird) с диагностикой гетерогенности.

# Мета-анализ с фиксированными эффектами
fe = nextstat.meta_fixed(effects, se_values)
print(f"Pooled = {fe['pooled']:.3f} [{fe['ci_lower']:.3f}, {fe['ci_upper']:.3f}]")

# Мета-анализ со случайными эффектами
re = nextstat.meta_random(effects, se_values)
print(f"Pooled = {re['pooled']:.3f}, tau2 = {re['tau_squared']:.4f}")
print(f"I2 = {re['i_squared']:.1f}%, Q = {re['q']:.2f}, p = {re['q_p_value']:.4f}")

# Веса по исследованиям для forest plot
for w, lo, hi in zip(re['weights'], re['study_ci_lower'], re['study_ci_upper']):
    print(f"  вес={w:.1f}%  [{lo:.3f}, {hi:.3f}]")