Melanoma Incidence in Nordic Countries

Author

Raju Rimal

Published

June 20, 2023

Modified

November 12, 2024

Introduction

Cutaneous melanoma (CM) is the most aggressive and lethal form of skin cancer. Melanoma can be cured if caught and treated early but if left untreated, it may spread to other parts and can be fatal. In the recent years, melanoma has increased dramatically in fair skinned population worldwide including Nordic countries like Norway, Denmark, and Sweden. Norway is ranked fifth in incidence and third in mortality worldwide. This increase can be an effect of increased awareness in general public and health care provider.

This article explores melanoma incidence and mortality in nordic countries by sex and their trend over 40-years period from 1980–2020. Further, I try to step through the analysis process from data collection to create plots and tables.

Data Preparation

Data on melanoma were obtained from NORDCAN Engholm et al. (2010), Association of the Nordic Cancer Registries, IARC. Using NORDCAN 2.0 API1 crude and age-adjusted rates were downloaded as JSON and converted to tabular data for further analysis. R(R Core Team 2020) software was used for data gathering, cleanup, analysis, and plotting.

The API endpoint has four placeholder type, sex, country, and cancer following design was used to create individual endpoint. These individual url are used to download the JSON file as list in R.

Code for preparing download URL
design_map <- list(
  sex = c(Male = 1, Female = 2),
  type = c(Incidence = 0, Mortality = 1),
  cancer = c(Melanoma = 290),
  country = c(
    Denmark = 208, Finland = 246, Iceland = 352,
    Norway = 578, Sweden = 752
  )
)
label_values <- function(data, label_map, var) {
  label_vec <- label_map[[var]]
  label <- `names<-`(names(label_vec), label_vec)
  data[[var]] <- data[, label[as.character(get(var))]]
  return(data)
}

design <- do.call(crossing, design_map) %>% 
  mutate(
    url = glue::glue( 
      "https://gco.iarc.fr/gateway_prod/api/nordcan/v2/92/data/population/{type}/{sex}/({country})/({cancer})/?ages_group=5_17&year_start=1980&year_end=2020&year_grouped=0"
    )
  )

design <- design %>% 
  label_values(design_map, "sex") %>% 
  label_values(design_map, "type") %>% 
  label_values(design_map, "cancer") %>% 
  label_values(design_map, "country")
API URL:
https://gco.iarc.fr/gateway_prod/api/nordcan/v2/92/data/population/{type}/{sex}/({country})/({cancer})/?ages_group=5_17&year_start=1980&year_end=2020&year_grouped=0

Replacing the placeholders type (Incidence: 0, Mortality: 1), sex (Male: 1, Female: 2), country (Denmark: 208, Finland: 246, Iceland: 352, Norway: 578, and Sweden: 752), and cancer (Melanoma: 290) prepare the data API.

Code
json_data = await FileAttachment("Data/nordcan.json").json()
json_data[0]
Code for data download
if (!file.exists("Data/nordcan-json.Rds")) {
  design[, data := map(url, ~read_json(.x) %>% purrr::pluck("dataset"))]
  saveRDS(design, file = "Data/nordcan-json.Rds")
} else {
  design <- readRDS("Data/nordcan-json.Rds")
}
design <- design %>% 
  tidytable::select(sex, type, country, data)
Rate data frame
rate_df <- design[, map_df(data, function(dta) {
  out <- data.table(
    year = map_int(dta, ~get("year", .x)),
    asr_w = map_dbl(dta, ~get("asr", .x)),
    asr_e = map_dbl(dta, ~get("asr_e", .x)),
    asr_n = map_dbl(dta, ~get("asr_n", .x)),
    crude_rate = map_dbl(dta, ~get("crude_rate", .x)),
    count = map_dbl(dta, ~get("total", .x)),
    population = map_dbl(dta, ~get("total_pop", .x)),
    cum_risk = map(dta, ~get("cum_risk", .x)) %>% 
      unlist()
  )
  if ("cum_risk" %in% names(out)) {
    out <- out %>% 
      mutate(cum_risk = as.numeric(cum_risk))
  }
  return(out)
}), by = .(sex, type, country)]
Classes 'tidytable', 'data.table' and 'data.frame': 820 obs. of  10 variables:
 $ sex       : chr  "Male" "Male" "Male" "Male" ...
 $ type      : chr  "Incidence" "Incidence" "Incidence" "Incidence" ...
 $ country   : chr  "Denmark" "Denmark" "Denmark" "Denmark" ...
 $ year      : int  1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 ...
 $ asr_w     : num  11.9 10.9 12.2 13.4 13.8 ...
 $ asr_e     : num  12.7 12.1 13.1 14.5 15.3 ...
 $ asr_n     : num  13.5 13.1 14.1 15.2 16 ...
 $ crude_rate: num  12.4 12 13.1 14.3 14.8 ...
 $ count     : num  196 191 210 230 239 234 269 283 291 306 ...
 $ population: num  1585436 1593815 1601416 1609960 1618038 ...
 - attr(*, ".internal.selfref")=<externalptr> 
