Multimapa ODS

La taula de Vida com a base del càlcul de la Esperança de vida

La taula de vida Taula de Vida: definición y características, Flor de Liz Martínez, Santo Domingo 2015 és l’instrument bàsic per a l’explotació estadística de la informació biomètrica, ja que recull informació útil per calcular les probabilitats de mort i de supervivència dels individus de determinada població. Les taules de vida de la població estan generalment basades en taxes de mortalitat.

La taula de vida presenta una sèrie de tabulacions on es descriuen la probabilitat de morir, la taxa de mortalitat i el nombre de supervivents per edat o grup d’edat. Per tant, l’esperança de vida en néixer és una estimació basada en la taula de vida. Una taula de vida és un model teòric que descriu l’extinció d’una cohort hipotètica o fictícia. Permet determinar les probabilitats de sobreviure o morir a una edat exacta \(x\) o entre edats \(x\) i \(x+n\).

És un model teòric que descriu, numèricament, el procés d’extinció per mort d’un grup inicial, generalment una cohort de nadons (arrel de la taula –100,000 individus–).

Les taules de vida es caracteritzen per:

Normalment es creen taules de vida per a grups d’edat, on el grup més comú és quinquennal (cada 5 anys); no obstant això, a causa de les fortes diferències en mortalitat que es presenten els primers anys de vida, es recomana que el primer grup es presenti de forma individual, especialment als 0 i 1 anys.

Per construir una taula de mortalitat cal considerar una sèrie de funcions pel que fa a l’edat. Cadascuna d’aquestes funcions té moltes aplicacions dins del camp demogràfic. A continuació es detalla el comportament de cadascuna:

La funció d’edat (x)

La funció \(x\) en general s’inicia a les edats 0 i 1, per després continuar per quinquennis (5, 10, 15…) fins a l’edat límit de la població, que és l’edat en què desapareixen tots els individus de la població estudiada (màxima edat humanament possible) i es representa amb la lletra \(\omega\). Normalment \(\omega\) pot correspondre als 85, 90 o 95 anys.

Funció de supervivents (lx)

La funció \(l_x\) representa el nombre de persones de la generació inicial que van arribar amb vida a l’edat exacta \(x\). El valor \(l_0\) representa la mida de la cohort inicial (naixements) i es coneix com a “arrel de la taula”. Com que s’està treballant amb un model teòric, s’acostuma a treballar amb una arrel de 100.000 individus. Per tant, \(l_0\) = 100.000. D’altra banda, s’acostuma a representar amb \(\omega\) l’edat a què mor el darrer membre de la generació.

La funció \(lx\), tal com s’ha definit, es pot interpretar també com la probabilitat d’arribar amb vida a l’edat \(x\) per cada 100,000 habitants. Per exemple, si \(l_20\) = 88.712 individus, aleshores es pot dir que la probabilitat d’arribar amb vida als 20 anys és de 0,8871 = 88,71%.

La funció de supervivents amb el mètode Sullivan

Per aquesta i altres funcions hem seguit també el métode Sullivan utilitzant com a referència Health Expectancy Calculation by the Sullivan Method: A Practical Guide, C.Jagger, H.Van Oyen, J.M.Robine, 2014.

El farem servir perquè és àmpliament utilitzat i acceptat a nivell europeu.

Del mètode Sullivan emprarem les metodologies explicades per a les taules de mortalitat per grups d’edat, on el primer quinquenni es divideix normalment en dos períodes: un primer per a l’any 0 i un segon per al període 1-4. En aquest mètode es posa el darrer període \(n_{85}=10\).

Treballant amb aquest mètode és important tenir en compte la llargada en anys del període, \(n_x\) i les possibles variacions de la mortalitat dins del periode, que s’expliquen amb \(a_x\). Nosaltres adoptarem un valor constant d’\(a_x\) dins de cada període, 0.5, assumuint que la mortalitat s’hi distribueixi de manera homogénea.

En aquest cas \(l_x\) s’obté de de \(q_x\) línia a línia, assignant el valor de 100000 a la primera: \[l_x=l_{x-1}-(q_{x-1}·l_{x-1})\] En aquest cas no hi ha diferències entre taules anuals i taules plorianuals.

La funció de defuncions (dx)

La funció \(d_x\) representa el nombre de defuncions de la generació inicial ocorregudes entre les edats \(x\) i \(x+1\) (el nombre d’individus d’edat \(x\) que moren sense assolir l’edat \(x+1\)). Cal observar que aquestes defuncions corresponen a una cohort hipotètica, per la qual cosa se’ls anomena defuncions de la taula a diferència de les defuncions observades a la població real. De tot això es dedueix la fórmula \[d_x = l_x - l_{x+1}\] sabent que treballem amb edats simples (0, 1, 2, 3…). Quan es treballa amb grups d’edats, la funció de defuncions es denota amb \(ndx\), on \(n\) representa el nombre d’anys del grup (generalment s’utilitzen grups quinquennals –0, 1, 5, 10…–). S’interpreta com el nombre de defuncions de la generació inicial ocorregudes entre les edats \(x\) i \(x+n\). En aquest cas, la funció de defuncions es pot calcular mitjançant la fórmula \[ndx = lx - lx+n\] Per exemple, per la taula d’edats simples: \[d_0 = l_0 - l_{0+1} = l_0 - l_1 = 100000 - 99680 = 320\] \[d_1 = l_1 - l_{1+1} = l_1 - l_2 = 99680 - 99665 = 15\] \[d_2 = l_2 - l_{2+1} = l_2 - l_3 = 99665 - 99648 = 17\] … fins a \(l_{\omega}\).

