Кирквуд и Стерн: Essential Medical Statistics
Обзор Essential Medical Statistics: частоты на человеко-время, стандартизация и кластерные данные. Проверенная библиография и расчёты Python.
Содержание статьи
В одной группе произошло меньше событий, но и наблюдали её меньше времени. В другой доля исходов выше, потому что там больше людей с высоким исходным риском. Essential Medical Statistics Бетти Кирквуд и Джонатана Стерна полезно рассматривать как следующий шаг после базовых тестов: здесь начинается работа со знаменателями, структурой данных и моделями. В обзоре проверяем издание и разбираем три собственных примера с переносом на продуктовую аналитику.
Короткий ответ: кому подойдёт Essential Medical Statistics
- Читателю, который уже различает среднее, долю и доверительный интервал и готов разбирать более сложное устройство исследования.
- Аналитику, которому нужны связи между типом исхода, временем наблюдения, группировкой и выбором модели.
- Для первого знакомства без статистического словаря лучше начать с более короткого вводного материала, а к этой книге возвращаться по конкретной задаче.
Библиография: какое издание выбрано
Авторы — Betty R. Kirkwood и Jonathan A. C. Sterne. Оригинальное название — Essential Medical Statistics, второе издание, Blackwell Science, 2003, ISBN 978-0-86542-871-3. Издательская карточка Wiley подтверждает второе издание и печатный выпуск 2003 года; отдельная электронная версия имеет другую дату и ISBN. Здесь сведения между форматами не смешиваются.
Проверенное русское издание в рамках обзора не установлено. «Основы медицинской статистики» — возможный перевод названия для ориентации, а не библиографическое название перевода. В поиске лучше использовать оригинал и фамилии обоих авторов: иначе легко попасть на другую книгу с похожим русским заголовком.
Обзор основан на описании и подробном оглавлении издателя. Полный текст и все упражнения не были доступны для оценки. Уровень и маршрут чтения ниже — наша рекомендация, а расчёты — самостоятельные примеры по подтверждённым темам. Мы не воспроизводим таблицы или задачи книги.
Чем отличается структура
Оглавление группирует методы по виду исхода: числовые показатели, бинарные события, частоты и время до события. Далее идут общие вопросы моделирования, кластерные данные и связь анализа с дизайном. Отдельно видны стратификация, стандартизация и несколько семейств регрессии. Это удобная основа для выбора языка модели по тому, что именно наблюдалось.
Для начала достаточно уверенной школьной алгебры и базового статистического словаря. При переходе к регрессии понадобится понимание условного среднего и роли предикторов. Наш практикум добавляет логарифм и квадратный корень в одном приближённом интервале; код позволяет проверить арифметику, но не освобождает от объяснения знаменателя.
Разумный маршрут: сначала определить исход и время наблюдения, затем посмотреть на состав сравниваемых групп, после — на зависимость наблюдений. Только потом выбирать модель. Эта последовательность не является авторским оглавлением занятия: это наш способ использовать подтверждённый охват книги для подготовки аналитического решения.
Идея 1. Частота на человеко-время отличается от риска
Условно в группе A зарегистрировали 12 первых событий за 600 человеко-месяцев под риском, в B — 18 за 1200. Частоты равны 2 и 1,5 события на 100 человеко-месяцев. Хотя событий в A меньше, на единицу накопленного времени их больше. Отношение частот A к B равно 1,333333.
Человеко-время — сумма индивидуального времени, в течение которого участники могли испытать учитываемое событие. Для анализа первого события время человека заканчивается при событии, завершении наблюдения или другом предусмотренном протоколом выходе. Суммировать полное время после события в тот же знаменатель нельзя: тогда определение величины меняется.
Риск отвечает на вопрос о доле участников с событием за определённый срок. Частота отвечает на вопрос об интенсивности событий на единицу времени под риском. В наших агрегатах нет числа людей и общего для всех горизонта, поэтому по ним нельзя просто сообщить «риск 2%» или сравнить доли участников.
Python: отношение частот и грубый интервал
Каждый пример можно запускать отдельно: все входные значения заданы внутри блока, внешние файлы не нужны. Для расчётов этой статьи установите пакеты командой python -m pip install numpy. Код проверен с Python 3.12; точные версии библиотек и результаты сохранены в отчёте подготовки материала. При изменении данных заново проверьте допущения, а не только успешное выполнение команды.
При независимой пуассоновской модели счётчиков приближённая стандартная ошибка логарифма отношения частот равна корню из суммы обратных чисел событий. Получается 95% интервал примерно от 0,642257 до 2,768016. Он широк и включает единицу: точечное отношение выше единицы, но данных недостаточно для узкого диапазона правдоподобных величин эффекта в этой модели.
Это логарифмическая аппроксимация для учебной арифметики. При малом числе событий, особенно нуле, нужны другие методы; деление на ноль не исправляют произвольной константой без объяснения. При меняющейся во времени интенсивности, неоднородности участников или зависимости событий простая пуассоновская модель также может оказаться недостаточной.
Для первых событий интерпретация требует, чтобы время под риском было определено одинаково в обеих группах. Разные правила старта, задержка регистрации события или информативное прекращение наблюдения способны исказить сравнение. Число событий и знаменатель полезно хранить рядом, а не публиковать только итоговое отношение.
В продукте аналог — первое прекращение платной подписки на клиентские месяцы под риском. Частота отмен не равна доле клиентов, ушедших за первый месяц. Если вас интересует вероятность дожить без отмены до конкретного срока, переходите к анализу времени до события. Если считаются повторные обращения в поддержку, нужно явно изменить определение события и проверить зависимость повторов.
from math import log, exp, sqrt
# Условные первые события и время под риском до события/цензурирования.
events_a, time_a = 12, 600.0 # человеко-месяцы
events_b, time_b = 18, 1200.0
rate_a, rate_b = events_a/time_a, events_b/time_b
ratio = rate_a/rate_b
se_log = sqrt(1/events_a + 1/events_b)
ci = [exp(log(ratio) + sign*1.96*se_log) for sign in [-1, 1]]
print("rates_per_100_pm", 100*rate_a, 100*rate_b)
print("rate_ratio", round(ratio, 6), "ci95_approx", [round(v, 6) for v in ci])
Идея 2. Состав групп способен перевернуть сравнение
Теперь у нас другая синтетическая задача: две группы по 100 человек с одинаковым горизонтом наблюдения. В каждой выделены два возрастных слоя. В A больше участников младшего слоя: 80 против 20. В B структура обратная: 20 против 80. Никакие медицинские значения возраста здесь не задаются — нужны только две условные категории.
В A риски по слоям равны 10% и 30%, в B — 5% и 20%. В каждом слое A выше B. Но общий риск A составляет 14%, B — 17%, потому что в B гораздо больше участников слоя с более частым событием. Сравнение общих долей смешивает различие внутри слоя и различие состава групп.
Выберем общую целевую структуру: половина участников из каждого слоя. Прямо стандартизированные риски составят 20% для A и 12,5% для B. Это ответ на условный вопрос: какие риски получились бы при одинаковых весах слоёв, если использовать наблюдаемые послойные риски? Это не новые наблюдаемые доли в исходной таблице.
| Группа | Младший слой | Старший слой | Грубый риск | Риск при весах 50/50 |
|---|---|---|---|---|
| A | 8 / 80 | 6 / 20 | 14% | 20% |
| B | 1 / 20 | 16 / 80 | 17% | 12,5% |
Python: одна структура для двух групп
В коде веса заданы заранее и их сумма равна единице. В реальной задаче целевая структура может соответствовать обслуживаемой популяции, плану набора или явно выбранному стандарту. Выбор влияет на итоговую величину. Поэтому стандартизированное число без названия стандарта и послойных данных трудно интерпретировать и повторить.
Стандартизация по возрастному слою не устраняет все возможные смешивающие факторы. Группы могут различаться по другим признакам, качеству регистрации исходов и причинам включения. Наш расчёт демонстрирует композиционный эффект, а не доказывает причинное превосходство какого-либо вмешательства. Для причинного вывода нужны дополнительные предпосылки и дизайн.
В продуктовой аналитике похожая ситуация возникает, когда после релиза стало больше новых пользователей. Общая конверсия падает, хотя у новых и старых пользователей отдельно она выросла. Можно показать исходные доли и результат при фиксированной структуре, но нельзя молча заменить одну метрику другой: бизнесу могут быть нужны оба ответа.
Общий показатель описывает фактическую смесь аудитории, стандартизированный — сравнение при выбранной смеси. Если сама смена аудитории является результатом продуктового решения, её нельзя автоматически считать помехой. Сначала уточните, оцениваете ли вы общий эффект политики привлечения или изменение поведения внутри сегментов.
import numpy as np
# Условные частоты события в двух возрастных слоях, общий срок наблюдения.
n_a, e_a = np.array([80, 20]), np.array([8, 6])
n_b, e_b = np.array([20, 80]), np.array([1, 16])
weights = np.array([0.5, 0.5]) # заранее выбранная целевая структура
for name, n, e in [("A", n_a, e_a), ("B", n_b, e_b)]:
rates = e/n
print(name, "stratum_risks", rates, "crude", e.sum()/n.sum(),
"standardized", np.dot(weights, rates))
Идея 3. Наблюдения внутри группы могут не быть независимыми
Предположим, планируется собрать данные в 20 условных учреждениях по 30 человек. Всего 600 наблюдений. Участники одного учреждения могут быть похожи из-за общих условий, процесса отбора или способа измерения. Формула стандартной ошибки для независимых людей тогда способна преувеличить точность.
Для простого планировочного сценария с одинаковым размером кластеров используют design effect: 1 + (m − 1)ρ, где m — число наблюдений в кластере, ρ — внутрикластерная корреляция. При ρ = 0 эффект дизайна равен 1. При 0,02 он равен 1,58, при 0,10 — 3,9.
Если разделить общий n на эти множители, получим грубый эквивалент объёма независимой выборки: 600, около 379,747 и 153,846. Это не число реально включённых людей и не готовое число степеней свободы для теста. Это иллюстрация того, насколько сильно допущение о зависимости может повлиять на планируемую точность.
| ICC ρ | Наблюдений | Эффект дизайна | Приближённый эффективный n |
|---|---|---|---|
| 0 | 600 | 1 | 600 |
| 0,02 | 600 | 1,58 | 379,747 |
| 0,10 | 600 | 3,9 | 153,846 |
Python: чувствительность к внутрикластерной связи
Значения ρ в коде заданы как сценарии, а не оценены по данным. Мы не имитируем измерения и не подгоняем модель. Такой расчёт полезен до сбора информации: он показывает, какие допущения о сходстве внутри учреждения нужно обосновать внешними данными или пилотом.
Аппроксимация ограничена. При разных размерах кластеров, сложной выборке и иной оцениваемой величине нужна более подходящая формула или моделирование. При небольшом количестве кластеров обычные асимптотические поправки стандартных ошибок тоже требуют осторожности. Нельзя передать «эффективный n» в обычный t-тест и считать зависимость исправленной.
В B2B-продукте естественный кластер — организация. Изменение интерфейса могут обсуждать коллеги, права доступа задаются всем аккаунтом, решение о продлении принимает один покупатель. Даже большое число пользователей не создаёт столько же независимых организаций. При рандомизации по компаниям учитывать структуру нужно уже в плане эксперимента.
Добавление новых независимых кластеров и увеличение числа людей внутри старых решают разные задачи. Если общая среда сильно сближает наблюдения, очередной человек из того же учреждения приносит меньше новой информации, чем человек из нового. Бюджет исследования стоит обсуждать вместе с этой структурой, а не только с итоговым числом строк.
# Планировочная аппроксимация для одинаковых кластеров; не оценка ICC.
clusters, cluster_size = 20, 30
n = clusters*cluster_size
for rho in [0, 0.02, 0.10]:
design_effect = 1+(cluster_size-1)*rho
print("rho", rho, "design_effect", round(design_effect, 2),
"effective_n_approx", round(n/design_effect, 3))
Как выбрать семейство модели
Начните с определения исхода. Непрерывное значение, наличие события к фиксированному сроку, число событий с экспозицией и время до первого события требуют разных представлений данных. Название библиотеки или привычка команды не являются основанием выбора. Даже хорошая модель неверного исхода ответит на другой вопрос.
Следом определите сравнение: грубое, послойное или с поправкой на заранее обоснованные признаки. Для бинарного исхода логистическая модель даёт параметры в шкале шансов; они не становятся относительным риском от одного переименования колонки. Для счётчика экспозиция должна входить в модель согласованно с определением частоты.
После этого проверьте зависимость, пропуски и диапазон применения. Модель может прекрасно описывать наблюдаемую таблицу и плохо переноситься на популяцию, где нет представленных в ней учреждений или сегментов. Диагностика модели — отдельный этап, а не награда за маленькое p-value коэффициента.
Что полезно сегодня и где границы
Подтверждённая структура книги связывает исход, дизайн и модель; именно это делает её полезным продолжением вводного курса. По оглавлению видны темы, которые часто пропускают при знакомстве только с отдельными тестами. Однако наличие главы не позволяет нам оценить полноту всех её объяснений без полного текста.
Издание 2003 года не является документацией современных пакетов. Наши примеры намеренно короткие: они показывают определение величины и арифметику, а не промышленный анализ. Для рабочего проекта дополнительно понадобятся актуальные реализации, диагностика, проверка чувствительности и воспроизводимая подготовка данных.
Если вы пока не различаете риск и частоту, не начинайте с перечня регрессионных моделей. Сначала повторите первый пример и объясните, почему его знаменатель измеряется в человеко-месяцах. Если затруднение только в вычислении, код поможет. Если затруднение в выборе вопроса, возвращайтесь к дизайну и назначению анализа.
С чем читать и что сделать после
Для подготовки общего плана полезен Альтман. Для понимания времени наблюдения — отдельный материал о Каплане — Мейере. Для различия риска и шансов — соответствующий разбор на таблице частот. Эти источники закрывают разные места, где одна удобная формула может скрыть подмену вопроса.
Практическое задание после обзора: возьмите показатель своей команды и выпишите числитель, знаменатель, временное окно и единицу независимого наблюдения. Затем представьте, что изменился состав аудитории или длительность наблюдения. Какие части показателя изменятся даже при прежнем поведении внутри сегментов? Ответ подскажет следующий расчёт лучше, чем список популярных методов.
Материал образовательный. Все медицинские примеры условные; они не описывают реальные группы пациентов и не предназначены для выбора диагностики или лечения.
Материалы по теме

Статьи Гржибовского: маршрут по медицинской статистике
Как читать статистические практикумы Гржибовского и соавторов в «Экологии человека»: проверенные публикации, ограничения и собственные расчёты Python.

Блэнд: An Introduction to Medical Statistics
Обзор четвёртого издания книги Мартина Блэнда: согласие измерений, каппа и неопределённость. Три собственных расчёта Python с переносом в продукт.

Альтман: Practical Statistics for Medical Research
Обзор книги Дугласа Альтмана: план анализа, повторные измерения и несколько проверок. Собственные медицинские и продуктовые примеры в Python.