Age Adjusted Rates in Epidemiology

Author

TheRimalaya

Published

June 20, 2023

Modified

November 11, 2024

In general, rates means how fast something is changing usually over time. In epidemiology uses it to describe how quickly a disese occurs in a population. For example, 35 cases of melanoma cases in 100,000 person per year convey a the sense of speed of spread of disease in that population. Incidence rate and mortality rate are two examples that we will discuss further below.

In epidemiology, rate measures the frequency of occurance of an event in a given population over certain period of time1.

Let us use melanoma as a outcome in the following discussion. Here, we can calculate a crude incidence rate as,

\[\mathcal{R} = \frac{\textsf{no. of melanoma cases}}{\textsf{no. of person-year}} \times \textsf{some multiplier}\]

In the case of mortality rate, we can replace the numerator of above expression by the number of melanoma deaths.

Age-specific rate

Weather to understand a broder prespecitve or to compare across population, these rates are often analyzed stratified by sex and age. This also helps to remove the confounding effection of these factors. The incidence/mortality rate per age-group is usually referred to as Age-specific rates where rates are computed for each age-groups. This is often desirable since factor age has a strong effect on mortality and incidence of most disease especially the cronic one.

Age-adjusted rate

Many research articles, however presents the age-adjusted rates. Age-adjusted rates are standardized (weighted) using some standard population age-structure. For example, many european studies on melanoma uses european standard age distribution. While any reasonal studies have also used world standard population. Cancer registry in their reports sometimes uses age-structure of that country in some given year. For instance, Norway2 and Finland3 have used the their population in 2014 as standard population in their recent cancer report while Australia have used 2001 Australian population4.

Standardized (adjusted) rates makes comparison between the population possible. Figure Figure 1 shows the difference in the age distribution between world population and European population. Following table are some of the standard population often used in the study. Further on standard popuation see seer.cancer.gov5.

Standard Population by Age

Standard Population
us2000 <- tidytable(
  `AgeGroup` = c(
    "0", "1-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+"
  ), 
  US2000 = c(
    13818, 55317, 72533, 73032, 72169, 66478, 64529, 71044, 80762, 81851, 
    72118, 62716, 48454, 38793, 34264, 31773, 26999, 17842, 15508
  )
)
std_pop <- as_tidytable(popEpi::stdpop18) %>% 
  mutate(agegroup = case_when(
    agegroup == "85" ~ "85+", 
    TRUE ~ agegroup
  )) %>% mutate(
    age = case_when(
      agegroup == "0-4" ~ list(c("0", "1-4")),
      TRUE ~ as.list(agegroup)
    )
  ) %>% unnest(age) %>% rename_with(
    ~c("Age Group", "World", "Europe", "Nordic", "AgeGroup")
  ) %>% left_join(us2000) %>% 
  tidytable::mutate(across(everything(), function(x) {
    if (x[1] == x[2]) x[2] <- NA
    return(x)
  })) %>% mutate(
    AgeGroup = c(AgeGroup[1:2], rep(NA, length(AgeGroup) - 2))
  )

gt::gt(std_pop) %>% 
  gt::sub_missing(missing_text = "") %>% 
  gt::cols_label(AgeGroup = "") %>% 
  gt::opt_vertical_padding(0.5) %>%
  gt::tab_style(
    style = gt::cell_borders(sides = "top", weight = "0"),
    locations = gt::cells_body(1:4, rows = 2)
  ) %>% 
  gt::tab_options(column_labels.font.weight = "bold") %>% 
  gt::tab_header("Standard Population by Age Group")
Standard Population by Age Group
Age Group World Europe Nordic US2000
0-4 12000 8000 5900 0 13818