I per a grups d’edat:

\({}_5d_0 = l_0 - l_{0+5} = l_0 – l_5 = 100000 - 99604 = 396\) \({}_5d_5 = l_5 – l_{5+5} = l_5 – l_{10} = 99604 - 99573 = 31\) 5d10 = l10 – l10+5 = l10 – l15 = 99573 - 99496 = 77

… fins a \({}_5d_{\omega}\).

La funció de probabilitat de mort (qx)

La taula de vida compta amb dues funcions de probabilitat binomial, és a dir, exhibeix dos i només dos resultats possibles, representats per la funció de probabilitat de mort (\(q_x\)) i la funció de probabilitat de vida (\(p_x\)):

La Funció de probabilitat de mort (\(q_x\)) representa la probabilitat associada al fet que una persona pertanyent a la cohort hipotètica mori a l’edat complerta \(x\) (mori l’any comprès entre edats \(x\) i \(x+1\)). D’acord amb el concepte de probabilitat, \(q_x\) és una relació entre \(d_x\) i \(l_x\), és a dir, una relació entre els casos desfavorables (defuncions ocorregudes a l’edat complerta \(x\)) i el total de casos (supervivents a l’edat \(x\)). Es denota per: \[q_x=\frac{d_x}{l_x}\]

Quan es treballa amb grups d’edats, la probabilitat de mort entre les edats \(x\) i \(x+n\) es representa amb \({}_nq_x\) i es calcula amb la fórmula: \[{}_nq_x= \frac{{}_nd_x}{l_x}\]

La funció probabilitat de la mort amb el mètode Sullivan

A partir de les taxes de mortalitat també podem calcular la probabilitat (condicional a haver sobreviscut) de mort en l’interval d’edat fins al començament de l’interval, \({}_nq_x\) (semplificarem la notació per evitar ambigüitats): \[q_x= \frac{n_x·m_x}{(1+n_x·0.5·m_x)}\] Nota: \(a_x=0.5\). El darrer període es posa igual a 1.

Funció de anys apersones d’edat “x” (Lx)

Funció Lx amb mètode Sullivan

\(L_x\) és el nombre de persones anys viscuts a l’edat \(x\).

En el cas de considerar \(a_x=0.5\), la fórmula seria:

\[L_x=n_x·0.5·l_x + n_x·0.5·l_{x+1}\] \[L_x=n_x·\frac {l_x + l_{x+1}}{2}\]

Funció de la taxa de mortalitat mitjana per a l’edat complerta “x” (mx)

\(m_x\) Representa la proporció mitjana d’individus que moriran per cada mil habitants dins una població, durant el trànsit entre els anys \(x\) i \(x+1\). D’acord amb això, \(m_x\) és una relació entre \(d_x\) i \(L_x\) per mil, és a dir, una relació entre els casos desfavorables (defuncions ocorregudes a l’edat complerta \(x\)) i la mitjana de casos (població censal a l’edat \(x\)) per cada mil habitants. Es calcula amb la fórmula \[m_x = \frac{d_x}{L_x} · 1000\] per a les edats simples; i \[m_x =\frac{{}_nd_x}{L_x} · 1000\] per als grups dedats.

Funció nombre total d’anys persona (Tx)

\(T_x\) és el nombre total d’anys persona (anys viscuts per cada persona) viscuts per la cohort des de l’edat \(x\) fins que tots els membres de la cohort han mort. Aquesta és la suma de nombres de la columna \(L_x\) des de l’edat \(x\) fins a l’última fila de la taula. Quan es calcula la EV en néixer és tota la columna \(L_x\).

\[T_x=\sum_x^\omega l_x\]

Funció de l’esperança de vida a l’edat “x” (ex)

\(e_x\) També anomenada expectativa de vida. Representa el nombre mitjà d’anys que resta per viure als \(l_x\) supervivents a una edat \(x\). Per a la cohort inicial \(l_0\) s’obté la funció \(e_0\), que representa l’esperança de vida en néixer. De manera general, es calcula mitjançant la fórmula: \[e_x= 0.5+\frac{\sum_\omega^xl_{x+n}}{l_x}=0.5+\frac{l_{x+1n}+l_{x+2n}...l_\omega}{l_x}\] Per exemple, per a una taula d’edats simples, imaginem una situació en què la totalitat de la cohort inicial mor als tres anys (\(x=0; \omega=3; n=1\)). Aleshores, per obtenir l’esperança de vida en néixer, el càlcul seria:

\[e_0=0.5+\frac{l_1+l_2+l_3}{l_0}\]

Esperança de vida amb taula abreujada

La fórmula anterior és aplicable a les taules completes de mortalitat, on es tenen valors per a totes les edats simples. En cas que la taula disponible sigui només una taula abreujada, cal tenir en compte les amplituds dels intervals entre edat.

