Альтман: Practical Statistics for Medical Research
Обзор книги Дугласа Альтмана: план анализа, повторные измерения и несколько проверок. Собственные медицинские и продуктовые примеры в Python.
Содержание статьи
В таблице десять визитов, но пациентов всего четыре. Можно получить аккуратное среднее и узкий интервал, а затем обнаружить, что расчёт отвечал не на тот вопрос. Practical Statistics for Medical Research Дугласа Альтмана стоит выбирать, когда вам нужен переход от статистических процедур к устройству исследования. Этот обзор опирается на проверенную библиографию и оглавление; три собственных примера показывают, какие решения требуется принять до запуска анализа.
Короткий ответ: когда читать Альтмана
- Когда базовые термины уже знакомы, но вы затрудняетесь сформулировать вопрос, подготовить данные и выбрать сравнение.
- Когда проверяете чужой анализ и хотите понять, согласованы ли дизайн, расчёт и формулировка вывода.
- Когда готовы читать по-английски и отдельно осваивать современный инструмент расчёта.
Издание и границы этого обзора
Автор — Douglas G. Altman, Дуглас Г. Альтман. Оригинальное название — Practical Statistics for Medical Research. Для библиографической записи выбираем английское издание Chapman and Hall, 1991, ISBN 9780412386206: эти данные подтверждены Google Books. Проверенное русское издание в рамках обзора не установлено; перевод названия «Практическая статистика для медицинских исследований» здесь лишь пояснение смысла.
У нынешней карточки Routledge указан copyright 1990 и другое ISBN. Это не повод объединять сведения в одну запись или объявлять одну дату ошибкой. При цитировании используйте выходные данные своего экземпляра. Оглавление проверено по издателю; доступ к полному тексту книги для этого обзора не использовался.
По описанию издателя книга адресована медицинским исследователям и другим специалистам без специальной математической подготовки. Наша рекомендация для входа: понимание среднего, доли, разброса и доверительного интервала. Школьная алгебра помогает читать формулы, но главный труд здесь — связать статистический ответ с тем, как наблюдения вообще появились.
Как устроен путь от данных к выводу
Оглавление начинается с типов и описания данных, затем переходит к распределениям, планированию исследования, работе с компьютером и подготовке анализа. Дальше идут сравнения групп, связи переменных, время до события и вопросы клинических исследований. Такой состав позволяет читать книгу как маршрут подготовки исследования, а не только как справочник тестов.
Сильная сторона этого маршрута для аналитика — возможность остановиться до вычислений. Как определён исход? Есть ли повторные наблюдения? Сравниваются ли сопоставимые группы? Что будет считаться полезным изменением? Это наши рабочие вопросы к заявленным темам книги; мы не приписываем автору конкретные формулировки, которых не проверяли в тексте.
Предлагаем начать с собственного протокола на одну страницу. В нём достаточно назвать популяцию, единицу наблюдения, период, основной показатель и способ сравнения. Если вы не можете заполнить эти поля, статистический пакет не устранит неопределённость за вас. Он посчитает заданную формулу даже при неверно выбранной таблице.
Идея 1. Строка таблицы и независимый участник различаются
У четырёх условных пациентов среднее значение некоторого показателя равно 4, 8, 12 и 16 единицам. Число визитов соответственно 1, 1, 2 и 6. Для прозрачной арифметики считаем, что внутри каждого пациента показания одинаковы. Это специальный учебный набор, а не модель реального течения заболевания.
Если каждому пациенту дать одинаковый вес, среднее равно 10. Если усреднить все десять визитов, получится 13,2. Во втором расчёте человек с шестью визитами влияет на результат в шесть раз сильнее человека с одним. Ни один результат не является арифметической ошибкой: они описывают разные совокупности.
Для вопроса о среднем пациенте разумнее начинать с одинакового веса пациентов и явно определить, что означает его индивидуальное среднее. Для вопроса о случайно выбранном визите вес посещений может соответствовать цели. Но если частота посещений связана с тяжестью состояния, подмена пациента визитом особенно сильно меняет интерпретацию.
| Пациент | Средний показатель | Визитов | Вес при анализе людей |
|---|---|---|---|
| A | 4 | 1 | 1/4 |
| B | 8 | 1 | 1/4 |
| C | 12 | 2 | 1/4 |
| D | 16 | 6 | 1/4 |
Python: повторение строк не добавляет людей
Каждый пример можно запускать отдельно: все входные значения заданы внутри блока, внешние файлы не нужны. Для расчётов этой статьи установите пакеты командой python -m pip install numpy scipy statsmodels. Код проверен с Python 3.12; точные версии библиотек и результаты сохранены в отчёте подготовки материала. При изменении данных заново проверьте допущения, а не только успешное выполнение команды.
Код печатает оба средних и демонстрирует ошибочную оценку стандартной ошибки, если считать строки независимыми. После механического десятикратного копирования тех же визитов наивная стандартная ошибка уменьшается с 1,339983 до 0,404020. Новых людей или новых сведений не появилось, а формула стала изображать большую точность.
Эти стандартные ошибки показаны как антипример. Их нельзя использовать для вывода о среднем пациенте. Для реального исследования с повторными измерениями нужны заранее выбранный показатель на человека или метод, учитывающий зависимость: например, подходящая смешанная модель. Выбор зависит от вопроса, числа участников и структуры времени, а не только от доступности функции.
В продуктовой аналитике то же происходит с событиями. Один активный пользователь создаёт много строк, другой — одну. Если эксперимент назначается пользователю, объём таблицы событий не равен числу независимых назначений. Группировка по пользователю может помочь, но сама по себе не определяет, какую метрику следует агрегировать и за какой период.
Ещё один случай — соединение таблиц. После JOIN каждая запись заказа повторяется по числу товарных позиций. Средняя сумма заказа становится взвешенной числом позиций, хотя поле называется по-прежнему. До статистического анализа проверьте ключ, количество уникальных участников и распределение числа строк на участника. Это часть определения данных, а не косметическая очистка.
import numpy as np
# Среднее каждого пациента и число его визитов. Данные условные.
patient_means = np.array([4., 8., 12., 16.])
visits = np.array([1, 1, 2, 6])
rows = np.repeat(patient_means, visits)
print("patients", len(patient_means), "visits", len(rows))
print("equal_patient_mean", patient_means.mean())
print("visit_weighted_mean", rows.mean())
# Скопированные записи НЕ добавляют независимых пациентов.
for copies in [1, 10]:
repeated = np.tile(rows, copies)
naive_se = repeated.std(ddof=1) / np.sqrt(len(repeated))
print("rows", len(repeated), "naive_se", round(naive_se, 6))
Идея 2. У набора гипотез должен быть видимый состав
Пусть исследование имеет пять заранее перечисленных вторичных гипотез. В учебном наборе их p-value равны 0,008; 0,018; 0,041; 0,12; 0,4. Если каждую сравнить с 0,05 отдельно, первые три будут отмечены как отклонённые. Это не контроль вероятности хотя бы одного ложного отклонения во всей семье.
Процедура Холма упорядочивает p-value и последовательно учитывает число оставшихся проверок. В нашем наборе скорректированные значения равны 0,040; 0,072; 0,123; 0,240; 0,400. При уровне 0,05 отклоняется только первая гипотеза. Поправка не меняет оценённые эффекты: она меняет правило статистического решения для заданного набора проверок.
| Гипотеза | Исходное p | p по Холму | Отклонить при 0,05 |
|---|---|---|---|
| 1 | 0,008 | 0,040 | Да |
| 2 | 0,018 | 0,072 | Нет |
| 3 | 0,041 | 0,123 | Нет |
| 4 | 0,120 | 0,240 | Нет |
| 5 | 0,400 | 0,400 | Нет |
Python: поправка Холма
Скрипт использует явно названный метод holm и возвращает результаты в исходном порядке гипотез. Это помогает избежать ошибки, когда отсортированный список p-value случайно подписывают старыми названиями показателей. В реальном отчёте рядом должны стоять эффект, интервал, исходное и скорректированное p-value, если последнее участвует в принятом правиле.
Здесь нет пациентов и исходных измерений: p-value специально заданы как учебный вход для демонстрации поправки. Скрипт не воспроизводит сами пять тестов. Если публикуете результат настоящего исследования, этого недостаточно: необходимы определения исходов, исходные данные или воспроизводимые агрегаты и описание каждой проверки.
Холм контролирует семейную ошибку при корректных исходных p-value и не требует независимости тестов. Но он не исправляет скрытый перебор десятков моделей, если в семью включили лишь удачные пять результатов. Границу семьи задают содержательно и заранее. Нельзя считать её чисто техническим параметром, который выбирается по желаемому ответу.
Для продукта это полезно при нескольких вторичных метриках эксперимента. Основную метрику, защитные ограничения и исследовательские срезы лучше развести в плане по их роли. Одна общая поправка на всё подряд тоже не заменяет определения решения: команда должна понимать, какая находка разрешает выпуск и какая лишь запускает новое исследование.
import numpy as np
from statsmodels.stats.multitest import multipletests
# Учебные p-value пяти заранее перечисленных вторичных гипотез.
p = np.array([0.008, 0.018, 0.041, 0.12, 0.4])
reject, corrected, _, _ = multipletests(p, alpha=0.05, method="holm")
for i, (raw, adj, decision) in enumerate(zip(p, corrected, reject), 1):
print(i, f"raw={raw:.3f}", f"holm={adj:.3f}", bool(decision))
Идея 3. Отличие от нуля не равно достаточной пользе
Восемь условных участников имеют парные изменения показателя от −1 до −5 единиц; полный массив приведён в коде. Знак определён как «после минус до». Среднее изменение равно −3, а 95% t-интервал — от −4,094608 до −1,905392. Это учебное применение модели независимых примерно нормально распределённых индивидуальных разностей.
Интервал не включает ноль, но допустим, что до сбора данных установили содержательную цель: снижение как минимум на 4 единицы. Интервал не лежит целиком ниже −4. Следовательно, отличие от нуля не доказывает достижение этой заранее заданной цели. Наблюдаемая средняя величина тоже меньше желаемого снижения по модулю.
Python: эффект и заранее заданная граница
Условная граница −4 нужна только для демонстрации логики. Она не является медицинской нормой или рекомендацией. В настоящей работе её обоснование должно приходить из предметной задачи, а не из удобного положения полученного интервала. Код проверяет геометрическое условие для интервала, но не заменяет полноценный план исследования эффективности или эквивалентности.
Кроме того, это сравнение «до — после» без контрольной группы. Оно описывает изменение в наблюдаемом наборе, но не устанавливает, что изменение вызвано вмешательством. Влиять могли естественная динамика, изменение способа измерения или отбор участников. Статистическая определённость относительно нуля не устраняет эти альтернативы.
В продукте заранее заданной границей может быть прирост, окупающий поддержку функции. Эксперимент способен показать положительную разницу, недостаточную для покрытия расходов. Или интервал может одновременно допускать полезный эффект и небольшой ущерб. В этих случаях полезнее назвать диапазон допустимых сценариев, чем ограничиться цветом ячейки «значимо».
import numpy as np
from scipy.stats import t
# Синтетическое парное изменение показателя. После минус до.
d = np.array([-1, -2, -2, -3, -3, -4, -4, -5], dtype=float)
mean = d.mean()
se = d.std(ddof=1) / np.sqrt(len(d))
ci = mean + np.array([-1, 1]) * t.ppf(0.975, len(d)-1) * se
print("mean_change", mean, "ci95", np.round(ci, 6))
# Условная заранее заданная граница полезности: снижение минимум на 4.
print("entire_CI_below_minus_4", bool(ci[1] < -4))
Что остаётся полезным, а что нужно дополнять
Подтверждённый охват книги связывает подготовку, анализ и чтение медицинской литературы. Это хорошая причина рассматривать её как основу обсуждения протокола. При этом обзор по оглавлению не позволяет обещать, что любой частный вопрос о повторных наблюдениях или множественных проверках разобран именно в нужной вам глубине.
Компьютерная часть издания начала девяностых не может служить актуальной инструкцией по сегодняшним версиям библиотек. Наши команды Python — отдельное сопровождение. Проверяйте документацию метода, параметры по умолчанию, обработку пропусков и то, что именно возвращает интервал. Совпадение названия процедуры не гарантирует совпадение постановки задачи.
Книгу также не стоит превращать в полный источник по современной причинной аналитике, машинному обучению или последовательному наблюдению за онлайн-экспериментом. Эти задачи требуют своих предпосылок и правил. Классический фиксированный анализ нельзя незаметно заменить ежедневным просмотром p-value с остановкой в удобный день.
Как читать без переписывания формул
Возьмите один исследовательский вопрос и составьте две версии таблицы: на уровне участников и на уровне измерений. Подпишите, какую величину оценивает среднее каждой таблицы. Затем выберите одну версию для основного анализа и запишите, что потеряно при агрегировании. Если интересна динамика, одного среднего на человека может оказаться мало.
Следующий шаг — список решений до просмотра результата: включение участников, окно наблюдения, обработка отсутствующих значений, основной исход и вторичные проверки. Отдельно перечислите решения, которые пришлось принять позже. Это позволяет отличить подтверждение заранее сформулированной гипотезы от полезного, но исследовательского поиска.
В конце напишите результат в двух предложениях: оценка с неопределённостью и граница интерпретации. Например, «изменение наблюдалось в этой группе», а не «метод вызвал изменение», если контрольного сравнения нет. Такая редактура часто вскрывает недостаток дизайна раньше, чем добавление ещё одного статистического теста.
Кому выбрать другую книгу
Если затруднение начинается уже с различия среднего и стандартного отклонения, сначала удобнее пройти короткий вводный курс Банержи или Петри и Сэбина. Если проблема — согласие двух приборов, посмотрите обзор Блэнда. Если вы уже выбрали модель и готовите рукопись, Ланг и Сесик ближе к задаче описания результатов.
Альтман уместен, когда вы готовы останавливаться на неудобных вопросах до получения цифр. Результат чтения — не количество освоенных названий, а способность объяснить другому человеку, почему выбранная таблица и процедура соответствуют исследованию. Для этого небольшого собственного набора часто достаточно, даже если рабочая база содержит миллионы строк.
Следующий шаг
Используйте ссылки ниже как продолжение трёх разобранных вопросов: единица наблюдения, точность эффекта и описание анализа. Сохраните скрипты вместе с входными данными и отметьте версии библиотек. Если коллега может повторить число, но не понять его смысл, добавьте определение оцениваемой величины перед кодом.
Материал образовательный. Медицинские данные и границы полезности здесь условные; они не служат рекомендациями по диагностике или лечению.
Материалы по теме

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

Кирквуд и Стерн: Essential Medical Statistics
Обзор Essential Medical Statistics: частоты на человеко-время, стандартизация и кластерные данные. Проверенная библиография и расчёты Python.

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