21  Стандартизированные коэффициенты

На этой странице мы покажем, как стандартизировать исход, например, госпитализации или смертность, по таким характеристикам как возраст и пол.

На этой странице используется пакет PHEindicatormethods.

Мы начнем с подробной демонстрации процесса подготовки/вычистки/соединения данных, так как это часто требуется при объединении популяционных данных из разных стран, данных о стандартном населении, смертях и т.п.

21.1 Обзор

Существует два основных способа стандартиации: прямая и косвенная стандартизация Представим, что вам нужно стандартизировать коэффициент смертности по возрасту и полу для страны A и страны B, а также сравнить стандартизированные коэффициенты между этими странами.

  • Для прямой стандартизации необходимо знать численность населения, подверженного риску, и количество смертей для каждой половозрастной страты в стране А и стране Б. Одной из страт в нашем примере могут быть женщины в возрасте 15-44 лет.
  • Для косвенной стандартизации достаточно знать общее число умерших и половозрастную структуру населения каждой страны. Поэтому этот вариант возможен, если отсутствуют возрастные и половые коэффициенты смертности или численность населения. Кроме того, косвенная стандартизация предпочтительна в случае небольшого числа наблюдений в каждой страте, так как на оценки при прямой стандартизации будет влиять значительный разброс выборки.

21.2 Подготовка

Чтобы показать, как проводится стандартизация, мы будем использовать фиктивные данные о численности населения и смертности в странах А и Б с разбивкой по возрасту (в категориях 5 лет) и полу (женщины, мужчины). Чтобы подготовить наборы данных к использованию, выполним следующие подготовительные действия:

  1. Загрузим пакеты
  2. Загрузим наборы данных
  3. Соединим данные по населению и смертям по двум странам
  4. Повернем вертикально, чтобы была одна строка на половозрастную страту
  5. Вычистим референтную популяцию (мировое стандартное население) и присоединим ее к страновым данным

В вашем сценарии данные могут быть представлены в другом формате. Возможно, данные представлены по провинциям, городам или другим районам. У вас может быть одна строка для каждого случая смерти и информация о возрасте и поле для каждого (или значительной части) из этих случаев смерти. В таком случае, см. страницы Группирование данных, Поворот данных и Описательные таблицы, чтобы создать набор данных с подсчетом событий и населения по половозрастным стратам.

Нам также нужна референтная популяция, стандартное население. В этом упражнении мы будет использовать world_standard_population_by_sex. Мировое стандартное население основано на населении 46 стран и было разработано в 1960. Существует много “стандартных” популяций - в качестве примера см. веб-сайт Медицинской службы Шотландии, который является очень информативным в вопросах Европейского стандартного населения, Мирового стандартного населения и Стандартного населения Шотландии.

Загрузка пакетов

Данный фрагмент кода показывает загрузку пакетов, необходимых для анализа. В данном руководстве мы фокусируемся на использовании p_load() из пакета pacman, которая устанавливает пакет, если необходимо, и загружает его для использования. Вы можете также загрузить установленные пакеты с помощью library() из базового R. См. страницу Основы R для получения дополнительной информации о пакетах R.

pacman::p_load(
     rio,                 # импорт/экспорт данных
     here,                # путь к файлам
     stringr,             # вычистка текста и последовательностей
     PHEindicatormethods, # альтернатива для стандартизации коэффициентов
     tidyverse,           # управление данными и визуализация
     appliedepidata) # примеры данных, используемые в этом руководстве

Загружаем популяционные данные

Для получения инструкций о том, как скачать все данные для примеров из руководства см. страницу Скачивание руководства и данных. Вы можете импортировать данные для страницы Стандартизация напрямую в R, выполнив следующие команды appliedepidata::get_data():

# импорт демографических данных по стране A напрямую из Github
A_demo <- appliedepidata::get_data(name = "country_demographics")

# импорт данных о смертях для страны A напрямую из Github
A_deaths <- appliedepidata::get_data(name = "deaths_countryA")

# импорт демографических данных по стране B напрямую из Github
B_demo <- appliedepidata::get_data(name = "country_demographics_2")

# импорт данных о смертях для страны B напрямую из Github
B_deaths <- appliedepidata::get_data(name = "deaths_countryB")

# импорт референсной (мировой стандартной) популяции напрямую из Github
standard_pop_data <- appliedepidata::get_data(name = "world_standard_population_by_sex")

Сначала мы загружаем демографические данные (количество мужчин и женщин по 5-летним возрастным категориям) для двух стран, которые мы будем сравнивать, “Страны A” и “Страны B”.

# Страна A
A_demo <- appliedepidata::get_data(name = "country_demographics")
# Страна B
B_demo <- appliedepidata::get_data(name = "country_demographics_2")

Загружаем данные о количестве смертей