El més corrent són les taules amb intervals quinquennals però amb especificació de la mortalitat del primer any i dels quatre següents, així com un interval obert al final (p. ex. 85 i més). Suposant que es compleix en tots els intervals d’edat la distribució lineal de les defuncions, els nens morts abans d’1 any viurien una mitjana de 0.5, els morts en les quatre edats següents viurien una mitjana de 2 anys i els restants una mitjana de 2,5 (en canvi els supervivents en començar l’interval obert viure a un nombre mitjà d’anys de vida que caldrà obtenir per altres mitjans o que es pot suposar de manera aproximada, ja que l’impacte de la seva determinació sobre l’ajust final dels resultats és escàs, especialment quan es calcula esperança de vida en néixer).

la fórmula de la ev per intervals és:

\[e_0=0.5+\frac{2.5· l_1+4.5·l_5+5·(l_{10}+l_{15}+l_{20}....)}{l_0} \]

Esperança de vida amb el mètode Sullivan

També es pot trobar en molts recursos; per exemple Life Expectancy Project:

\[e_x = \frac{T_x} {l_x}\]

El càlcul de l’esperança de vida amb R

Amb el package PHEindicatormethods i la funció phe_life_expectancy

El paquet R “PHEindicatormethods” té diverses funcions basades en els mètodes estadístics utilitzats per als indicadors que els analistes poden utilitzar per calcular:

  • proporcions
  • tarifes
  • tarifes estandarditzades
  • mitjanes
  • esperança de vida
  • índex de la desigualtat
  • intervals de confiança per a aquestes estadístiques
  • assignació de dades a quantils

Aquesta funció s’alinea amb la metodologia de la Calculadora d’esperança de vida de Public Health England’s (PHE) disponible a la pàgina web Fingertips Technical Guidance.

La funció phe_life_expectancy() és per a una taula de vida abreujada que utilitza intervals d’edat de 5 anys amb un interval d’edat final de més de 90 anys. La taula s’ha completat utilitzant els mètodes descrits per Chiang. L’Oficina Nacional d’Estadística (UK) utilitza aquesta estructura i metodologia d’edat per produir l’esperança de vida a nivell d’autoritats nacionals i locals1.

L’esperança de vida no es pot calcular si els anys persona en un interval d’edat donat és zero. Tampoc es calcularà si el total d’anys persona és inferior a 5,0, ja que es considera que aquesta és la mida mínima per a un càlcul robust de l’esperança de vida2. Els recomptes de morts zero no són un problema, tret de l’interval d’edat final: hi ha d’haver almenys una mort a l’interval de més de 90 perquè els càlculs siguin possibles.

Càlcul de l’Esperança de vida sobre dades del municipi de Barcelona amb llibreria PHEindicatormethods de PH England

EV Calculada

#---------------------------------------------------
# PROVA PREVIA DE FIABILITAT
#---------------------------------------------------
# ==================================================
# 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)
    



bcnedat21 <- readxl::read_xlsx("pmh-1180-8078-mun (1).xlsx",
                               sheet = 2,
                               skip = 1) %>% 
    filter(grepl("^[0-9]", ...1)) %>% 
    rename(Edat= ...1) %>% 
    mutate(Edat= as.integer(str_extract(Edat, "^[0-9]+")))

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 = "90 +"),
                              edats= case_match(Edat,
                                                  0~ 0,
                                                  c(1:4)~ 1,
                                                  c(5:9)~ 5,
                                                  c(10:14)~ 10,
                                                  c(15:19)~ 15,
                                                  c(20:24)~ 20,
                                                  c(25:29)~ 25,
                                                  c(30:34)~ 30,
                                                  c(35:39)~ 35,
                                                  c(40:44)~ 40,
                                                  c(45:49)~ 45,
                                                  c(50:54)~ 50,
                                                  c(55:59)~ 55,
                                                  c(60:64)~ 60,
                                                  c(65:69)~ 65,
                                                  c(70:74)~ 70,
                                                  c(75:79)~ 75,
                                                  c(80:84)~ 80,
                                                  c(85:89)~ 85,
                                                  .default = 90)) %>% 
    group_by(catEdat,edats) %>% 
    summarise(across(2:7, sum)) %>% 
    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)
    
le_bcn_2021 <- tabMort %>% 
  group_by(genere) %>% 
  phe_life_expectancy(deaths = Defuncions, 
                    population = Pop, 
                    startage = catEdat,
                    age_contents = unique(tabMort$catEdat),
                    le_age = "0") %>%  # Esperança de vida al néixer
  select(2:8)




flextable(le_bcn_2021[,-1]) %>%
  add_header_lines(
    "Esperança de vida al néixer - Ciutat de Barcelona - Any 2021 -Dades Calculades amb la libreria 'PHEindicatormethods'"
   )

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

genere

value

lowercl

uppercl

pops_used

dths_used

Dones

86.90808

86.63929

87.17687

857,988

8,369

Homes

80.76032

80.46297

81.05768

778,744

7,868

Total

84.01491

83.80939

84.22042

1,636,732

16,237

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

Estimació de l’esperança de vida amb el package poputils

Referències: Bryant J (2024). poputils Demographic Analysis and Data Manipulation. R package version 0.3.4*, https://github.com/bayesiandemography/poputils.

# LLIBRERIA poputils
#--------------------

#install.packages("poputils")
library(poputils)


tabMort2 <- tabMort %>% 
  mutate(mx= Defuncions / Pop)