Rate by age
rate_by_age <- design[, map_df(data, function(dta) {
  year <- map_int(dta, ~get("year", .x))
  count_df <- map(dta, ~get("ages", .x)) %>% 
    map_dfr(as_tidytable) %>% 
    cbind(year = year) %>% 
    pivot_longer(
      cols = -"year",
      names_to = "age_group",
      values_to = "count"
    )
  pop_df <- map(dta, ~get("populations", .x)) %>% 
    map_dfr(as_tidytable) %>%
    cbind(year = year) %>% 
    pivot_longer(
      cols = -"year",
      names_to = "age_group",
      values_to = "population"
    )
  asr_df <- map(dta, ~get("age_specific_rate", .x)) %>% 
    map_dfr(as_tidytable) %>% 
    as_tidytable() %>%
    cbind(year = as.numeric(year)) %>% 
    pivot_longer(
      cols = -"year",
      names_to = "age_group",
      values_to = "asr"
    )
  out <- purrr::reduce(
    list(count_df, pop_df, asr_df),
    inner_join,
    by = c("year", "age_group")
  )
  age_lbl <- paste(
    seq(0, 85, 5),
    seq(0, 85, 5) + 4,
    sep = "-"
  )
  age_lbl[length(age_lbl)] <- "85+"
  names(age_lbl) <- 1:18

  out %>% 
    mutate(age_group = age_lbl[age_group]) %>% 
    mutate(asr = as.numeric(asr)) %>% 
    mutate(across(c(year, count, population), as.integer))

}), by = .(sex, type, country)]
Classes 'tidytable', 'data.table' and 'data.frame': 14760 obs. of  8 variables:
 $ sex       : chr  "Male" "Male" "Male" "Male" ...
 $ type      : chr  "Incidence" "Incidence" "Incidence" "Incidence" ...
 $ country   : chr  "Denmark" "Denmark" "Denmark" "Denmark" ...
 $ year      : int  1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 ...
 $ age_group : chr  "0-4" "0-4" "0-4" "0-4" ...
 $ count     : int  0 0 0 0 0 0 0 0 0 0 ...
 $ population: int  164317 156964 150170 145414 139557 135827 134375 136240 138423 142597 ...
 $ asr       : num  0 0 0 0 0 0 0 0 0 0 ...
 - attr(*, ".internal.selfref")=<externalptr> 

Analysis

For the following analysis, crude rates were used in visualization and modelling. Stratified by sex, country and type following plots presents the the crude_rate over the year of diagnosis. Additionally, using count and population, a poisson regression model (Equation 1) was fitted.

\[ \begin{align} \log\left(\frac{\lambda}{Y}\right) &= \beta_0 + \beta_1 x + \varepsilon \\ \text{equivalently, } \log\left(\lambda\right) &= \beta_0 + \beta_1 x + \log(Y) + \varepsilon \end{align} \tag{1}\]

where, \(\lambda\) is the number of events (count), \(Y\) is the number of exposed (population) and \(x\) is the year of diagnosis.

Additionally, using segmented regression the change points in the trend was identified and the annual percentage change (APC) and average annual percentage change (AAPC) in crude rate were calculated. For each strata, following R-code for poisson regression model and segmented regression model were used.

Data within each strata
nested_df <- rate_df %>% 
  nest(data = -c(sex, type, country))
head(nested_df)
# A tidytable: 6 × 4
  sex   type      country data                
  <chr> <chr>     <chr>   <list>              
1 Male  Incidence Denmark <tidytable [41 × 7]>
2 Male  Incidence Finland <tidytable [41 × 7]>
3 Male  Incidence Iceland <tidytable [41 × 7]>
4 Male  Incidence Norway  <tidytable [41 × 7]>
5 Male  Incidence Sweden  <tidytable [41 × 7]>
6 Male  Mortality Denmark <tidytable [41 × 7]>