1-4 55317
5-9 10000 7000 6600
72533
10-14 9000 7000 6200
73032
15-19 9000 7000 5800
72169
20-24 8000 7000 6100
66478
25-29 8000 7000 6800
64529
30-34 6000 7000 7300
71044
35-39 6000 7000 7300
80762
40-44 6000 7000 7000
81851
45-49 6000 7000 6900
72118
50-54 5000 7000 7400
62716
55-59 4000 6000 6100
48454
60-64 4000 5000 4800
38793
65-69 3000 4000 4100
34264
70-74 2000 3000 3900
31773
75-79 1000 2000 3500
26999
80-84 500 1000 2400
17842
85+ 500 1000 1900
15508
Standard population plot
pop_data <- as_tidytable(popEpi::stdpop18) %>% 
  mutate(nordic = NULL, id = 1:n())

pop_data %>% 
  mutate(world = world * -1) %>% 
  pivot_longer(cols = c(world, europe)) %>% 
  arrange(id) %>% 
  ggplot(aes(value, reorder(agegroup, id), fill = name)) +
  geom_col(width = 1, color = "#f0f0f0", size = 0.2) +
  theme_minimal() +
  ggthemes::scale_fill_economist(labels = stringr::str_to_title) +
  theme(
    legend.position = "none",
    panel.grid.major.y = element_blank(),
    panel.grid.minor.y = element_line(color = "red")
  ) +
  scale_x_continuous(labels = abs, expand = expansion()) +
  scale_y_discrete(expand = expansion()) +
  labs(
    x = "Number of person",
    y = NULL,
    fill = "Population"
  ) +
  annotate(
    x = -Inf, y = Inf,
    geom = "text", label = "World",
    hjust = -0.5, vjust = 1.5
  ) +
  annotate(
    x = Inf, y = Inf,
    geom = "text", label = "Europe",
    hjust = 1.5, vjust = 1.5
  )

Figure 1: World and European Standard Population

Calculating age-standardized rate

The age-standardized rate (ASR) is calculated as,

\[\text{Age.Std. Rate} = \frac{\sum_i\mathcal{R}_i\mathcal{w}_i}{\sum_i\mathcal{w}_i}\]

where, \(\mathcal{w}_i\) is the weight corresponding to \(i^\text{th}\) age-group in the reference population.

Let’s explore further with an example from melanoma cases from Australia.

Example

The following example have used the Austrailian cancer data with 5-year age-group6 after filtering melanoma cases from 1982 to 2018. The dataset has yearly count and age-specific incidence rate of melanoma for men and women.

Let us use the above European standard population to find the yearly age-standardized incidence by sex.

Age-specific Data
std_pop <- as_tidytable(popEpi::stdpop18) %>% 
  rename_with(~c("AgeGroup", "World", "Europe", "Nordic")) %>% 
  mutate(AgeGroup = case_when(
    AgeGroup == "85" ~ "85+", 
    TRUE ~ AgeGroup
  )) %>% mutate(
    across(World:Nordic, prop.table)
  )

data <- tidytable::fread("melanoma.csv") %>% 
  mutate(AgeGroup = case_when(
    AgeGroup %in% c("85-89", "90+") ~ "85+",
    TRUE ~ AgeGroup
  ))

asp_data <- data %>% 
  left_join(
    std_pop %>% select(AgeGroup, World), 
    by = "AgeGroup"
  )

head(asp_data)
# A tidytable: 6 × 6
   Year Sex   AgeGroup Count   ASR World
  <int> <chr> <chr>    <int> <dbl> <dbl>
1  1982 Males 0-4          0   0    0.12
2  1982 Males 5-9          0   0    0.1 
3  1982 Males 10-14        6   0.9  0.09
4  1982 Males 15-19       30   4.6  0.09
5  1982 Males 20-24       52   7.7  0.08
6  1982 Males 25-29       83  13.1  0.08
Age-standardized Rate
asp <- asp_data %>% 
  group_by(Year, Sex) %>% 
  summarize(AgeAdjRate = sum(ASR * World))

asp %>% 
  group_by(Sex) %>% 
  slice_tail(8) %>% 
  ungroup() %>% 
  tidytable::pivot_wider(
    names_from = "Year",
    values_from = "AgeAdjRate"
  ) %>% 
  gt::gt() %>% 
  gt::opt_vertical_padding(0.5) %>% 
  gt::fmt_number(columns = -1) %>% 
  gt::tab_options(table.width = "100%")
