Multimapa ODS

Introducción

En el marco de nuestro esfuerzo de poder dotar nuestra herramienta multipanel sobre ODS de un indicador fiable y unánimemente aceptado para medir el nivel de salud de una población, estamos testando la viabilidad de utilizar la Esperanza de Vida en los municipios par los que estén disponibles los microdatos de mortalidad (más de 10.000 hab.).

Para ello hemos adaptado el método de PHE, utilizando su Life Expectancy Calculator, básicamente limitando el último grupo de edad a más de 85 años en lugar de 90, siguiendo el criterio del Minsiterio de Sanidad (i el de la Conselleria de Sanitat en Catalunya).

El Life Expectancy Calculator de PHE

La aplicación creada por Public Health England utiliza le metodología de Sullivan(para saber más sobre esa metodología ver Health Expectancy Calculation by the Sullivan Method: A Practical Guide, C.Jagger, H.Van Oyen, J.M.Robine, 2014), como veremos, con algunas especificidaes. A partir de esta aplicación, que no es más que un workseet de Excel, PHE ha creado la función phe_life_expectancy() para poder utilizar la aplicación con R

La función phe_life_expectancy() para calcular la esperanza de vida se alinea pues con la metodología de la Calculadora de esperanza de vida de Public Health England’s (PHE)* disponible en la página web Fingertips Technical Guidance.

La función phe_life_expectancy() es para una tabla de vida abreviada que utiliza intervalos de edad de 5 años con un intervalo de edad final de más de 90 años. La tabla se ha completado utilizando los métodos descritos por Chiang. La Oficina Nacional de Estadística* (UK) utiliza esta estructura y metodología de edad para producir la esperanza de vida a nivel de autoridades nacionales y locales1.

La esperanza de vida no se puede calcular si los años persona, \(L_x\), en un intervalo de edad dado es 0. Tampoco se calculará si el total de años persona es inferior a 5,0, ya que se considera que éste es el tamaño mínimo para un cálculo robusto de la esperanza de vida2. Los recuentos de muertes cero no son un problema, salvo el intervalo de edad final: debe haber al menos una muerte en el intervalo final para que los cálculos sean posibles.

La metodología es pues la clásica para el cálculo de la Esperanza de Vida, con alguna peculiaridad respecto al método Sullivan. Una de esas la acabamos de ver y es la limitación a la edad de 90 años como último intervalo. Cosa que nos obligará a crear una función de R ad hoc para poder trabajar con intervalos diferentes: en España el Ministerio de Sanidad trabaja con la edad de 85 años como último intervalo.

Los pasos metodológicos para la creación de la tabla de vida

Analizando el PHE Calculator, hemos podido definir la metodología que utiliza, paso por paso, para crear la tabla de vida:

La función ax que indica como se distribuyen las muertes en cada período

Esta función puede calcularse con un plus de cálculo. Sin embargo -y esta es otra peculiaridad de la metodología PHE que permite simplificar el trabajo- sin perder precisión, En lugar de poner todos los valores de \(a_x\) iguales a 0.5, pone \(a_{x0}\) igual a 0.1 y el resto, iguales a 0.5, ya que es la configuración que aproximadamente suele generarse en la realidad.

Función amplitud del intervalo en años (nx)

La aplicación de PHE pone un primer intervalo = 1, a 0 años, un segundo = 4, de 1 a 4 años, y el resto de intervalos són quinquenales hasta el último que se pone así: \[n_\omega=\frac{\frac{1}{a_\omega}}{m_\omega}\]

Función de probabilidad de muerte (qx)

\[{}_nq_x=if({}_nd_x > \frac{\frac{P_x}{n_x}}{a_x})=> 1; else => \frac{n_x·{}_nm_x}{(1+n_x·(1-a_x)·{}_nm_x)}\] Última línia: \[q_\omega=1\]

Función de superviventes (lx): Los que sobreviven al principio del intervalo

\[l_x=(1-q_{x-1})·l_{x-1}\]

Función de defunciones en la cohorte hipotética durante el intervalo (dx)

Esa función no se utiliza en el método Sullivan:

\[d_x=l_x-l_{x+1}\]

La funció de anys persones (Lx)

\[L_x=n_x·(l_{x+1}+a_x·d_x)\]

Última línia: \[L_\omega=l_\omega /m_\omega\]

Funció nombre total d’anys persona

\[T_x=\sum_\omega^0l_x\]

Esperanza de vida (ex)

\[e_x=if(l_x=0)=>1;else=> \frac{T_x}{lx} \]

Càlculo de la esperanza de vida sobre datos del municipio de Barcelona con metodologia de PH England e intervalo abierto a partir de 85 años

A partir de aqui, vamos a manipular los datos de población i mortalidad para poderles aplicar las fórmulas explicadas.

Obtención y procesamiento de los datos para obtener una tabla de mortalitat para el municipio de Barcelona

Los datos de población año en año (2021 i 2022) se pueden descargar del IDESCAT.