Modelling

Poisson regression model
model <- glm(
  count ~ year + offset(log(population)),
  data = rate_df,
  family = poisson(link = "log")
)
Segmented regression model
sgmt_model <- segmented(model, npsi = 2)
Poisson and segmented fit
fitted_df <- nested_df %>% 
  mutate(fit = map(data, function(.data) {
    glm(
      count ~ year + offset(log(population)),
      family = poisson(link = "log"),
      data = .data
    )
  })) %>% 
  mutate(sgmt_fit = map2(data, fit, function(.data, .fit) {
    out <- segmented(.fit, seg.Z = ~year, data = .data, npsi = 2)
    if (!("segmented" %in% class(out))) {
      out <- segmented(.fit, seg.Z = ~year, data = .data, npsi = 1)
    }
    return(out)
  }))

head(fitted_df)
# A tidytable: 6 × 6
  sex   type      country data                 fit    sgmt_fit  
  <chr> <chr>     <chr>   <list>               <list> <list>    
1 Male  Incidence Denmark <tidytable [41 × 7]> <glm>  <segmentd>
2 Male  Incidence Finland <tidytable [41 × 7]> <glm>  <segmentd>
3 Male  Incidence Iceland <tidytable [41 × 7]> <glm>  <segmentd>
4 Male  Incidence Norway  <tidytable [41 × 7]> <glm>  <segmentd>
5 Male  Incidence Sweden  <tidytable [41 × 7]> <glm>  <segmentd>
6 Male  Mortality Denmark <tidytable [41 × 7]> <glm>  <segmentd>

Following plots highlighting Norway and Finland for comparison show a higher melanoma incidence and mortality rate in Norway compared to Finland. A plateau was observed in melanoma incidence in Norway in both male and female.

Crude rate plot
cols <- RColorBrewer::brewer.pal(fitted_df[, n_distinct(country)], "Set1") 
names(cols) <- fitted_df[, unique(country)]

rate_df %>% 
  filter(country != "Iceland") %>% 
  ggplot(aes(year, crude_rate, group = country)) +
  facet_grid(
    cols = vars(sex),
    rows = vars(type),
    scales = "free_y"
  ) +
  geom_line(color = "lightgrey") +
  geom_point(
    fill = "whitesmoke", 
    shape = 21, 
    color = "lightgrey",
    stroke = 1,
    size = 1
  ) +
  geom_line(
    data = ~subset(.x, country %in% c("Finland", "Norway")),
    aes(color = country)
  ) +
  ggthemes::theme_few(base_size = 14) +
  theme(
    legend.position = "bottom",
    legend.justification = "left",
    panel.grid = element_line(color = "#f0f0f0")
  ) +
  scale_color_manual(breaks = names(cols), values = cols) +
  labs(
    x = "Year of diagnosis",
    y = "Crude rate per 100,000 person-years",
    color = "Country"
  )

Fitted values from the model
fitted_df <- fitted_df %>% 
  mutate(
    fit_df = map(
      fit, 
      function(.fit) {
        new_data <- crossing(year = 1980:2020, population = 1e5)
        tidytable(
          year = new_data[, year],
          .fitted = predict(.fit, newdata = new_data, type = "response")
        )
      }),
    sgmt_fit_df = map(
      sgmt_fit, function(.fit) {
        new_data <- crossing(year = 1980:2020, population = 1e5)
        pred_df <- predict(
          .fit, newdata = new_data,
          type = "link", interval = "confidence"
        ) %>% exp() %>% apply(1:2, prod, 1e5) %>% 
        as_tidytable() %>% 
        rename_with(~c(".fitted", ".lower", ".upper"))
        bind_cols(year = new_data[, year], pred_df)
      })
  )
Crude rate with poisson fit
fit_df <- fitted_df %>%
  unnest(fit_df) %>%
  filter(country != "Iceland")