Что удобно, у нас также естьт количество смертей за интересующий временной период по полу и возрасту. Количество по каждой стране представлено в отдельном файле, показанном ниже.

Смерти в Стране A

Смерти в Стране B

Вычищаем данные по населению и смертям

Нам нужно соединить и трансформировать эти данные следующим образом:

  • Объединить населения стран в один набор данных и повернуть вертикально, чтобы каждая половозрастная страта занимала одну строку
  • Объединить количество смертей стран и повернуть вертикально, чтобы каждая половозрастная страта занимала одну строку
  • Присоединить смерти к популяциям

Сначала объединим наборы данных с населением стран, повернем вертикально и проведем небольшую вычистку. См. страницу Поворот данных для получения более подробной информации.

pop_countries <- A_demo %>%  # начнем с набора данных по Стране A
     bind_rows(B_demo) %>%        # связываем строки, поскольку столбцы имеют одинаковые названия
     pivot_longer(                       # поворачиваем вертикально
          cols = c(m, f),                   # столбцы объединяются в один
          names_to = "Sex",                 # имя для нового столбца, содержащего категорию ("m" или "f") 
          values_to = "Population") %>%     # имя для нового столбца, содержащего повернутые числовые значения
     mutate(Sex = recode(Sex,            # перекодируем значения для ясности
          "m" = "Male",
          "f" = "Female"))

Объединенные данные по населению теперь выглядят вот так (пролистайте, чтобы увидеть страны A и B):

Теперь проведем похожие операции с двумя наборами данных о смертях.

deaths_countries <- A_deaths %>%    # начинаем с набора данных о смертях в стране A
     bind_rows(B_deaths) %>%        # связываем строки с набором данных B, поскольку столбцы имеют одинаковые названия
     pivot_longer(                  # поворачиваем вертикально
          cols = c(Male, Female),        # столбцы трансформируются в один
          names_to = "Sex",              # имя для нового столбца, содержащего категорию ("m" или "f") 
          values_to = "Deaths") %>%      # имя для нового столбца, содержащего повернутые числовые значения
     rename(age_cat5 = AgeCat)      # переименуем для ясности

Данные о смертях теперь выглядят вот так и содержат данные из обеих стран:

Теперь мы соединим данные о смертях и о населении на основе общих столбцов Country (страна), age_cat5 (возрастная категория) и Sex (пол). Это добавит столбец Deaths (смерти).

country_data <- pop_countries %>% 
     left_join(deaths_countries, by = c("Country", "age_cat5", "Sex"))

Теперь мы классифицируем Sex, age_cat5 и Country как факторы и установим порядок уровней с помощью функции fct_relevel() из пакета forcats, как описано на странице Факторы. Обратите внимание, что классификация уровней фактора не меняет видимые данные, а команда arrange() сортирует по Стране, возрастной категории и полу.

country_data <- country_data %>% 
  mutate(
    Country = fct_relevel(Country, "A", "B"),
      
    Sex = fct_relevel(Sex, "Male", "Female"),
        
    age_cat5 = fct_relevel(
      age_cat5,
      "0-4", "5-9", "10-14", "15-19",
      "20-24", "25-29",  "30-34", "35-39",
      "40-44", "45-49", "50-54", "55-59",
      "60-64", "65-69", "70-74",
      "75-79", "80-84", "85")) %>% 
          
  arrange(Country, age_cat5, Sex)

ВНИМАНИЕ: Если у вас мало смертей на страту, рассмотрите возможность использования 10- или 15-летних категорий вместо 5-летних категорий возраста.

Загрузка референтной популяции

И последнее, для прямой стандартизации мы импортируем референтную популяцию (мировое “стандартное население” по полу)

# референтная популяция
standard_pop_data <- appliedepidata::get_data(name = "world_standard_population_by_sex")

Вычистка референтной популяции

Значения возрастных категорий в country_data и standard_pop_data необходимо унифицировать.

В настоящее время значения столбца age_cat5 в датафрейме standard_pop_data содержат слова “years” и “plus”, а в датафрейме country_data их нет. Нам нужно, чтобы значения возрастных категорий совпадали. Мы используем str_replace_all() из пакета stringr, как описано на странице Текст и последовательности, чтобы заменить эти комбинации символов на отсутствие пробела "".

Функция calculate_dsr() получает стандартное население через аргумент stdpop =, поэтому столбец может иметь любое имя. Мы переименовываем его в "pop", так как код ниже использует stdpop = pop.

# удаляем конкретную последовательность из значений столбца
standard_pop_clean <- standard_pop_data %>%
     mutate(
          age_cat5 = str_replace_all(age_cat5, "years", ""),   # удаляем "year"
          age_cat5 = str_replace_all(age_cat5, "plus", ""),    # удаляем "plus"
          age_cat5 = str_replace_all(age_cat5, " ", "")) %>%   # удаляем пробел " "
     
     rename(pop = WorldStandardPopulation)   # меняем имя столбца на "pop", этот столбец передаётся в stdpop = функции calculate_dsr()