Les defunciones por edad y sexo se pueden descargar en esta dirección del IDESCAT.

# ==================================================
# ESPERANÇA DE VIDA - CIUTAT DE BARCELONA - ANY 2021
# ==================================================

# Població estimada a 1 de juliol de 2012
bcnedat21 <- readxl::read_xlsx("INE_21-22_33721.xlsx",
                               skip = 8) %>% 
  filter(grepl("^[0-9]", ...1)) %>% 
  rename(Edat= ...1) %>% 
  mutate(Edat= as.integer(str_extract(Edat, "^[0-9]+")),
          Homes=(`1 de enero de 2022...4`+`1 de enero de 2021...5`) / 2,
          Dones=(`1 de enero de 2022...6`+`1 de enero de 2021...7`) / 2,
          Total=(`1 de enero de 2022...2`+`1 de enero de 2021...3`) / 2
         ) %>% 
  select(1,8:10)
    



bcnmort21 <- read.csv("t269mun_080193202100.csv",
                      sep = ";",
                      skip = 5,
                      header = TRUE) %>% 
    filter(grepl("^[0-9]", X)) %>% 
    rename(Edat= X) %>% 
    mutate(Edat= as.integer(str_extract(Edat, "^[0-9]+"))) %>% 
    #select(1,3) %>% 
    rename(Homes.def=Homes,
           Dones.def=Dones,
           Total.def=Total)

tabMort <- bcnmort21 %>% inner_join(bcnedat21, by= "Edat")

tabMort <- tabMort %>% mutate(catEdat= case_match(Edat,
                                                  0~ "0",
                                                  c(1:4)~ "01-04",
                                                  c(5:9)~ "05-09",
                                                  c(10:14)~ "10-14",
                                                  c(15:19)~ "15-19",
                                                  c(20:24)~ "20-24",
                                                  c(25:29)~ "25-29",
                                                  c(30:34)~ "30-34",
                                                  c(35:39)~ "35-39",
                                                  c(40:44)~ "40-44",
                                                  c(45:49)~ "45-49",
                                                  c(50:54)~ "50-54",
                                                  c(55:59)~ "55-59",
                                                  c(60:64)~ "60-64",
                                                  c(65:69)~ "65-69",
                                                  c(70:74)~ "70-74",
                                                  c(75:79)~ "75-79",
                                                  c(80:84)~ "80-84",
                                                  #c(85:89)~ "85-89",
                                                  .default = "85+"),
                              nx= case_match(Edat,  #nx: diff. amb grup successiu
                                                  0~ 1,
                                                  c(1:4)~ 4,
                                                  c(5:9)~ 5,
                                                  c(10:14)~ 5,
                                                  c(15:19)~ 5,
                                                  c(20:24)~ 5,
                                                  c(25:29)~ 5,
                                                  c(30:34)~ 5,
                                                  c(35:39)~ 5,
                                                  c(40:44)~ 5,
                                                  c(45:49)~ 5,
                                                  c(50:54)~ 5,
                                                  c(55:59)~ 5,
                                                  c(60:64)~ 5,
                                                  c(65:69)~ 5,
                                                  c(70:74)~ 5,
                                                  c(75:79)~ 5,
                                                  c(80:84)~ 5,
                                                  #c(85:89)~ 85,
                                                  .default = NA)) %>% 
    group_by(catEdat,nx) %>% 
    summarise(across(2:7, sum)) %>% 
    rename(age = catEdat) %>% 
    tidyr::pivot_longer(
      cols = 3:8, names_to = "cat", values_to = "value"
      ) %>%
    mutate(genere= str_extract(cat, "[^\\.]+"),
           cat = case_match(cat,
                            c("Homes.def", "Dones.def","Total.def")~ 
                              "Defuncions",
                            c("Homes","Dones","Total")~ "Pop")) %>% 
    tidyr::pivot_wider(names_from = cat, values_from = value)

tabMbcn <- tabMort %>% 
  mutate(ax= ifelse(age=="0",0.1,0.5),
         mx= Defuncions / Pop,
         nx= ifelse(age== "85+",  1/ax/mx, nx)) %>% 
  rename(ndx=Defuncions,
         Px=Pop)

tabMbcn %>% 
  DT::datatable() %>% 
  DT::formatCurrency(c('mx'), currency = "", dec.mark = ",", digits = 6)


Creación y aplicación de una función ad hoc para elaborar de la tabla de vida

Trabajando con muy pocas iteraciones no sería necesario crear una función ad hoc. Sin embargo, en el marco de nuestro trabajo de elaborar indicadores municipales este paso es importante. Para Catalunya, por ejemplo, habría que realizar más de 120 iteraciones (una para cada municipio de 10.000 habitantes del que están disponibles datos de mortalidad). Por ello hemos creado una fórmula que aplique pasa a paso la metodología PHE adaptándola a la especificidad que queremos obtener.