plot_poisson <- function(rate_df, fit_df, countries = NULL) {
  if (is.null(countries)) {
    countries <- rate_df[, country]
  }
  rate_df %>%
    filter(country != "Iceland") %>%
    ggplot(aes(year, crude_rate, group = country)) +
    facet_grid(
      cols = vars(sex),
      rows = vars(type),
      scales = "free_y"
    ) +
    geom_line(color = "lightgrey") +
    geom_point(
      fill = "whitesmoke",
      shape = 21,
      color = "lightgrey",
      stroke = 1,
      size = 1
    ) +
    geom_line(
      data = ~ subset(fit_df, country %in% countries),
      aes(color = country, y = .fitted),
    ) +
    ggthemes::theme_few(base_size = 14) +
    theme(
      legend.position = "bottom",
      legend.justification = "left",
      panel.grid = element_line(color = "#f0f0f0")
    ) +
    scale_color_manual(breaks = names(cols), values = cols) +
    labs(
      x = "Year of diagnosis",
      y = "Crude rate per 100,000 person-years",
      color = "Country"
    )
}
plot_poisson(rate_df, fit_df, c("Finland", "Norway"))

Crude rate with poisson fit
plot_segmented <- function(rate_df, fit_df, countries = NULL, show_poisson = T) {
  sgmt_fit_df <- fitted_df %>% 
    filter(country != "Iceland") %>% 
    unnest(sgmt_fit_df)

  if (is.null(countries)) {
    countries <- rate_df[, unique(country)]
  } else {
    sgmt_fit_df <- sgmt_fit_df %>% filter(country %in% countries)
  }

  plt <- rate_df %>% 
    filter(country != "Iceland") %>% 
    ggplot(aes(year, crude_rate, group = country)) +
    facet_grid(
      cols = vars(sex),
      rows = vars(type),
      scales = "free_y"
    ) +
    geom_line(color = "lightgrey") +
    geom_point(
      fill = "whitesmoke", 
      shape = 21, 
      color = "lightgrey",
      stroke = 1,
      size = 1
    ) +
    geom_line(
      data = ~subset(sgmt_fit_df, country %in% countries),
      aes(color = country, y = .fitted),
      linetype = if (show_poisson) "dashed" else "solid"
    ) +
    ggthemes::theme_few(base_size = 14) +
    theme(
      legend.position = "bottom",
      legend.justification = "left",
      panel.grid = element_line(color = "#f0f0f0")
    ) +
    scale_color_manual(breaks = names(cols), values = cols) +
    labs(
      x = "Year of diagnosis",
      y = "Crude rate per 100,000 person-years",
      color = "Country"
    )

    if (show_poisson) {
      plt <- plt +
        geom_line(
          data = ~subset(fit_df, country %in% countries),
          aes(color = country, y = .fitted),
          alpha = 0.5
        )
    }
    return(plt)
}
plot_segmented(rate_df, fit_df, c("Norway", "Finland"))

Crude rate with poisson fit for all countries
plot_poisson(rate_df, fit_df)

Crude rate with poisson fit for all countries
plot_segmented(rate_df, fit_df, show_poisson = FALSE)

Here, Norway leads with the highest rates of melanoma incidence and mortality, while Finland shines with the lowest rates across both sexes. Recently, Denmark has surged ahead of Norway and Sweden in terms of melanoma incidence.

Interestingly, Norway had a plateau in melanoma cases for a while, but most Nordic countries saw a rise in melanoma cases after 2005. The silver lining here is that all countries have experienced a drop in melanoma mortality in recent years, thanks to better detection, treatments, and awareness.

Annual percentge change (APC)

Code
tidy_fit <- fitted_df %>% 
  transmute(tidy_fit = map(fit, function(.fit) {
    broom::tidy(.fit, exponentiate = TRUE, conf.int = TRUE) %>% 
      filter(term == "year", country != "Iceland")
  }), .by = c(sex, type, country)) %>% 
  unnest()

tidy_fit %>% 
  mutate(country = factor(country, c(
    "Finland", "Denmark",
    "Sweden", "Norway"
  ))) %>% 
  ggplot(aes(x = estimate, y = country, color = sex)) +
  facet_grid(cols = vars(type)) +
  geom_pointrange(
    aes(xmin = conf.low, xmax = conf.high),
    shape = 21,
    fill = "whitesmoke",
    position = position_dodge(width = 0.5)
  ) +
  geom_vline(xintercept = 1, linetype = 2, color = "grey") +
  scale_color_brewer(palette = "Set1") +
  expand_limits(x = 1) +
  ggthemes::theme_few(base_size = 16) +
  theme(
    panel.grid = element_line(color = "#f0f0f0"),
    legend.position = "bottom",
    legend.justification = "left"
  ) +
  labs(
    x = "Percentage change in count",
    y = NULL
  )