ВНИМАНИЕ: Если вы будете пытаться использовать str_replace_all(), чтобы удалить символ плюс, она не сработает, поскольку это специальный символ. “Изолируйте” этот особый характер символа, поставив перед ним два обратных слэша, вот так str_replace_call(column, "\\+", "").

Создание набора данных со стандартным населением

Наконец пакет PHEindicatormethods, который де6тально описан ниже, ожидает присоединения стандартных популяций к данным о количестве случаев события и населении. Поэтому в этих целях мы создадим набор данных all_data.

all_data <- left_join(country_data, standard_pop_clean, by=c("age_cat5", "Sex"))

Этот полный набор данных выглядит следующим образом:

21.3 Пакет PHEindicatormethods

Мы рассчитываем стандартизированные коэффициенты с помощью пакета PHEindicatormethods. Этот пакет позволяет вам рассчитывать как прямые, так и косвенные стандартизированные коэффициенты. Мы покажем оба варианта.

В этом разделе используется датафрейм all_data, созданный в конце раздела Подготовка. Этот датафрейм включает населения стран, смерти и мировую стандартную референтную популяцию. Вы можете посмотреть это тут.

Прямые стандартизированные коэффициенты

Ниже мы сначала группируем данные по Стране, затем передаем их в функцию calculate_dsr(), чтобы получить прямые стандартизированные коэффициенты по странам.

Следует отметить, что calculate_dsr() требует, чтобы референтное (стандартное) население было указано как столбец внутри датафрейма для конкретной страны. Укажите имя этого столбца в аргументе stdpop =. В примере ниже это столбец pop.

См. справку с помощью ?calculate_dsr или ссылки в разделе Ресурсы для получения более подробной информации.

# Рассчитываем коэффициенты по стране, стандартизированные прямым образом по полу и возрасту
mortality_ds_rate_phe <- all_data %>%
     group_by(Country) %>%
     PHEindicatormethods::calculate_dsr(
          x = Deaths,                 # столбец с наблюдаемым количеством событий
          n = Population,             # столбец с нестандартным населением для каждой страты
          stdpop = pop)               # стандартное население для каждой страты

# Печать таблицы
knitr::kable(mortality_ds_rate_phe)
Country total_count total_pop value lowercl uppercl confidence statistic method
A 11344 86790567 23.56686 23.08107 24.05944 95% dsr per 100000 Dobson
B 9955 52898281 19.32549 18.45516 20.20882 95% dsr per 100000 Dobson

Косвенные стандартизированные коэффиенты

Для косвенной стандартизации вам нужна референтная популяция с количеством смертей и количеством населения на страту. В данном примере мы будем рассчитывать коэффициенты для Страны A, используя страну B в качестве референтной популяции, так как референтная популяция standard_pop_clean не включает количество смертей на страту.

Ниже мы сначала создаем референтную популяцию из страны B. Затем мы передаем данные о смертности и населении страны A, объединяем их с референтной популяцией и передаем в функцию calculate_ISRate(), чтобы получить косвенные стандартизированные коэффициенты. Конечно, можно сделать и наоборот.

Следует отметить - в примере ниже референтная популяция задается как отдельный датафрейм. В этом случае нужно убедиться, что векторы x =, n =, x_ref = и n_ref = все упорядочены по тем же значениям категории стандартизации (страты), что и в страновом датафрейме, так как сопоставление записей делается по позиции.

См. справку ?phr_isr или ссылки в разделе Ресурсы для получения дополнительной информации.

# Создаем референтную популяцию
refpopCountryB <- country_data %>% 
  filter(Country == "B") 

# Рассчитываем коэффициенты для страны А, косвенным образом стандартизированные по возрасту и полу
mortality_is_rate_phe_A <- country_data %>%
     filter(Country == "A") %>%
     PHEindicatormethods::calculate_ISRate(
          x = Deaths,                 # столбец с наблюдаемым количеством событий
          n = Population,             # столбец с нестандартным населением для каждой страты
          x_ref = refpopCountryB$Deaths,  # референтное количество смертей для каждой страты
          n_ref = refpopCountryB$Population)  # референтная популяция по каждой страте

# Печать таблицы
knitr::kable(mortality_is_rate_phe_A)
observed expected ref_rate value lowercl uppercl confidence statistic method
11344 15847.42 18.81914 13.47123 13.22446 13.72145 95% indirectly standardised rate per 100000 Byars

21.4 Ресурсы

Еще один пример использования PHEindicatormethods доступен на этом сайте

См. PHEindicatormethods справочный pdf файл