Sex 2011 2012 2013 2014 2015 2016 2017 2018
Females 28.91 29.69 30.30 30.52 30.86 32.16 31.51 32.40
Males 41.43 42.38 43.13 42.84 43.73 45.31 45.27 45.04

Now, let us compare the age-specific rates (crude rates) and age-standardized rates with a plot,

Compare the age-specific rates and age-adjusted rates

Age-specific rates vs Age-adjusted rates
ggplot() +
  geom_line(
    data = data,
    aes(
      x = Year,
      y = ASR,
      group = AgeGroup,
      color = "Crude"
    )
  ) +
  geom_line(
    data = asp,
    aes(
      x = Year,
      y = AgeAdjRate,
      group = 1,
      color = "Age-adjusted"
    )
  ) +
  geom_text(
    data = data[Year == max(Year)],
    check_overlap = TRUE,
    size = rel(2),
    color = "#0f0f0f",
    aes(
      x = Year + 2,
      y = ASR,
      label = AgeGroup
    )
  ) +
  scale_x_continuous(breaks = scales::breaks_extended(8)) +
  scale_y_continuous(breaks = scales::breaks_extended(8)) +
  scale_color_manual(NULL, values = c("firebrick", "grey")) +
  facet_grid(cols = vars(Sex)) +
  theme_minimal() +
  theme(
    panel.border = element_rect(fill = NA, color = "darkgrey"),
    legend.position = "inside",
    legend.position.inside = c(0, 1),
    legend.justification = c(0, 1)
  ) +
  labs(
    x = "Diagnosis year",
    y = paste(
      "Age-adjusted incidence rate",
      "per 100,000 person year",
      sep = "\n"
    )
  )

Figure 2: Age-specific and Age-adjusted rate showing why age-adjustement is necessary

Compare the age-adjusted rates by sex

Age-adjusted rates by sex
ggplot(asp, aes(x = Year, y = AgeAdjRate, color = Sex)) +
  geom_line() +
  geom_point(fill = "whitesmoke", shape = 21) +
  scale_x_continuous(breaks = scales::breaks_extended(8)) +
  scale_y_continuous(breaks = scales::breaks_extended(8)) +
  scale_color_brewer(palette = "Set1") +
  theme_minimal() +
  theme(
    panel.border = element_rect(fill = NA, color = "darkgrey"),
    legend.position = c(0, 1),
    legend.justification = c(0, 1)
  ) +
  labs(
    x = "Diagnosis year",
    y = paste(
      "Age-adjusted incidence rate",
      "per 100,000 person year",
      sep = "\n"
    )
  ) +
  expand_limits(y = 0)

Figure 3: Age-adjusted rates by sex for melanoma patients

Discussion

Figure Figure 2 shows that the incidence of melanoma has larger difference in men between the age-groups than in women and men also have a sharp increase in older age group. In addition, the Figure Figure 3 shows that males have higher age-adjusted incidence of melanoma than women in Australia and this trend is increasing over time with rapid increase before 1983 before a drop.

Age-adjusted rates are useful for comparing rates between population but it cannot give the interpretation required for comparing within a population or over a time period in that population. This is one of the reason, cancer registry uses the internal (population structure of their own population) to compute the age-adjusted rates.

Footnotes

  1. https://www.cdc.gov/csels/dsepd/ss1978/lesson3/section1.html↩︎

  2. https://www.kreftregisteret.no/globalassets/cancer-in-norway/2021/cin_report.pdf↩︎

  3. https://cancerregistry.fi/reports-and-publications/annual-report-on-cancer-in-finland/↩︎

  4. https://www.aihw.gov.au/reports/cancer/cancer-in-australia-2021/summary↩︎

  5. https://seer.cancer.gov/stdpopulations/stdpop.19ages.html↩︎

  6. https://www.aihw.gov.au/reports/cancer/cancer-data-in-australia/data↩︎