tabMort2 %>% 
  group_by(genere) %>% 
  select(1,3,4,5,6) %>% 
  lifeexp(mx=mx,
          age = catEdat,
          at=0
          ) %>% 
  flextable() %>%
  width(width = 2.5) %>% 
  add_header_lines(
    "Esperança de vida al néixer - Ciutat de Barcelona - Any 2021 -Dades Calculades amb la libreria 'poputils' per a manipulació i anàlisi de dades demogràfiques - Grup final 90+"
   )

Esperança de vida al néixer - Ciutat de Barcelona - Any 2021 -Dades Calculades amb la libreria 'poputils' per a manipulació i anàlisi de dades demogràfiques - Grup final 90+

genere

ex

Homes

80.72191

Dones

86.88569

Total

83.98648

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+"),
                              edats= case_match(Edat,
                                                  0~ 0,
                                                  c(1:4)~ 1,
                                                  c(5:9)~ 5,
                                                  c(10:14)~ 10,
                                                  c(15:19)~ 15,
                                                  c(20:24)~ 20,
                                                  c(25:29)~ 25,
                                                  c(30:34)~ 30,
                                                  c(35:39)~ 35,
                                                  c(40:44)~ 40,
                                                  c(45:49)~ 45,
                                                  c(50:54)~ 50,
                                                  c(55:59)~ 55,
                                                  c(60:64)~ 60,
                                                  c(65:69)~ 65,
                                                  c(70:74)~ 70,
                                                  c(75:79)~ 75,
                                                  c(80:84)~ 80,
                                                  #c(85:89)~ 85,
                                                  .default = 85)) %>% 
    group_by(catEdat,edats) %>% 
    summarise(across(2:7, sum)) %>% 
    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)


tabMort2 <- tabMort %>% 
  mutate(mx= Defuncions / Pop,
         age= factor(catEdat))

tabMort2 %>% 
  group_by(genere) %>% 
  lifeexp(mx=mx,
          age = age,
          at=0
          ) %>% 
  flextable() %>%
  width(width = 2.5) %>% 
  add_header_lines(
    "Esperança de vida al néixer - Ciutat de Barcelona - Any 2021 -Dades Calculades amb la libreria 'poputils' per a manipulació i anàlisi de dades demogràfiques - Grup final 85+"
   )

Esperança de vida al néixer - Ciutat de Barcelona - Any 2021 -Dades Calculades amb la libreria 'poputils' per a manipulació i anàlisi de dades demogràfiques - Grup final 85+

genere

ex

Homes

80.86253

Dones

87.26159

Total

84.23899

Taula de vida: genere femení

tabfem <- tabMort2[, c(7,3:6)] %>%
  filter(genere== "Dones") %>% 
  lifetab(mx=mx,
          age=age)

tabfem
## # A tibble: 19 × 9
##    age   genere Defuncions   Pop       qx      lx      dx      Lx    ex
##    <fct> <chr>       <dbl> <dbl>    <dbl>   <dbl>   <dbl>   <dbl> <dbl>
##  1 0     Dones           9  5456 0.00165  100000    165.   99918. 87.3 
##  2 01-04 Dones           6 24138 0.000994  99835.    99.2 399142. 86.4 
##  3 05-09 Dones           4 32711 0.000611  99736.    61.0 498527. 82.5 
##  4 10-14 Dones           1 33540 0.000149  99675.    14.9 498338. 77.5 
##  5 15-19 Dones           2 33995 0.000294  99660.    29.3 498227. 72.5 
##  6 20-24 Dones           7 40976 0.000854  99631.    85.1 497941. 67.6 
##  7 25-29 Dones           6 59155 0.000507  99546.    50.5 497603. 62.6 
##  8 30-34 Dones          14 62517 0.00112   99495.   111.  497198. 57.7 
##  9 35-39 Dones          29 61432 0.00236   99384.   234.  496334. 52.7 
## 10 40-44 Dones          43 64441 0.00333   99150.   330.  494922. 47.8 
## 11 45-49 Dones          56 62744 0.00445   98819.   440.  492996. 43.0 
## 12 50-54 Dones          93 58082 0.00797   98379.   784.  489933. 38.2 
## 13 55-59 Dones         124 56845 0.0108    97595.  1059.  485323. 33.5 
## 14 60-64 Dones         234 52654 0.0220    96536.  2121.  477358. 28.8 
## 15 65-69 Dones         300 46209 0.0319    94415.  3016.  464494. 24.4 
## 16 70-74 Dones         466 45395 0.0500    91399.  4573.  445466. 20.1 
## 17 75-79 Dones         655 38970 0.0806    86826.  6999.  416390. 16.0 
## 18 80-84 Dones        1022 31207 0.151     79828. 12057.  368173. 12.2 
## 19 85+   Dones        5298 47521 1         67770. 67770.  607874.  8.97
ex1 <- (0.5+
          (2.5*tabfem$lx[1]+4.5*tabfem$lx[2]+sum(5*tabfem$lx[3:19])))/
  tabfem$lx[1]
ex1
## [1] 87.38484
tabfem2 <- tabfem %>% 
    mutate(Tx= ifelse(!is.na(sum(Lx)-lag(cumsum(Lx))),
                      sum(Lx)-lag(cumsum(Lx)), sum(Lx)),
           ex2= Tx/lx)