Calculating annual percentage change
aapc_df <- fitted_df %>% 
  transmute(
    aapc = map(sgmt_fit, function(.fit) {
      aapc(.fit) %>% 
        t() %>% 
        as_tidytable() %>% 
        rename_with(
          ~c("estimate", "std_err", "lower", "upper")
        ) %>% 
        mutate(psi = "1980--2020") %>% 
        mutate(
          label = glue::glue(
            "{estimate} ({lower}, {upper})",
            .transformer = \(d, e) round(get(d, e), 2)
          )
        )
    }),
    apc = map(sgmt_fit, function(fit) {
      if (!"segmented" %in% class(fit)) return(NULL)
      out <- slope(fit, APC = TRUE)[[1]] %>% 
        as_tidytable(.keep_rownames = "segment")
      psi_start <- unname(c(1980, fit$psi[, "Est."], 2020))
      psi_end <- lead(psi_start, 1)
      psi_range <- glue::glue(
        "{psi_start}--{psi_end}",
        .transformer = \(d, e) round(get(d, e))
      )
      psi_range <- setdiff(psi_range, last(psi_range))
      out %>% 
        mutate(psi = psi_range) %>% 
        rename_with(
          .fn = ~c("estimate", "lower", "upper"), 
          .cols = 2:4
        ) %>% 
        mutate(label = glue::glue(
          "{estimate} ({lower}, {upper})",
          .transformer = \(d, e) round(get(d, e), 2)
        )) %>% 
        mutate(label_period = glue::glue("{label}<br>{psi}")) %>% 
        mutate(segment = gsub("slope", "", segment))
    }),
    .by = c(sex, type, country)
  )

apc <- aapc_df %>% unnest("apc")
aapc <- aapc_df %>% unnest("aapc")
Table data for APC
apc %>% 
  filter(country %in% c("Norway", "Denmark")) %>% 
  pivot_wider(
    id_cols = c(country, segment),
    names_from = c(type, sex),
    values_from = "label_period"
  ) %>% 
  gt::gt(
    id = "apc-table",
    rowname_col = "segment",
    groupname_col = "country"
  ) %>% 
  gt::tab_spanner_delim("_") %>% 
  gt::fmt_markdown(everything()) %>% 
  gt::sub_missing(everything(), missing_text = "-") %>%
  gt::tab_stubhead("Segment") %>% 
  gt::tab_options(
    table.width = "100%",
    column_labels.font.weight = "bold",
    row_group.font.weight = "bold"
  )
Segment
Incidence
Mortality
Male Female Male Female
Denmark
1 3.54 (3.23, 3.85)
1980–2004
2.73 (2.4, 3.06)
1980–2002
0.63 (0.1, 1.17)
1980–2004
0.51 (0.12, 0.91)
1980–2011
2 9.8 (7.32, 12.33)
2004–2009
6.92 (5.96, 7.88)
2002–2011
4.1 (0.93, 7.37)
2004–2012
12.09 (-12.23, 43.14)
2011–2013
3 3.1 (2.53, 3.68)
2009–2020
1.79 (1.18, 2.41)
2011–2020
-2.15 (-4.08, -0.19)
2012–2020
-4.08 (-7.35, -0.69)
2013–2020
Norway
1 5.49 (4.32, 6.67)
1980–1991
3.87 (2.67, 5.09)
1980–1990
17.12 (-0.32, 37.61)
1980–1982
1.02 (0.19, 1.85)
1980–2000
2 0.45 (-0.44, 1.35)
1991–2002
0.17 (-0.69, 1.04)
1990–2000
1.78 (1.39, 2.18)
1982–2011
2.64 (1.25, 4.05)
2000–2013
3 4.39 (4.08, 4.69)
2002–2020
3.67 (3.39, 3.95)
2000–2020
-2.05 (-3.87, -0.2)
2011–2020
-5.28 (-8.41, -2.05)
2013–2020

Comparing countries

Code
mdl_inc <- glm(
  data = rate_df,
  formula = count ~ year + sex + country,
  offset = log(population),
  family = poisson(link = "log"),
  subset = type == "Incidence"
)

broom::tidy(mdl_inc, conf.int = TRUE, exponentiate = TRUE) %>% 
  mutate(across(c(2:4, 6:7), round, 3))
# A tidytable: 7 × 7
  term           estimate std.error statistic   p.value conf.low conf.high
  <chr>             <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>
