::p_load(
pacman# importar/exportar datos
rio, # localizar archivos
here, # limpieza de caracteres y cadenas
stringr, # necesario para dsr, para modelos frailty
frailtypack, # estandarizar tasas
dsr, # alternativa para la estandarización de tasas
PHEindicatormethods, # gestión y visualización de datos tidyverse)
21 Tasas estandarizadas
Esta página te mostrará dos formas de estandarizar un resultado, como las hospitalizaciones o la mortalidad, por características como la edad y el sexo.
- Uso del paquete dsr
- Uso del paquete PHEindicatormethods
Comenzamos demostrando ampliamente los procesos de preparación/limpieza/unión de datos, ya que esto es común cuando se combinan datos de población de múltiples países, datos de población estándar, defunciones, etc.
21.1 Resumen
Hay dos formas principales de estandarizar: la estandarización directa y la indirecta. Supongamos que queremos estandarizar la tasa de mortalidad por edad y sexo para el país A y el país B, y comparar las tasas estandarizadas entre estos países.
- Para la estandarización directa, tendrás que conocer el número de la población de riesgo y el número de defunciones para cada estrato de edad y sexo, para el país A y el país B. Un estrato en nuestro ejemplo podría ser el de las mujeres entre 15-44 años.
- Para la estandarización indirecta, sólo es necesario conocer el número total de defunciones y la estructura por edad y sexo de cada país. Por tanto, esta opción es factible si no se dispone de tasas de mortalidad específicas por edad y sexo o de cifras de población. La estandarización indirecta es, además, preferible en caso de números pequeños por estrato, ya que las estimaciones en la estandarización directa estarían influenciadas por una variación sustancial del muestreo.
21.2 Preparación
Para mostrar cómo se realiza la estandarización, utilizaremos recuentos ficticios de la población y de las defunciones del país A y del país B, por edad (en categorías de 5 años) y por sexo (femenino, masculino). Para que los datos estén listos para su uso, realizaremos los siguientes pasos de preparación:
- Cargar paquetes
- Cargar datos
- Unir los datos de población y mortalidad de los dos países
- Pivotar largo para que haya una fila por estrato de edad y sexo
- Limpiar la población de referencia (población estándar mundial) y unirla a los datos del país
En tu caso, los datos pueden tener un formato diferente. Tal vez esos datos sean por provincia, ciudad u otra zona de captación. Puede que tengas una fila para cada defunció e información sobre la edad y el sexo de cada una (o de una proporción significativa) de estas defunciones. En este caso, consulta las páginas sobre Agrupar de datos, Pivotar de datos y Tablas descriptivas para crear unos datos con recuentos de eventos y población por estrato de edad y sexo.
También necesitamos una población de referencia, la población estándar. Para los fines de este ejercicio utilizaremos la world_standard_population_by_sex
. La población estándar mundial se basa en las poblaciones de 46 países y se elaboró en 1960. Hay muchas poblaciones “estándar”; por ejemplo, el sitio web del NHS de Escocia ofrece bastante información sobre la población estándar europea, la población estándar mundial y la población estándar de Escocia.
Cargar paquetes
Este trozo de código muestra la carga de los paquetes necesarios para los análisis. En este manual destacamos p_load()
de pacman, que instala el paquete si es necesario y lo carga para su uso. También puedes cargar los paquetes instalados con library()
de R base. Consulta la página sobre fundamentos de R para obtener más información sobre los paquetes de R.
PRECAUCIÓN: Si tienes una versión más reciente de R, el paquete dsr no puede descargarse directamente de CRAN. Sin embargo, todavía está disponible en el archivo CRAN. Puedes instalar y utilizar éste.
Para los que no son usuarios de Mac:
<- "https://cran.r-project.org/src/contrib/Archive/dsr/dsr_0.2.2.tar.gz"
packageurl install.packages(packageurl, repos=NULL, type="source")
# Otra solución que puede funcionar
require(devtools)
::install_version("dsr", version="0.2.2", repos="http:/cran.us.r.project.org") devtools
Para los usuarios de Mac:
require(devtools)
::install_version("dsr", version="0.2.2", repos="https://mac.R-project.org") devtools
Cargar los datos de población
Consulta la página de descargando el manual y los datos para obtener instrucciones sobre cómo descargar todos los datos de ejemplo del manual. Puedes importar los datos de la página de estandarización directamente a R desde nuestro repositorio de Github ejecutando los siguientes comandos import()
:
# importa los datos demográficos del país A directamente de Github
<- import("https://github.com/epirhandbook/Epi_R_handbook/raw/master/data/standardization/country_demographics.csv")
A_demo
# importa las defunciones del país A directamente de Github
<- import("https://github.com/epirhandbook/Epi_R_handbook/raw/master/data/standardization/deaths_countryA.csv")
A_deaths
# importa los datos demográficos del país B directamente de Github
<- import("https://github.com/epirhandbook/Epi_R_handbook/raw/master/data/standardization/country_demographics_2.csv")
B_demo
# importa las defunciones del país B directamente de Github
<- import("https://github.com/epirhandbook/Epi_R_handbook/raw/master/data/standardization/deaths_countryB.csv")
B_deaths
# importa la población estándar mundial directamente de Github
<- import("https://github.com/epirhandbook/Epi_R_handbook/raw/master/data/standardization/world_standard_population_by_sex.csv") standard_pop_data
En primer lugar, cargamos los datos demográficos (recuentos de hombres y mujeres por categoría de edad de 5 años) de los dos países que vamos a comparar, “Country A” y “Country B”.
# País A
<- import("country_demographics.csv") A_demo
# País B
<- import("country_demographics_2.csv") B_demo
Cargar datos de defunciones
Convenientemente, también tenemos los recuentos de las defunciones durante el período de interés, por edad y sexo. Los recuentos de cada país están en un archivo separado, que se muestra a continuación.
Defunciones en Country A
Defunciones en Country B
Poblaciones y defunciones limpias
Necesitamos unir y transformar estos datos de la siguiente manera:
- Combinar las poblaciones de los países en un solo conjunto de datos y hacer un pivote “largo” para que cada estrato de edad y sexo sea una fila
- Combinar los recuentos de defunciones por país en un solo conjunto de datos y hacer un pivote “largo” para que cada estrato de edad y sexo sea una fila
- Unir las defunciones a las poblaciones
En primer lugar, combinamos los datos de las poblaciones de los países, los pivotamos “largo” y realizamos una pequeña limpieza. Para más detalles, consulta la página sobre pivotar datos.
<- A_demo %>% # comienza con el conjunto de datos del país A
pop_countries bind_rows(B_demo) %>% # une las filas, porque las columnas tienen el mismo nombre
pivot_longer( # pivota a lo largo
cols = c(m, f), # columnas para combinar en una sola
names_to = "Sex", # nombre de la nueva columna que contiene la categoría ("m" o "f")
values_to = "Population") %>% # nombre de la nueva columna que contiene los valores numéricos pivotados
mutate(Sex = recode(Sex, # valores recodificados para mayor claridad
"m" = "Male",
"f" = "Female"))
Los datos de población combinados tienen ahora este aspecto (clica para ver los países A y B):
Y ahora realizamos operaciones similares en los dos conjuntos de datos de defunciones.
<- A_deaths %>% # comienza con el conjunto de datos de defunciones del país A
deaths_countries bind_rows(B_deaths) %>% # une las filas con el conjunto de datos B, porque las cols tienen el mismo nombre
pivot_longer( # pivota a lo largo
cols = c(Male, Female), # columna a transformar en una sola
names_to = "Sex", # nombre de la nueva columna que contiene la categoría ("m" o "f")
values_to = "Deaths") %>% # nombre para la nueva columna que contiene los valores numéricos pivotados
rename(age_cat5 = AgeCat) # renombra para mayor claridad
Los datos de las defunciones tienen ahora este aspecto, y contienen datos de ambos países:
Ahora unimos los datos de defunciones y población basándonos en las columnas comunes Country
, age_cat5
, y Sex
. Esto añade la columna Deaths
.
<- pop_countries %>%
country_data left_join(deaths_countries, by = c("Country", "age_cat5", "Sex"))
Ahora podemos clasificar Sex
, age_cat5
, y Country
como factores y establecer el orden de los niveles utilizando la función fct_relevel()
del paquete forcats, como se describe en la página sobre Factores. Ten en cuenta que la clasificación de los niveles de los factores no cambia visiblemente los datos, pero el comando arrange()
los ordena por Country, age category, y sex.
<- 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)
PRECAUCIÓN: Si tienes pocas defunciones por estrato, considera la posibilidad de utilizar categorías de 10 o 15 años, en lugar de categorías de 5 años para la edad.
Carga de la población de referencia
Por último, para la estandarización directa, importamos la población de referencia (la “población estándar” mundial por sexo)
# Población de referencia
<- import("world_standard_population_by_sex.csv") standard_pop_data
Población de referencia limpia
Los valores de la categoría de edad en los dataframes country_data
y standard_pop_data
tendrán que estar alineados.
Actualmente, los valores de la columna age_cat5 del dataframe standard_pop_data
contienen la palabra “years” y “plus”, mientras que los del dataframe country_data
no. Tendremos que hacer coincidir los valores de la categoría de edad. Usamos str_replace_all()
del paquete stringr, como se describe en la página sobre Caracteres y cadenas, para reemplazar estos patrones sin espacio ""
.
Además, el paquete dsr espera que en la población estándar, la columna que contiene los recuentos se llame "pop"
. Así que cambiaremos el nombre de esa columna.
# Elimina una cadena específica de los valores de columna
<- standard_pop_data %>%
standard_pop_clean mutate(
age_cat5 = str_replace_all(age_cat5, "years", ""), # elimina "year"
age_cat5 = str_replace_all(age_cat5, "plus", ""), # elimina "plus"
age_cat5 = str_replace_all(age_cat5, " ", "")) %>% # elimina " " space
rename(pop = WorldStandardPopulation) # cambia el nombre de la columna por "pop", ya que es lo que espera el paquete dsr
PRECAUCIÓN: Si intentas utilizar str_replace_all()
para eliminar un símbolo de suma, no funcionará porque es un símbolo especial. “Escapa” de los símbolos especiales poniendo dos barras invertidas delante, como en str_replace_call(columna, "\\+", "")
.
Crear un conjunto de datos con una población estándar
Por último, el paquete PHEindicatormethods, que se detalla a continuación, espera que las poblaciones estándar se unan a los recuentos de eventos y poblaciones del país. Por lo tanto, crearemos un conjunto de datos all_data
con ese fin.
<- left_join(country_data, standard_pop_clean, by=c("age_cat5", "Sex")) all_data
Este conjunto de datos completo tiene el siguiente aspecto:
21.3 paquete dsr
A continuación mostramos el cálculo y la comparación de tasas estandarizadas directamente utilizando el paquete dsr. El paquete dsr permite calcular y comparar tasas estandarizadas directamente (¡no hay tasas estandarizadas indirectamente!).
En la sección de preparación de datos, hemos creado conjuntos de datos separados para los recuentos de países y la población estándar:
- el objeto
country_data
, que es una tabla de población con el número de habitantes y el número de defunciones por estrato por país - el objeto
standard_pop_clean
, que contiene el número de población por estrato para nuestra población de referencia, la población estándar mundial
Utilizaremos estos conjuntos de datos separados para el enfoque dsr.
Tasas estandarizadas
A continuación, calculamos las tasas por país directamente estandarizadas por edad y sexo. Utilizamos la función dsr()
.
Cabe destacar que dsr()
espera un dataframe para las poblaciones de los países y los recuentos de eventos (defunciones), y un dataframe separado con la población de referencia. También espera que en este conjunto de datos de la población de referencia el nombre de la columna de la unidad de tiempo sea “pop” (lo aseguramos en la sección de preparación de datos).
Hay muchos argumentos, como se anota en el código siguiente. En particular, el event =
se establece en la columna Deaths
, y fu =
(“seguimiento”) con la columna Population
. Establecemos los subgrupos de comparación como la columna Country
y estandarizamos en base a age_cat5
y Sex
. A estas dos últimas columnas no se les asigna un argumento con nombre concreto. Consulta ?dsr
para obtener más detalles.
# Calcula las tasas estandarizadas por el método directo por país por edad y sexo
<- dsr::dsr(
mortality_rate data = country_data, # especifica el objeto que contiene el número de defunciones por estrato
event = Deaths, # columna que contiene el número de defunciones por estrato
fu = Population, # columna que contiene el número de habitantes por estrato
subgroup = Country, # unidades que queremos comparar
# otras columnas - las tasas se estandarizarán por éstas
age_cat5,
Sex,refdata = standard_pop_clean, # conjunto de datos de la población de referencia, con la columna llamada pop
method = "gamma", # método para calcular el IC del 95%
sig = 0.95, # nivel de significación
mp = 100000, # queremos tasas por 100.000 habitantes
decimals = 2) # número de decimales)
# Imprimir la salida como una tabla HTML de aspecto agradable
::kable(mortality_rate) # muestra la tasa de mortalidad antes y después de la estandarización directa knitr
Subgroup | Numerator | Denominator | Crude Rate (per 1e+05) | 95% LCL (Crude) | 95% UCL (Crude) | Std Rate (per 1e+05) | 95% LCL (Std) | 95% UCL (Std) |
---|---|---|---|---|---|---|---|---|
A | 11344 | 86790567 | 13.07 | 12.83 | 13.31 | 23.57 | 23.08 | 24.06 |
B | 9955 | 52898281 | 18.82 | 18.45 | 19.19 | 19.33 | 18.46 | 20.22 |
Arriba, vemos que mientras Country A tenía una tasa de mortalidad bruta más baja que Country B, ahora tiene una tasa estandarizada más alta después de la estandarización directa por edad y sexo.
Razón de tasas estandarizadas
# Calcular el RR
<- dsr::dsrr(
mortality_rr data = country_data, # específica el objeto que contiene el número de defunciones por estrato
event = Deaths, # columna que contiene el número de defunciones por estrato
fu = Population, # columna que contiene el número de población por estrato
subgroup = Country, # unidades que queremos comparar
age_cat5,# características por las que queremos estandarizar
Sex, refdata = standard_pop_clean, # población de referencia, con números en la columna llamada pop
refgroup = "B", # referencia para la comparación
estimate = "ratio", # tipo de estimación
sig = 0.95, # nivel de significación
mp = 100000, # queremos tasas por 100.000 habitantes
decimals = 2) # número de decimales
# Imprimir tabla
::kable(mortality_rr) knitr
Comparator | Reference | Std Rate (per 1e+05) | Rate Ratio (RR) | 95% LCL (RR) | 95% UCL (RR) |
---|---|---|---|---|---|
A | B | 23.57 | 1.22 | 1.17 | 1.27 |
B | B | 19.33 | 1.00 | 0.94 | 1.06 |
La tasa de mortalidad estandarizada es 1,22 veces mayor en Country A en comparación con Country B (IC del 95%: 1,17-1,27).
Diferencia de tasas estandarizadas
# Calcular la DR
<- dsr::dsrr(
mortality_rd data = country_data, # específica el objeto que contiene el número de defunciones por estrato
event = Deaths, # columna que contiene el número de defunciones por estrato
fu = Population, # columna que contiene el número de población por estrato
subgroup = Country, # unidades que queremos comparar
# características por las que queremos estandarizar
age_cat5,
Sex, refdata = standard_pop_clean, # población de referencia, con números en la columna llamada pop
refgroup = "B", # referencia para la comparación
estimate = "difference", # tipo de estimación
sig = 0.95, # nivel de significación
mp = 100000, # queremos tasas por 100.000 habitantes
decimals = 2) # número de decimales
# Imprimir tabla
::kable(mortality_rd) knitr
Comparator | Reference | Std Rate (per 1e+05) | Rate Difference (RD) | 95% LCL (RD) | 95% UCL (RD) |
---|---|---|---|---|---|
A | B | 23.57 | 4.24 | 3.24 | 5.24 |
B | B | 19.33 | 0.00 | -1.24 | 1.24 |
El país A tiene 4,24 defunciones adicionales por cada 100.000 habitantes (IC del 95%: 3,24-5,24) en comparación con el país A.
21.4 Paquete PHEindicatormethods
Otra forma de calcular las tasas estandarizadas es con el paquete PHEindicatormethods. Este paquete permite calcular las tasas estandarizadas tanto directa como indirectamente. Mostraremos ambos métodos.
En esta sección se utilizará el dataframe all_data
creado al final de la sección Preparación. Este dataframe incluye las poblaciones de los países, los eventos de defunciones y la población de referencia mundial estándar. Puedes verlo aquí.
Tasas estandarizadas directamente
A continuación, primero agrupamos los datos por país y luego los pasamos a la función phe_dsr()
para obtener directamente las tasas estandarizadas por país.
Cabe destacar que la población de referencia (estándar) puede proporcionarse como una columna dentro del dataframe específico del país o como un vector separado. Si se proporciona dentro del dataframe específico del país, hay que establecer stdpoptype = "field"
. Si se proporciona como un vector, hay que establecer stdpoptype = "vector"
. En este último caso, hay que asegurarse de que el orden de las filas por estratos es similar tanto en el dataframe específico del país como en la población de referencia, ya que los registros se emparejarán por posición. En nuestro ejemplo siguiente, proporcionamos la población de referencia como una columna dentro del dataframe específico del país.
Consulta la ayuda de ?phr_dsr
o los enlaces de la sección Referencias para obtener más información.
# Calcula las tasas estandarizadas por el método directo por país por edad y sexo
<- all_data %>%
mortality_ds_rate_phe group_by(Country) %>%
::phe_dsr(
PHEindicatormethodsx = Deaths, # columna con el número observado de sucesos
n = Population, # columna con poblaciones no estándar para cada estrato
stdpop = pop, # poblaciones estándar para cada estrato
stdpoptype = "field") # cualquier "vector" para un vector independiente o "filed" significando poblaciones estándar en los datos
# Imprimir tabla
::kable(mortality_ds_rate_phe) knitr
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 |
Tasas estandarizadas indirectamente
Para la estandarización indirecta, se necesita una población de referencia con el número de defunciones y el número de población por estrato. En este ejemplo, calcularemos las tasas del país A utilizando el país B como población de referencia, ya que la población de referencia de standard_pop_clean
no incluye el número de defunciones por estrato.
A continuación, creamos primero la población de referencia del país B. Luego, pasamos los datos de mortalidad y población del país A, los combinamos con la población de referencia y los pasamos a la función calculate_ISRate()
, para obtener tasas estandarizadas indirectamente. Por supuesto, también se puede hacer a la inversa.
En nuestro ejemplo, la población de referencia se proporciona como un dataframe separado. En este caso, nos aseguraremos que los vectores x =
, n =
, x_ref =
y n_ref =
estén ordenados por los mismos valores de categoría de normalización (estrato) que los de nuestro dataframe específico del país, ya que los registros se emparejarán por posición.
Consulta la ayuda de ?phr_isr
o los enlaces de la sección Referencias para obtener más información.
# Crear población de referencia
<- country_data %>%
refpopCountryB filter(Country == "B")
# Calcular las tasas del país A estandarizadas indirectamente por edad y sexo
<- country_data %>%
mortality_is_rate_phe_A filter(Country == "A") %>%
::calculate_ISRate(
PHEindicatormethodsx = Deaths, # columna con el número observado de sucesos
n = Population, # columna con población no estándar para cada estrato
x_ref = refpopCountryB$Deaths, # número de defunciones de referencia para cada estrato
n_ref = refpopCountryB$Population) # población de referencia para cada estrato
# Imprimir tabla
::kable(mortality_is_rate_phe_A) knitr
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.5 Recursos
Si deseas ver otro ejemplo reproducible utilizando dsr, consulta esta viñeta
Si deseas ver otro ejemplo en el que se utilizan los métodos de PHEindicator, visita este sitio web
Ver el archivo pdf de referencia de PHEindicatormethods