tabfem2 # ex2 (mètode Tx/Lx) coincideix 100%
## # A tibble: 19 × 11
##    age   genere Defuncions   Pop      qx     lx     dx     Lx    ex     Tx   ex2
##    <fct> <chr>       <dbl> <dbl>   <dbl>  <dbl>  <dbl>  <dbl> <dbl>  <dbl> <dbl>
##  1 0     Dones           9  5456 1.65e-3 1   e5 1.65e2 9.99e4 87.3  8.73e6 87.3 
##  2 01-04 Dones           6 24138 9.94e-4 9.98e4 9.92e1 3.99e5 86.4  8.63e6 86.4 
##  3 05-09 Dones           4 32711 6.11e-4 9.97e4 6.10e1 4.99e5 82.5  8.23e6 82.5 
##  4 10-14 Dones           1 33540 1.49e-4 9.97e4 1.49e1 4.98e5 77.5  7.73e6 77.5 
##  5 15-19 Dones           2 33995 2.94e-4 9.97e4 2.93e1 4.98e5 72.5  7.23e6 72.5 
##  6 20-24 Dones           7 40976 8.54e-4 9.96e4 8.51e1 4.98e5 67.6  6.73e6 67.6 
##  7 25-29 Dones           6 59155 5.07e-4 9.95e4 5.05e1 4.98e5 62.6  6.23e6 62.6 
##  8 30-34 Dones          14 62517 1.12e-3 9.95e4 1.11e2 4.97e5 57.7  5.74e6 57.7 
##  9 35-39 Dones          29 61432 2.36e-3 9.94e4 2.34e2 4.96e5 52.7  5.24e6 52.7 
## 10 40-44 Dones          43 64441 3.33e-3 9.91e4 3.30e2 4.95e5 47.8  4.74e6 47.8 
## 11 45-49 Dones          56 62744 4.45e-3 9.88e4 4.40e2 4.93e5 43.0  4.25e6 43.0 
## 12 50-54 Dones          93 58082 7.97e-3 9.84e4 7.84e2 4.90e5 38.2  3.76e6 38.2 
## 13 55-59 Dones         124 56845 1.08e-2 9.76e4 1.06e3 4.85e5 33.5  3.27e6 33.5 
## 14 60-64 Dones         234 52654 2.20e-2 9.65e4 2.12e3 4.77e5 28.8  2.78e6 28.8 
## 15 65-69 Dones         300 46209 3.19e-2 9.44e4 3.02e3 4.64e5 24.4  2.30e6 24.4 
## 16 70-74 Dones         466 45395 5.00e-2 9.14e4 4.57e3 4.45e5 20.1  1.84e6 20.1 
## 17 75-79 Dones         655 38970 8.06e-2 8.68e4 7.00e3 4.16e5 16.0  1.39e6 16.0 
## 18 80-84 Dones        1022 31207 1.51e-1 7.98e4 1.21e4 3.68e5 12.2  9.76e5 12.2 
## 19 85+   Dones        5298 47521 1   e+0 6.78e4 6.78e4 6.08e5  8.97 6.08e5  8.97

Aquí a dalt tenim les esperances de vida calculades per poputils. Veiem com el càlcul de l’EV es realitza primer calculant \(T_x\) a partir de \(L_x\) i després aplicant la fórmula \(EV=\frac{T_x}{l_x}\), tal com s’explica a en la introducció teòrica.

a <- tabMort2 %>% 
  group_by(genere) %>% 
  lifeexp(mx=mx,
          age = age,
          at=0
          )
b <- aj2021

dif_h <- abs(round(a[1,2]-b[2,2],2))[[1]]
dif_d <- abs(round(a[2,2]-b[1,2],2))[[1]]
dif_t <- abs(round(a[3,2]-b[3,2],2))[[1]]

Es comprova una diferència mínima amb l’Esperança de Vida calculada per l’Agència de Salut de Barcelona (homes: 0.04 anys, dones: 0.16 anys, total: 0.04 anys) i el mètode poputils amb grup final de 85 anys. Amb la qual cosa, deduim que la metodologia emprada per aquest organisme es basa en la creació de 19 grups d’edat amb el grup final a 85 anys. Que és exactament la metodologia emprada pel Ministerio de Sanidad, en el seu informe Esperanzas de vida en España, 2022. Madrid: Ministerio de Sanidad, 2024*.

Creació de la taula de vida càlcul de l’EV seguint el mètode Sullivan

Comprovem el funcionament de la llibreria poputils aplicant el mètode Sullivan i comparant la taula obtinguda amb la que s’acaba de construir per a la mortalitat de la població femenina de Barcelona l’any 2021.

rawtab <- tabMort2[, c(7,3:6)] %>% 
  filter(genere== "Dones") %>% 
  mutate(nx= case_match(as.character(age),
                        "0"~ '1',
                        "01-04"~ '4',
                        .default = as.character('5')),
         nx= as.integer(nx)) %>% #indica l'amplada dels intervals
  select(1,6,3:5) %>% 
  rename(def= Defuncions,
         pop=Pop)
rawtab[nrow(rawtab), ][2] <- 10 # Sullivan pàg. 16, punt 3.)


# Calcular qx (Sullivan pàg 16 punt 3.)
rawtab2 <- rawtab %>% mutate(
    qx= nx*mx / (1+nx*0.5*mx), # Mètode sullivan pàg. 16. (3)
    )

rawtab2$qx[19] <- 1 # Sullivan

# Calcular lx (Sullivan pàg. 6 punt 3.)