1 (Intercept)       0         0.383   -205.   0            0         0    
2 year              1.04      0        185.   0            1.04      1.04 
3 sexMale           1.01      0.004      1.90 5.68e-  2    1         1.02 
4 countryFinland    0.649     0.007    -62.6  0            0.64      0.658
5 countryIceland    0.494     0.028    -25.6  1.86e-144    0.468     0.521
6 countryNorway     1.05      0.006      8.09 5.84e- 16    1.04      1.06 
7 countrySweden     0.936     0.005    -12.1  1.41e- 33    0.926     0.946
Code
mdl_mor <- glm(
  data = rate_df,
  formula = count ~ year + sex + country,
  offset = log(population),
  family = poisson(link = "log"),
  subset = type == "Mortality"
)

broom::tidy(mdl_mor, conf.int = TRUE, exponentiate = TRUE) %>% 
  mutate(across(c(2:4, 6:7), round, 3))
# A tidytable: 7 × 7
  term           estimate std.error statistic   p.value conf.low conf.high
  <chr>             <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>
1 (Intercept)       0         0.844    -40.9  0            0         0    
2 year              1.01      0         29.2  1.53e-187    1.01      1.01 
3 sexMale           1.46      0.01      38.0  0            1.43      1.49 
4 countryFinland    0.731     0.016    -19.2  1.67e- 82    0.708     0.755
5 countryIceland    0.611     0.061     -8.02 1.05e- 15    0.54      0.688
6 countryNorway     1.24      0.015     14.6  3.57e- 48    1.20      1.27 
7 countrySweden     1.03      0.013      2.2  2.78e-  2    1.00      1.06 

Summary

In summary, melanoma trends across the Nordic countries reveal some concerning patterns. Incidence and mortality have been increasing in all countries, with Norway showing the highest mortality rate and the most substantial rise in both incidence and mortality. Denmark saw a particularly rapid increase in melanoma cases between 2002 and 2011 in women and between 2004 and 2009 in men, surpassing Norway during those periods.

However, there is a silver lining: recent years have shown a decrease in melanoma mortality rates across all the Nordic countries. This positive trend suggests that advancements in medical treatments, early detection efforts, and greater public awareness are starting to make a difference. While the rise in incidence remains a challenge, the declining mortality rates provide a hopeful perspective moving forward.

References

Engholm, Gerda, Jacques Ferlay, Niels Christensen, Freddie Bray, Marianne L. Gjerstorff, Åsa Klint, Jóanis E. Køtlum, Elínborg Ólafsdóttir, Eero Pukkala, and Hans H. Storm. 2010. NORDCAN – a Nordic Tool for Cancer Information, Planning, Quality Control and Research.” Acta Oncologica 49 (5): 725–36. https://doi.org/ch4598.
Larønningen, S., J. Ferlay, H. Beydogan, F. Bray, G. Engholm, M. Ervik, J. Gulbrandsen, et al. 2022. NORDCAN: Cancer Incidence, Mortality, Prevalence and Survival in the Nordic Countries, Version 9.2 (23.06.2022).” 2022. https://nordcan.iarc.fr/.
Muggeo, Vito M. R. 2008. “Segmented: An r Package to Fit Regression Models with Broken-Line Relationships.” R News 8 (1): 20–25. https://cran.r-project.org/doc/Rnews/.
Norway, Cancer Registry of. 2022. “Cancer in Norway 2021: Cancer Incidence, Mortality, Survival and Prevalence in Norway.” 0806-3621. Cancer Registry of Norway. https://www.kreftregisteret.no/globalassets/cancer-in-norway/2021/cin_report.pdf.
R Core Team. 2020. “R: A Language and Environment for Statistical Computing.” Manual. Vienna, Austria. https://www.R-project.org/.
Welch, H. Gilbert, Benjamin L. Mazer, and Adewole S. Adamson. 2021. “The Rapid Rise in Cutaneous Melanoma Diagnoses.” New England Journal of Medicine 384 (1): 72–79. https://doi.org/gm6vs4.
Whiteman, David C., Adele C. Green, and Catherine M. Olsen. 2016. “The Growing Burden of Invasive Melanoma: Projections of Incidence Rates and Numbers of New Cases in Six Susceptible Populations Through 2031.” The Journal of Investigative Dermatology 136 (6): 1161–71. https://doi.org/f8psv4.

Footnotes

  1. https://gco.iarc.fr/gateway_prod/api/nordcan/v2/92/data/population/{type}/{sex}/({country})/({cancer})/?ages_group=5_17&year_start=1980&year_end=2020&year_grouped=0↩︎