Life tables: A super brief introduction
A life table is just one way of summarizing a cohort’s mortality experience. Below a simple way to build a life table using R.
dat <- read.csv("frmales85.csv", sep = ",", header = T)
# length of intervals
dat$n <- c(diff(dat$x), NA)
# number of intervals
max <- length(dat$x)
# age 85 is an open interval
dat
## x nNx nDx nax n
## 1 0 379985 3741 0.087 1
## 2 1 1559722 770 1.500 4
## 3 5 1896295 532 2.500 5
## 4 10 2160190 673 2.966 5
## 5 15 2179837 2138 2.769 5
## 6 20 2159556 3432 2.574 5
## 7 25 2106750 3291 2.512 5
## 8 30 2147845 3657 2.586 5
## 9 35 2165387 4956 2.657 5
## 10 40 1516952 5269 2.697 5
## 11 45 1498630 8654 2.695 5
## 12 50 1552746 14490 2.663 5
## 13 55 1476770 20831 2.625 5
## 14 60 1350479 26805 2.601 5
## 15 65 722430 20233 2.615 5
## 16 70 842589 38315 2.598 5
## 17 75 636848 46903 2.538 5
## 18 80 372059 44443 2.466 5
## 19 85 175169 37759 4.639 NA
# age-specific mortality rates assuming $_nM_x=_nm_x$
dat$nmx <- dat$nDx/dat$nNx
# age-specific probability to die
dat$nqx <- (dat$n * dat$nmx)/(1 + (dat$n - dat$nax) * dat$nmx)
dat$nqx[max] <- 1
dat$npx <- 1 - dat$nqx
# definition of radix
radix <- 100000
# easy way to get lx without a loop
dat$lx <- radix * c(1, cumprod(dat[1:max - 1, "npx"]))
dat$ndx <- dat$lx * dat$nqx
dat[, c(-2, -3)]
## x nax n nmx nqx npx lx ndx
## 1 0 0.087 1 0.009845 0.00976 0.990 100000 976
## 2 1 1.500 4 0.000494 0.00197 0.998 99024 195
## 3 5 2.500 5 0.000281 0.00140 0.999 98829 139
## 4 10 2.966 5 0.000312 0.00156 0.998 98690 154
## 5 15 2.769 5 0.000981 0.00489 0.995 98537 482
## 6 20 2.574 5 0.001589 0.00792 0.992 98055 776
## 7 25 2.512 5 0.001562 0.00778 0.992 97278 757
## 8 30 2.586 5 0.001703 0.00848 0.992 96522 818
## 9 35 2.657 5 0.002289 0.01138 0.989 95703 1089
## 10 40 2.697 5 0.003473 0.01723 0.983 94614 1630
## 11 45 2.695 5 0.005775 0.02849 0.972 92984 2649
## 12 50 2.663 5 0.009332 0.04566 0.954 90334 4125
## 13 55 2.625 5 0.014106 0.06824 0.932 86209 5883
## 14 60 2.601 5 0.019849 0.09473 0.905 80326 7609
## 15 65 2.615 5 0.028007 0.13127 0.869 72717 9545
## 16 70 2.598 5 0.045473 0.20498 0.795 63171 12949
## 17 75 2.538 5 0.073649 0.31172 0.688 50223 15656
## 18 80 2.466 5 0.119451 0.45848 0.542 34567 15848
## 19 85 4.639 NA 0.215558 1.00000 0.000 18719 18719
# Lx for the open interval
dat$nLx <- dat$lx * dat$n - (dat$n - dat$nax) * dat$ndx
dat$nLx[max] <- dat$lx[max]/dat$nmx[max]
dat$Tx <- rev(cumsum(rev(dat$nLx)))
dat$ex <- dat$Tx/dat$lx
dat[, c(-2:-6)]
## x nqx npx lx ndx nLx Tx ex
## 1 0 0.00976 0.990 100000 976 99109 7131028 71.31
## 2 1 0.00197 0.998 99024 195 395609 7031919 71.01
## 3 5 0.00140 0.999 98829 139 493798 6636310 67.15
## 4 10 0.00156 0.998 98690 154 493140 6142512 62.24
## 5 15 0.00489 0.995 98537 482 491608 5649372 57.33
## 6 20 0.00792 0.992 98055 776 488390 5157764 52.60
## 7 25 0.00778 0.992 97278 757 484509 4669374 48.00
## 8 30 0.00848 0.992 96522 818 480632 4184865 43.36
## 9 35 0.01138 0.989 95703 1089 475964 3704232 38.71
## 10 40 0.01723 0.983 94614 1630 469315 3228268 34.12
## 11 45 0.02849 0.972 92984 2649 458812 2758953 29.67
## 12 50 0.04566 0.954 90334 4125 442031 2300141 25.46
## 13 55 0.06824 0.932 86209 5883 417074 1858110 21.55
## 14 60 0.09473 0.905 80326 7609 383376 1441035 17.94
## 15 65 0.13127 0.869 72717 9545 340818 1057660 14.54
## 16 70 0.20498 0.795 63171 12949 284755 716841 11.35
## 17 75 0.31172 0.688 50223 15656 212570 432087 8.60
## 18 80 0.45848 0.542 34567 15848 132677 219516 6.35
## 19 85 1.00000 0.000 18719 18719 86839 86839 4.64