rawtab2$lx <- c(100000, rep(NA,18))
for (i in 2:length(rawtab2$lx)) {
  rawtab2$lx[i] <- rawtab2$lx[i-1]-(rawtab2$qx[i-1]*rawtab2$lx[i-1])
} # Diferència en els darrers rows amb poputils perquè aquest fa els càlculs sobre les quantitats arrodonides

#rawtab2$dx <- c(rep(NA,19))

#for (i in 1:length(rawtab2$dx)) {
#  rawtab2$dx[i] <- ifelse(is.na(rawtab2$lx[i]-rawtab2$lx[i+1]), # last row
#                          rawtab2$lx[i],
#                          rawtab2$lx[i]-rawtab2$lx[i+1])
#}


# Calcular LX (Sullivan pàg. 17 punt 5.)

rawtab2$Lx <- c(rep(NA, 19))
for (i in 1:length(rawtab2$Lx)) {
  rawtab2$Lx[i] <- ifelse(
    is.na(rawtab2$nx[i]*0.5*rawtab2$lx[i]+
    rawtab2$nx[i]*0.5*rawtab2$lx[i+1]),
      rawtab2$lx[i] / rawtab2$mx[i],
    rawtab2$nx[i]*0.5*rawtab2$lx[i]+
    rawtab2$nx[i]*0.5*rawtab2$lx[i+1]
  )
}

# Calcular Tx (Sullivan pàg. 5 punt 5.)

rawtab2$Tx <- rev(cumsum(rev(rawtab2$Lx)))

# Calcular esperana de vida (Sullivan pàg. 5 punt 6.)

rawtab2$ex <- rawtab2$Tx / rawtab2$lx


rawtab2
## # A tibble: 19 × 10
##    age      nx   def   pop        mx       qx      lx      Lx       Tx    ex
##    <fct> <int> <dbl> <dbl>     <dbl>    <dbl>   <dbl>   <dbl>    <dbl> <dbl>
##  1 0         1     9  5456 0.00165   0.00165  100000   99918. 8727023. 87.3 
##  2 01-04     4     6 24138 0.000249  0.000994  99835. 399142. 8627105. 86.4 
##  3 05-09     5     4 32711 0.000122  0.000611  99736. 498527. 8227963. 82.5 
##  4 10-14     5     1 33540 0.0000298 0.000149  99675. 498338. 7729435. 77.5 
##  5 15-19     5     2 33995 0.0000588 0.000294  99660. 498227. 7231097. 72.6 
##  6 20-24     5     7 40976 0.000171  0.000854  99631. 497942. 6732870. 67.6 
##  7 25-29     5     6 59155 0.000101  0.000507  99546. 497603. 6234928. 62.6 
##  8 30-34     5    14 62517 0.000224  0.00112   99495. 497198. 5737326. 57.7 
##  9 35-39     5    29 61432 0.000472  0.00236   99384. 496334. 5240128. 52.7 
## 10 40-44     5    43 64441 0.000667  0.00333   99150. 494923. 4743794. 47.8 
## 11 45-49     5    56 62744 0.000893  0.00445   98819. 492997. 4248871. 43.0 
## 12 50-54     5    93 58082 0.00160   0.00797   98379. 489936. 3755874. 38.2 
## 13 55-59     5   124 56845 0.00218   0.0108    97595. 485328. 3265938. 33.5 
## 14 60-64     5   234 52654 0.00444   0.0220    96536. 477377. 2780610. 28.8 
## 15 65-69     5   300 46209 0.00649   0.0319    94415. 464534. 2303233. 24.4 
## 16 70-74     5   466 45395 0.0103    0.0500    91399. 445560. 1838699. 20.1 
## 17 75-79     5   655 38970 0.0168    0.0807    86825. 416619. 1393139. 16.0 
## 18 80-84     5  1022 31207 0.0327    0.151     79823. 368909.  976521. 12.2 
## 19 85+      10  5298 47521 0.111     1         67741. 607611.  607611.  8.97

Aplicació de la llibreria poputils per calcular l’esperança de vida en néixer dels municipis catalans que disposin de dades de mortalitat

# ===============================================================
# ===============================================================
# ESPERANÇA DE VIDA AL NÉIXER - MUNICIPIS DE CATALUNYA - ANY 2022
# ===============================================================
# ===============================================================

# DADES - MORTALITAT PER EDATS - MUNICIPIS DE CATALUNYA ANY 2022

# ===============================================================
#----------------------------------------------------------------
# MODALITAT DADES PUBLICADES IDESCAT/INE
#----------------------------------------------------------------

# Lectura fitxer mortalitat per edats i per municipi

# mortCat22 <- read.csv("t269munc3_mort_2022.csv",
#         skip = 6,
#         header = TRUE,
#         sep = ";") %>% 
#    slice(1:67) %>% 
#    select(1:103) %>% 
#    tidyr::pivot_longer(3:103) %>% 
#    mutate(name= str_extract(name, "X[0-9]+"),
#           name= as.integer(str_extract(name, "[0-9]+")),
#           Codi= str_sub(Codi, 2,6))

#names(mortCat22) <- c("ine", "Municipio", "age", "Defuncions")

#---------------------------------------------------------------
# MODALITAT MICRODADES
#-------------------------------------------------------------

mortalitat22 <- read.csv("taulesMun/mortalidad_2022.csv",
         header = TRUE,
         sep = ",")