A bajo se encuentra la función exp_vida() que aplicaremos para obtener la Esperanza de Vida de Barcelona, permitiéndonos la iteración por genero.

#====================================
# FUNCION exp_vida()
# PARA EL CÁLCULO DE TABLAS DE VIDA
#====================================


exp_vida <- function(data, age, nx, ndx, ax, mx, Px) {
  
  # CALCULAR qx
  data$qx <- ifelse(ndx > data$Px/data$nx/data$ax, 1, 
                    data$nx*data$mx / (1 + (data$nx * (1-data$ax) * data$mx))
  )
  
  data$qx[nrow(data)] <- 1 # Sullivan
  
  #-----------------------------------------------------
  # CALCULAR lx
  
  # És praxi comuna començar amb una chort de 100.000
  data$lx <- c(100000, rep(NA,nrow(data)-1))
  
  for (i in 2:length(data$lx)) {
    data$lx[i] <- (1-data$qx[i-1])*data$lx[i-1]
  }
  
  #-----------------------------------------------------
  # CALCULAR dx
  
  data$dx <- c(rep(NA,nrow(data)))
  for (i in 1:length(data$dx)) {
    data$dx[i] <- round(data$lx[i] - data$lx[i+1])
  }
  
  # Todos los que sobreviven al principio mueren durant el intervalo
  data$dx[nrow(data)] <- 
    round(data$lx[nrow(data)])
  
  #-----------------------------------------------------
  # CALCULAR Lx
  
  data$Lx <- c(rep(NA, nrow(data)))
  for (i in 1:length(data$Lx)) {
    data$Lx[i] <- 
      data$nx[i] * (data$lx[i+1] +
                      data$ax[i] * data$dx[i])
  }
  
  # Última línia
  
  data$Lx[nrow(data)] <- 
    data$lx[nrow(data)] / data$mx[nrow(data)]
  
  #----------------------------------------------------
  # CALCULAR Tx
  
  data$Tx <- rev(cumsum(rev(data$Lx)))
  
  
  #---------------------------------------------------
  # ESPERANZA DE VIDA
  
  
  data$ex <- 
    round(ifelse(data$lx == 0, 1, data$Tx / data$lx),2)
  
  #----------------------------------------------------
  
return(data)
  
}

Creación de las tablas de vida por género, filtración de los datos referentes al primer año de vida y fusión en un solo dataframe

La función creada nos permite iterar por género usando lapply().

# Iteración de la función filtrando per sexp con 'lapply'

e0_Bcn <- lapply(unique(tabMbcn$genere), function(x) FUN= {
  filtre <- tabMbcn[tabMbcn$genere == x, ]
  exp_vida(
         data= filtre,
         age = filtre$age, 
         nx= filtre$nx, 
         ndx = filtre$ndx, 
         ax= filtre$ax,
         mx= filtre$mx,
         Px= filtre$Px
  )[1, ]
}) %>% 
  bind_rows()

e0_Bcn %>% 
  DT::datatable() %>% 
  DT::formatCurrency(
    columns=c('mx', 'qx'), currency = "", dec.mark = ",", digits= 6) %>% 
  #DT::formatRound(columns=c('Lx','Tx'), digits=0) %>% 
  DT::formatCurrency(
    c('Lx','Tx'), currency = "", interval = 3, mark = ".", dec.mark = ",",
    digits = 0) %>% 
   DT::formatCurrency(
     c('ax'), currency = "", dec.mark = ",", digits = 1) %>% 
   DT::formatCurrency(c('ex'), currency = "", dec.mark = ",", digits = 2)

Esperança de vida calculada

e0_Bcn %>% 
  select(1,3,13) %>% 
flextable() %>%
  width(width = 2) %>% 
  set_header_labels(
    age= "Edat", genere= "Gènere", ex= "Esperança de Vida"
    ) %>% 
  add_header_lines(
    "Esperança de vida al néixer - Ciutat de Barcelona - Any 2021 -Dades Calculades amb la metodologia 'PHE'"
   )

Esperança de vida al néixer - Ciutat de Barcelona - Any 2021 -Dades Calculades amb la metodologia 'PHE'

Edat

Gènere

Esperança de Vida

0

Homes

80.90

0

Dones

87.29

0

Total

84.27

EV Publicada per l’Ajuntament de Barcelona

Esperança de vida al néixer - Ciutat de Barcelona - Any 2021 - Dades publicades per l'Ajuntament de Barcelona

genere

value

dones

87.1

homes

80.9

total

84.2

Conclusión

La función creada nos va a permitir iterar los datos de mortalidad de los municipios catalanes para generar el indicador de esperanza de vida.


  1. Office for National Statistics Report. Life expectancy at birth by health and local authorities in the United Kingdom, 1998 to 2000 (3-year aggregate figures.) Health Statistics Quarterly 2002;13:83-90↩︎

  2. Toson B, Baker A. Life expectancy at birth: methodological options for small populations. National Statistics Methodological Series No 33. HMSO 2003.↩︎