Статистика нового
поколения.
Статистический вывод на скоростях Rust. От A/B тестов до физики частиц — один движок для частотных и байесовских методов. SIMD, CUDA, Metal — от данных к результатам.
Без C++.
Простая установка.
Чтение ROOT TTree, HS3, Arrow IPC и Parquet — без внешних зависимостей. mmap и параллельная декомпрессия. Без conda и конфликтов динамических библиотек.
Одна команда.
Полный пайплайн.
ROOT ntuples → гистограммы → HistFactory workspace → фит → пределы CLs. Привычный пайплайн TRExFitter, но на Rust и без промежуточных файлов.
nextstat fit --input workspace.jsonСовместим с pyhf.
Подтверждено тестами.
pyhf задал стандарт HistFactory на Python. NextStat читает те же JSON workspace и валидируется против pyhf в детерминистическом режиме (Δ < 1e-8). Barlow–Beeston lite для статистических ошибок по бинам. Ничего не нужно менять в ваших JSON workspace.
50+ статистических методов.
Один движок.
Воспроизводимость
встроена.
--threads 1 и --seed дают побитовую воспроизводимость. Каждый toy-эксперимент, каждый фит, каждый скан — воспроизводим.
Создан для физики.
Готов ко всему.
NextStat родился в физике высоких энергий. Тот же движок работает для анализа выживаемости, эконометрики и временных рядов.
Физика высоких энергий
- HistFactory workspace (pyhf JSON)
- Профильное правдоподобие и пределы CLs
- Ntuple → workspace пайплайн
- Совместимость с конфигами TRExFitter
ML и обучение с подкреплением
- PyTorch: zero-copy CUDA-градиенты через NLL
- Gymnasium RL-среда для оптимизации сигнала
- Профилированный CLs как функция потерь
- Дополняет neos / MODE
Прикладная статистика
- GLM / регрессия / иерархический Байес
- Выживаемость (КМ, лог-ранг, Cox PH, параметрические)
- Временные ряды (Kalman / EM)
- Эконометрика (DiD, IV/2SLS, AIPW)
Вычислительные бекенды
- CUDA-ядра для GPU NVIDIA (f64)
- Metal-шейдеры для Apple Silicon (f32)
- SIMD + Apple Accelerate (vDSP/vForce)
- WASM-песочница в браузере
Один движок. Пять вертикалей.
Каплан-Мейер, лог-ранг, Cox PH, GLM и бутстрап работают на одном ядре Rust. Один pip install nextstat открывает анализ выживаемости для фармы, страхования, эпидемиологии, надёжности и подписочной аналитики.
Фарма и биотех
Конечные точки клинических испытаний, кривые КМ, сравнение групп лечения, отношения рисков Cox PH.
Страхование и актуарные расчёты
Резервирование убытков, Gamma/Tweedie GLM для тарификации, экстремальные значения (GEV/GPD) для перестрахования.
Эпидемиология
Популяционная выживаемость, когортные исследования, мета-анализ с диагностикой гетерогенности.
Надёжность
Анализ отказов компонентов, оценка Вейбулла, time-to-event с правым цензурированием.
Подписки и отток
Когортное удержание, модели риска оттока, каузальная оценка эффекта вмешательства (AIPW).
import nextstat
# Оценка Каплана-Мейера
km = nextstat.kaplan_meier(times, events, conf_level=0.95)
print(f"Медиана выживаемости: {km['median']:.1f}")
# Лог-ранг тест: сравнение двух групп лечения
lr = nextstat.log_rank_test(times, events, groups)
print(f"p = {lr['p_value']:.4f} (chi² = {lr['chi_squared']:.2f})")
# Cox PH: отношения рисков
fit = nextstat.survival.cox_ph.fit(times, events, x, robust=True)
print(fit.hazard_ratio_confint())Ваш анализ — это RL-среда.
RL-агент оптимизирует гистограммы сигнала, максимизируя значимость открытия. NextStat оборачивает HistFactory likelihood в стандартную Gymnasium среду — SB3, CleanRL, RLlib работают без дополнительной настройки.
from nextstat.gym import make_histfactory_env
env = make_histfactory_env(
workspace_json,
channel="SR",
sample="signal",
reward_metric="z0", # discovery significance
action_mode="logmul",
max_steps=64,
)
obs, info = env.reset(seed=42)
for _ in range(64):
action = agent.predict(obs)
obs, reward, done, _, info = env.step(action)
if done:
breakGymnasium-совместимая HistFactory-среда
Стандартный Gymnasium API — работает со Stable Baselines3, CleanRL, RLlib или любым Gym-совместимым агентом без дополнительной настройки.
Реальная физика как награда
NLL, значимость открытия (q₀/Z₀), мощность исключения (qμ/Zμ) — не суррогатные метрики, а реальная физика.
Безградиентные + градиентные методы
PPO/SAC через Gymnasium для поиска «чёрным ящиком», nextstat.torch для сквозных градиентов. Дополняет neos и MODE.
Одна строка для смены награды
reward_metric="nll" для быстрых циклов, "z0" для профилированного открытия, "zmu" для исключения — одна среда.
Физика как функция потерь.
Вместо схемы «кросс-энтропия, а затем статистический тест» — градиенты через сам тест. Нейросеть напрямую оптимизирует значимость открытия, а систематики профилируются автоматически.
from nextstat.torch import SignificanceLoss, SoftHistogram
model = nextstat.from_pyhf(workspace_json)
loss_fn = SignificanceLoss(model, "signal")
soft_hist = SoftHistogram(bin_edges=torch.linspace(0, 1, 11))
for batch_x, batch_w in dataloader:
scores = classifier(batch_x) # NN → scores
histogram = soft_hist(scores, batch_w) # → soft bins
loss = loss_fn(histogram.double().cuda()) # → -Z₀
loss.backward() # gradients → NN
optimizer.step()Дифференцирование через тестовую статистику
Функция потерь — профилированная значимость Z₀, не суррогат. Систематики профилируются в ходе прямого прохода.
SoftHistogram: от нейросети к бинному анализу
Дифференцируемое биннирование (KDE / сигмоидное). Выход сети превращается в гистограмму с полным градиентным потоком.
DLPack / Array API: совместимость
as_tensor() соединяет массивы JAX, CuPy, Arrow и NumPy с PyTorch — без копирования (zero-copy) на GPU через DLPack.
MLOps встроен
metrics_dict() для W&B / MLflow. rank_impact() для ранжирования систематик. signal_jacobian() для быстрого отсева.
Каждое событие на счету.
Безбинный анализ сохраняет полную информацию о каждом событии — никакой потери в биннировании. 13 параметрических PDF, extended unbinned likelihood, декларативная YAML-спецификация и тот же оптимизатор что и для HistFactory.
YAML-спецификация
# unbinned_spec.yaml — параметрический безбинный анализ
observables:
- name: mass
range: [5.0, 6.0]
unit: GeV
processes:
- name: signal
pdf:
type: crystal_ball
params: { mu: mu_sig, sigma: 0.02, alpha: 1.5, n: 2.0 }
yield: { expr: "mu * 500.0" }
- name: background
pdf:
type: chebyshev
params: { c1: c1_bkg, c2: c2_bkg }
yield: { expr: "5000.0" }Python
from nextstat import UnbinnedModel
model = UnbinnedModel.from_config("unbinned_spec.yaml")
result = model.fit(data="events.parquet")
# Профильный скан по μ
scan = model.profile_scan("mu", bounds=(0.0, 3.0), n_points=40)
# CLs верхний предел
limit = model.upper_limit("mu", cl=0.95)CLI
# Фит
nextstat unbinned-fit spec.yaml --data events.parquet
# Профильный скан
nextstat unbinned-scan spec.yaml --poi mu --range 0:3 --points 40
# Toy studies на GPU
nextstat unbinned-fit-toys spec.yaml --ntoys 2000 --gpu cuda13 параметрических PDF из коробки
Gaussian, Crystal Ball, Double Crystal Ball, Exponential, Chebyshev, Bernstein, Voigtian, ARGUS, Spline, KDE (1D–3D), Product PDF. Аналитическая нормировка где возможно, квадратура Гаусса–Лежандра для остальных.
EventStore: SoA колоночный layout
Наблюдаемые хранятся в Structure-of-Arrays формате для cache-friendly SIMD. Автоматическая загрузка из Parquet, ROOT TTree или NumPy.
Декларативная YAML-спецификация
unbinned_spec_v0 — тот же подход что и HistFactory JSON. Процессы, PDF, yields, rate modifiers (NormSys, WeightSys), per-event систематики — всё в одном файле.
Единый LogDensityModel trait
Тот же оптимизатор (L-BFGS), тот же профильный скан, тот же CLs — бинированный и безбинный стеки полностью совместимы.
GPU-ускорение (CUDA + Metal)
NLL reduction на GPU для тысяч событий. Батч-фит тоев полностью на устройстве. Unbinned --gpu читает Parquet напрямую.
Шаблоны уходят. Потоки приходят.
Normalizing flows и DCR-суррогаты заменяют бинированные шаблоны в unbinned-анализе. Обучите модель в любом фреймворке, экспортируйте ONNX — NextStat использует её как полноценную PDF с градиентами, нормировкой и сэмплированием.
# unbinned_spec.yaml — нейронная PDF вместо шаблона
processes:
- name: signal
pdf:
type: conditional_flow # нейронный flow
manifest: models/flow_manifest.json
context_params: [alpha_jes] # NP как контекст
yield: { expr: "mu * 1200.0" }
- name: background
pdf:
type: dcr_surrogate # нейронный суррогат
manifest: models/dcr_manifest.json
yield: { expr: "3400.0" }from nextstat import UnbinnedModel
model = UnbinnedModel.from_config("unbinned_spec.yaml")
result = model.fit()
# Профильный скан по μ
scan = model.profile_scan("mu", bounds=(0.0, 3.0), n_points=40)Любой фреймворк → ONNX → NextStat
Обучайте flow в PyTorch (zuko), JAX (distrax) или TensorFlow — экспортируйте в ONNX, NextStat подхватит автоматически.
DCR Surrogate: безбинный морфинг
Нейронный Direct Classifier Ratio заменяет шаблонный морфинг. Гладкие, непрерывные систематики — никаких бинов и интерполяций.
FAIR-HUC: валидированное обучение
Протокол дистилляции из HistFactory-шаблонов с проверкой нормировки (PIT/KS) и closure tests. Суррогат верифицируем.
Feature-gated: ноль оверхеда
--features neural активирует нейронные PDF. Без флага — бинарник не содержит ONNX Runtime, размер и скорость не меняются.
Дальше NUTS. MAMS.
Metropolis-Adjusted Microcanonical Sampler (Robnik et al., 2025) — микроканонический MCMC метод, показывающий 2–7× улучшение ESS на градиент по сравнению с NUTS на опубликованных бенчмарках. NextStat поставляет готовую к продакшену реализацию с авто-настройкой и поддержкой мульти-цепочек.
import nextstat
# Любая модель с dim/nll/grad_nll
model = nextstat.EightSchoolsModel(y, sigma)
# MAMS: arXiv:2503.01707 — MCMC нового поколения
result = nextstat.sample_mams(
model,
n_chains=4,
n_warmup=1000,
n_samples=2000,
seed=42,
)
# Та же диагностика: R-hat, ESS, дивергенции
print(result.summary())Изокинетическая динамика на единичной сфере
Скорость живёт на S^{d-1} с проективным обновлением градиента. Фиксированная длина траектории — без построения дерева, предсказуемая стоимость перехода.
Автоматическая настройка warmup
3 фазы: бинарный поиск шага ε, диагональный прекондиционер Welford, настройка длины декогеренции L через оптимизацию ESS/градиент.
Overflow-устойчивый критерий MH
Формулировка через log-sum-exp: ζ = exp(−2δ) вместо cosh/sinh. Стабилен там, где NUTS даёт дивергенции.
Замена NUTS в одну строку
Тот же формат Chain, та же диагностика (R-hat, ESS, дивергенции), тот же экспорт в ArviZ. Переключение — одна функция.
Анализ оттока. Каузальные ответы.
Полный пайплайн аналитики подписок для SaaS, телеком и страхования — от загрузки данных до каузальной оценки uplift. Модели выживания, hazard ratios, AIPW-эффекты воздействия и матрицы удержания, скомпилированные в нативную скорость.
import nextstat
# Генерация или загрузка реальных данных клиентов
data = nextstat.churn_generate_data(
n_customers=5000, seed=42
)
# Когортное удержание: стратифицированный KM + log-rank
ret = nextstat.churn_retention(
data.times, data.events, data.groups
)
# Cox PH модель риска → hazard ratios + ДИ
risk = nextstat.churn_risk_model(
data.times, data.events,
data.covariates, data.names
)
# Каузальный uplift: снизило ли вмешательство отток?
uplift = nextstat.churn_uplift(
data.times, data.events,
data.treated, data.covariates,
horizon=12.0,
)
print(f"ATE = {uplift.ate:.4f}, Γ = {uplift.gamma}")Полный пайплайн
От загрузки Parquet/CSV с YAML-маппингом колонок через KM-удержание, Cox PH модель риска до каузального uplift на AIPW — одна библиотека, без клея.
Каузальный uplift с анализом чувствительности Розенбаума
Оценка эффекта воздействия на базе AIPW со встроенным анализом чувствительности. Точно знайте, сколько скрытого конфаундинга нужно для отмены результата.
Когортная матрица удержания
Матрица удержания в стиле life-table по когортам — именно тот артефакт, который нужен growth-командам. Сериализуется в JSON, готова для дашбордов.
Bootstrap ДИ через Rayon
Параллельный bootstrap hazard ratios на всех ядрах CPU. 1000 ресэмплов за секунды, не минуты.
Популяционная ФК. Скорость Rust.
Фармакокинетическое и фармакодинамическое моделирование с НСМЭ-оценкой, совместимым с NONMEM ридером датасетов, пошаговым ковариатным моделированием и VPC-диагностикой. Тот же движок L-BFGS + аналитические градиенты, что используется для HEP-фитов — применённый к клинической фармакологии.
import nextstat
# Однокамерная пероральная ФК-модель
model = nextstat.OneCompartmentOralPkModel(
times=times, observations=conc,
dose=320.0, tau=24.0,
)
# MLE-фит → оценки CL, V, KA
fit = nextstat.fit(model)
print(fit.parameters) # [CL, V, KA]
# Популяционная ФК через НСМЭ (Лаплас)
pop = nextstat.OneCompartmentOralPkNlmeModel(
subjects=subjects,
dose=320.0, tau=24.0,
)
pop_fit = nextstat.fit(pop)
# Визуальная предиктивная проверка
vpc = nextstat.vpc(pop, pop_fit, n_sim=500)Однокамерная пероральная ФК + популяционная НСМЭ
Индивидуальные и популяционные ФК-модели с аппроксимацией Лапласа. Фиксированные и случайные эффекты на CL, V, KA.
Оценка FOCE / FOCEI
Условная оценка первого порядка — золотой стандарт FDA для нелинейных моделей со смешанными эффектами. Продакшн-реализация.
Чтение датасетов NONMEM
Чтение .csv с колонками EVID/MDV/AMT/DV напрямую. Многодозовые режимы, инфузии и коррекции доз. Без конвертации формата.
Пошаговое ковариатное моделирование
Автоматическое прямое добавление + обратное исключение с LRT. Определение ковариат пациента, объясняющих вариабельность ФК.
VPC + диагностика
Визуальные предиктивные проверки, графики оценки качества модели. Стандартный фармацевтический набор для квалификации модели.
Zero-copy. С диска на GPU.
Ридеры Parquet и Arrow IPC с mmap zero-copy, проекцией колонок, pushdown предикатов по row groups и параллельным декодированием. Данные идут с диска на фит — или напрямую на GPU — без промежуточных аллокаций.
import nextstat
# Zero-copy mmap Parquet ридер
model = nextstat.from_parquet(
"events.parquet",
spec="analysis.yaml",
)
# С проекцией колонок + pushdown предикатов
model = nextstat.from_parquet_with_modifiers(
"events.parquet",
spec="analysis.yaml",
columns=["mass", "pt", "eta"],
filter="pt > 25.0 && njet >= 4",
)
# Тот же API для Arrow IPC
model = nextstat.from_arrow_ipc(
"events.arrow",
spec="analysis.yaml",
)
# Фит — данные не покидают mmap до необходимости
result = nextstat.fit(model)mmap zero-copy чтение
Ридер на memmap2 — без аллокаций кучи для файлового I/O. 100K событий с 4 колонками декодируются за 557 мкс.
Проекция колонок
Чтение только нужных анализу колонок. Ускорение 35–50% на широких таблицах за счёт пропуска неиспользуемых колонок.
Pushdown предикатов по row groups
Отсечение row groups по min/max статистикам до декодирования. До 5× ускорения на селективных фильтрах.
Параллельное декодирование row groups
Параллельная декомпрессия через Rayon. Выигрыш на датасетах >1M событий с множеством row groups.
Прямая загрузка на GPU
SoA f64 массивы идут напрямую в CudaSlice<f64> (CUDA) или MTLBuffer (Metal, f32). Без промежуточных копий между диском и GPU.
R-пользователи. Добро пожаловать.
NextStat поставляет R-пакет на основе extendr. HistFactory фиты, GLM, фильтры Калмана, GARCH и стохастическая волатильность — всё вызывает то же Rust-ядро. CRAN-ready упаковка с вендорированными крейтами.
library(nextstat)
# HistFactory фит из pyhf JSON
fit <- nextstat_fit("workspace.json")
print(fit$parameters)
# GLM: логистическая регрессия
glm <- nextstat_glm_logistic(X, y)
print(glm$coefficients)
# Временные ряды: фильтр Калмана + GARCH
kf <- nextstat_kalman(y, F, H, Q, R, x0, P0)
garch <- nextstat_garch(returns)
# Стохастическая волатильность
sv <- nextstat_sv(returns)
print(sv$volatility)11 функций, готов для CRAN
Документация roxygen2, тест-сьют testthat с 48 проверками, скрипт configure, виньетка getting-started и NEWS.md. Готов к подаче в CRAN.
HEP + прикладная статистика в одном пакете
nextstat_fit() / nextstat_hypotest() / nextstat_upper_limit() для HistFactory наряду с nextstat_glm_logistic() / nextstat_kalman() / nextstat_garch() для общей статистики.
Вендорированные Rust-крейты
Автономный tarball — интернет не нужен при R CMD INSTALL. make nsr-vendor-sync синхронизирует исходники крейтов.
Тот же движок, другой язык
Идентичное Rust-ядро с Python- и WASM-биндингами. R-пользователи получают ту же скорость и числовую точность — не переимплементация.
Агент вызывает. NextStat отвечает.
GPT, Claude, Llama, локальная модель через Ollama — любой агент может вызвать NextStat как инструмент. OpenAI function calling, LangChain и MCP из коробки. Локально или через GPU-сервер.
OpenAI
from nextstat.tools import get_toolkit, execute_tool
import openai, json
tools = get_toolkit() # OpenAI-совместимые определения
resp = openai.chat.completions.create(
model="gpt",
messages=[{"role": "user", "content": "Фит workspace и покажи POI"}],
tools=tools,
)
for call in resp.choices[0].message.tool_calls:
result = execute_tool(
call.function.name,
json.loads(call.function.arguments),
)
# result: { ok, result, error, meta }MCP
from nextstat.tools import get_mcp_tools, handle_mcp_call
mcp_tools = get_mcp_tools() # MCP-совместимые определения
# ... MCP-сервер получает вызов ...
result = handle_mcp_call("nextstat_fit", {"workspace_json": ws})LangChain
from nextstat.tools import get_langchain_tools
tools = get_langchain_tools() # list[StructuredTool]
agent = create_tool_calling_agent(llm, tools, prompt)8 инструментов — полный цикл анализа
fit, hypotest, upper_limit, ranking, discovery, scan, workspace_audit, read_root_histogram. Агент может провести весь анализ от ROOT-файла до публикации.
OpenAI · LangChain · MCP
Единый реестр инструментов с адаптерами для трёх главных стандартов. get_toolkit() — OpenAI, get_langchain_tools() — LangChain StructuredTool, get_mcp_tools() — Model Context Protocol.
local + server transport
Инструменты работают in-process через Python или удалённо через nextstat-server (HTTP). Автоматический fallback: если сервер недоступен, вызов исполняется локально.
Детерминированный envelope
Каждый ответ — стабильный JSON nextstat.tool_result.v1: { ok, result, error, meta }. Режим parity + threads=1 гарантируют воспроизводимость между вызовами.
Physics Assistant — демо
Полный пример: ROOT-гистограммы → workspace → anomaly scan → discovery → верхние пределы. Работает локально, через сервер и в Docker.
Производительность
в масштабе.
CLs по toy-экспериментам на реальной модели ФВЭ. Один workspace, одна физика. Реальное время.
Установка за секунды.
Запуск за минуты.
pip install nextstat. Без conda. Без root. Без компилятора.
NextStat вдохновлён работой pyhf, TRExFitter, ROOT, и HistFactory спецификации.
Мы благодарны их авторам и сообществам.