mort22 <- mortalitat22 %>% 
  select(3:7,9:11) %>% 
  filter(!is.na(CMUNRE)) %>% 
  mutate(CPRORE= str_pad(as.character(CPRORE), 
                        width= 2,side = "left", pad = "0"),
         CMUNRE= str_pad(as.character(CMUNRE), 
                        width= 3,side = "left", pad = "0"),
         ine=paste0(CPRORE,CMUNRE),
         age= AÑOSC # Años cumplidos
         # no UTILITZAR EL CÀLCUL AQUI SOTA LES MICRODADES ESTAN MALAMENT!!!
         #age= ifelse(MESDEF >= MESN, ANODEF-ANON, ANODEF-ANON-1)
         ) %>% 
  select(9,10) %>%
  filter(grepl("^08|^17|^25|^43",ine)) %>% 
  mutate(age= case_match(age,
                         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+")) %>% 
  group_by(ine,age) %>% 
  summarise(Defuncions= n()) %>% 
  arrange(ine,age)

ine_mort <- mort22 %>% distinct(ine)

ine_mort <-foreign::read.dbf(
  "../Mapes/repo/divisions-administratives/divisions-administratives-v2r1-municipis-250000-20240118.dbf") %>% 
  mutate(ine= str_sub(CODIMUNI, 1,5)) %>% 
  select(14,2) %>% 
  inner_join(ine_mort)


# ======================================

# ======================================

# DADES - POBLACIÓ PER EDATS - MUNICIPIS DE CATALUNYA ANY 2021

# ======================================
# "https://www.idescat.cat/dades/obertes/pmh?n=1180&geo=mun" Buscar opció

# DESCÀRREGA I SELECCIÓ ANY I SEXE (TOTAL)
#----------------------------------------------------------------------
#popCat21raw <- read.csv(unz('C:/Users/Usuario/Downloads/pmh1180mun.zip',
#         'pmh1180mun-1.csv'),
#         header = TRUE,
#         sep = ";") %>% 
#  filter(any==2021 & sexe== 'total')

#writexl::write_xlsx(popCat21raw, "taulesMun/pop2021.xlsx")
#=========================================================
#read.csv(unz('C:/Users/Usuario/Downloads/pmh1180mun.zip',
#         'pmh1180mun-2.csv'),
#         header = TRUE,
#         sep = ";") %>% 
#  filter(any==2021 & sexe== 'total') # NO CONTÉ DADES ANY 2021!!!
#==============================================================


popcat21raw <- readxl::read_xlsx("taulesMun/pop2021.xlsx") %>% 
  mutate(edat= as.integer(str_extract(edat, "^[0-9]+")),
         #edat= as.integer(edat),
         valor= as.integer(valor)) %>% 
  filter(!is.na(edat)) %>% 
  rename(age= edat,
         pop= valor) %>% 
  filter(municipis != "Catalunya") %>% 
  filter(!is.na(pop)) %>%  # Medinyà
  mutate(municipis= case_match(municipis,
                               "Castell-Platja d'Aro"~ 
                                 "Castell d'Aro, Platja d'Aro i s'Agaró",
                               .default = municipis))
  
popCat21 <- ine_mort %>% 
  mutate(NOMMUNI= sub("^la (.*)", "\\1, la", NOMMUNI),
           NOMMUNI= sub("^el (.*)", "\\1, el", NOMMUNI),
           NOMMUNI= sub("^les (.*)", "\\1, les", NOMMUNI),
           NOMMUNI= sub("^els (.*)", "\\1, els", NOMMUNI),
           NOMMUNI= sub("^l'(.*)", "\\1, l'", NOMMUNI)
         ) %>% 
  left_join(popcat21raw, by= c("NOMMUNI"= "municipis")) %>% 
  select(1,2,4,8) %>% 
  mutate(age= case_match(age,
                               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+")) %>% 
  group_by(ine,NOMMUNI, age) %>% 
  summarise(pop= sum(pop))

# popCat21 %>% filter(pop==0) # Control


# ======================================



# DADES - POBLACIÓ PER EDATS - MUNICIPIS DE CATALUNYA ANY 2022

# ======================================

lf <- list.files("taulesMun/", pattern = "^33.*.xlsx")

# Cal tornar a entrar el path, si no, no funciona: paste0()
data <- lapply(lf, function(x) readxl::read_xlsx(paste0("taulesMun/",x),
                                                 skip = 8,
                                                 col_names = TRUE))

# fixar-se en seq_along() per iterar sobre llistes de dataframes
popCat22raw <- lapply(seq_along(data), function(x) { 
    
    data[[x]][grep("^[0-9]+",data[[x]]$...1),]
}) %>% bind_rows()

popCat22 <- popCat22raw %>% 
    tidyr::pivot_longer(2:102) %>% 
    mutate(name= as.integer(str_extract(name, "^[0-9]+")),
           ine= str_sub(...1, 1,5),
           ...1= str_sub(...1, 7,100)) %>% 
    rename(Municipio= ...1,
           age= name,
           Persones= value) %>% 
    select(4,1,2,3) %>%
    mutate(age= case_match(age,
                               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+")) %>% 
  group_by(ine,Municipio, age) %>% 
  summarise(pop= sum(Persones)) %>% 
  filter(ine %in% ine_mort[[1]])

popCat_21_22 <- popCat21 %>% 
  inner_join(popCat22, by= c("ine","age")) %>% 
  mutate(pop= (pop.x + pop.y) / 2) %>% 
  select(1,2,3,7)

tabmort22 <- popCat22 %>% 
    left_join(mort22, by= c("ine",'age')) %>%
    mutate(Defuncions= ifelse(is.na(Defuncions), 0, Defuncions),
    age= as.factor(age),
    mx= Defuncions / pop)

# Controlar si hi ha municipis amb algun grup de població igual a 0

# tabmort22 %>% filter(pop==0)


# ======================================

# CÀLCUL ESPERANÇA DE VIDA AL NAIXEMENT - MUNICIPIS DE CATALUNYA ANY 2022

# ======================================

espVida22 <- tabmort22 %>%
    group_by(ine,Municipio) %>%
    lifeexp(mx=mx,
          age = age,
          at=0
          )

espVida22 %>% 
  select(-1) %>%
  flextable() %>% 
  width(width = 2) %>% 
  add_header_lines("Esperança de vida calculada als municipis catalans - Any 2022")

Esperança de vida calculada als municipis catalans - Any 2022

Municipio

ex

Abrera

83.86966

Alella

81.90326

Arenys de Mar

81.57204

Argentona

83.77759

Badalona

82.95127

Barcelona

84.30696

Berga

83.75329

Caldes de Montbui

83.85179

Calella

80.97476

Canet de Mar

80.69781

Canovelles

82.24715

Cardedeu

84.00094

Castellar del Vallès

84.10831

Castellbisbal

85.65632

Castelldefels

82.85031

Corbera de Llobregat

83.10764

Cornellà de Llobregat

85.65735

Cubelles

82.22585

Esparreguera

82.90959

Esplugues de Llobregat

84.26323

Franqueses del Vallès, Les

83.04809

Garriga, La

82.19071

Gavà

84.55633

Granollers

85.35990

Hospitalet de Llobregat, L'

84.06980

Igualada

83.17709

Llagosta, La

85.21861

Llinars del Vallès

81.59474

Lliçà d'Amunt

87.47453

Malgrat de Mar

82.28597

Manlleu

84.85071

Manresa

84.09158

Martorell

84.41305

Masnou, El

84.97221

Mataró

83.54845

Molins de Rei

84.66361

Mollet del Vallès

83.76038

Montcada i Reixac

84.12090

Montgat

83.91012

Montornès del Vallès

82.27585

Olesa de Montserrat

83.50553

Palau-solità i Plegamans

82.48382

Pallejà

83.84278

Parets del Vallès

84.90583

Piera

80.34584

Pineda de Mar

81.68349

Prat de Llobregat, El

83.65493

Premià de Mar

83.16300

Ripollet

83.90221

Roca del Vallès, La

85.90873

Rubí

83.57572

Sabadell

83.60149

Sant Adrià de Besòs

84.57825

Sant Andreu de la Barca

83.06227

Sant Andreu de Llavaneres

85.22632

Sant Boi de Llobregat

82.75529

Sant Celoni

85.39474

Sant Cugat del Vallès

86.61933

Sant Feliu de Llobregat

85.59350

Sant Joan Despí

85.39386

Sant Joan de Vilatorrada

84.25720

Vilassar de Mar

84.10980

Sant Just Desvern

83.62892

Premià de Dalt

86.19857

Sant Pere de Ribes

83.73994

Sant Quirze del Vallès

85.25452

Sant Sadurní d'Anoia

85.30781

Santa Coloma de Gramenet

82.48758

Santa Margarida de Montbui

81.89881

Barberà del Vallès

81.68760

Santa Perpètua de Mogoda

83.54663

Sant Vicenç dels Horts

83.19597

Cerdanyola del Vallès

85.15980

Sitges

83.58023

Terrassa

83.23871

Tordera

83.01580

Torelló

83.98235

Vallirana

81.85974

Vic

83.94211

Viladecans

84.21726

Vilanova del Camí

80.15577

Vilafranca del Penedès

81.74942

Vilanova i la Geltrú

83.35006

Badia del Vallès

84.10014

Banyoles

82.38081

Bisbal d'Empordà, La

83.12600

Blanes

82.58958

Calonge i Sant Antoni

82.90112

Cassà de la Selva

84.35513

Castelló d'Empúries

82.86984

Castell d'Aro, Platja d'Aro i s'Agaró

84.66889

Escala, L'

84.47674

Figueres

83.04382

Girona

82.84884

Lloret de Mar

81.55478

Olot

83.02425

Palafrugell

81.91922

Palamós

85.05936

Ripoll

81.41827

Roses

84.01244

Salt

81.71387

Sant Feliu de Guíxols

81.99937

Santa Coloma de Farners

83.90420

Torroella de Montgrí

84.73016

Balaguer

82.55938

Lleida

82.58249

Mollerussa

84.70652

Seu d'Urgell, La

82.04332

Tàrrega

82.03007

Amposta

82.08445

Calafell

82.40293

Cambrils

84.61212

Cunit

83.06649

Mont-roig del Camp

82.40554

Reus

82.63449

Sant Carles de la Ràpita

83.18256

Tarragona

82.77358

Torredembarra

81.78302

Tortosa

82.04771

Valls

83.52847

Vendrell, El

83.85543

Vila-seca

82.38477

Deltebre

80.43166

Salou

84.43118


  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.↩︎