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.
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.
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.
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.
# 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.
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.
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/.
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 RapidRise in CutaneousMelanomaDiagnoses.”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 GrowingBurden of InvasiveMelanoma: Projections of IncidenceRates and Numbers of NewCases in SixSusceptiblePopulations Through 2031.”The Journal of Investigative Dermatology 136 (6): 1161–71. https://doi.org/f8psv4.
---title: "Melanoma Incidence in Nordic Countries"author: "Raju Rimal"date: 2023-06-20date-modified: 2024-11-11code-overflow: scrollbibliography: References.bibcitations-hover: truepreview-links: truecode-fold: truecode-tools: toggle: trueexecute: warning: falseformat: html: css: style.csseditor_options: chunk_output_type: consolenocite: "@*"---```{r}#| include: falsepkgs <-c("ggplot2", "gt", "jsonlite", "DT", "segmented", "tidytable")for (pkg in pkgs) require(pkg, character.only =TRUE)options(digits =4, scipen =4)```## IntroductionCutaneous 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 PreparationData on melanoma were obtained from NORDCAN [@nordcan-2023, @engholm_nordcan_2010], Association of the Nordic Cancer Registries, IARC. Using NORDCAN 2.0 API^[`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`] crude and age-adjusted rates were downloaded as JSON and converted to tabular data for further analysis. R[@r_core_team_r_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.::: panel-tabset### Data API {.data-api}```{r}#| code-summary: 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.```{r}#| echo: false#| include: falsegt::gt( design, rowname_col ="country", groupname_col =c("sex", "type"),) %>% gt::cols_hide("cancer") %>% gt::cols_align(align ="right", columns =c(country)) %>% gt::cols_align(align ="left", columns =c(url)) %>% gt::tab_style(style = gt::cell_text(font ="monospace",size ="smaller" ),locations = gt::cells_body(columns =c(url)) ) %>% gt::cols_label(url ~"API Endpoint") %>% gt::tab_options(row_group.font.weight ="bold",column_labels.font.weight ="bold",container.height ="500px" )```### Sample JSON ```{ojs}//| code-summary: JSON objectjson_data =awaitFileAttachment("Data/nordcan.json").json()json_data[0]```### Data download```{r}#| code-summary: Code for data downloadif (!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)```### Data Preparation```{r}#| code-summary: Rate data framerate_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)]``````{r}#| echo:false#| code-fold:falsestr(rate_df)``````{r}#| code-summary: Rate by agerate_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)]``````{r}#| echo:false#| code-fold:falsestr(rate_by_age)```:::## AnalysisFor 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 (@eq-poisson-model-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} $$ {#eq-poisson-model-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.```{r}#| code-summary: Data within each stratanested_df <- rate_df %>%nest(data =-c(sex, type, country))head(nested_df)```### Modelling::: {.callout-note icon="false"}#### Poisson regression model```rmodel <-glm( count ~ year +offset(log(population)), data = rate_df, family =poisson(link ="log"))```:::::: {.callout-note icon="false"}#### Segmented regression model```rsgmt_model <-segmented(model, npsi =2)```:::```{r}#| code-summary: Poisson and segmented fit#| warning:falsefitted_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)```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. ::: panel-tabset### Crude rate```{r}#| code-summary: Crude rate plot#| fig-asp:0.9cols <- 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" )```### Poisson fit```{r}#| label: Fitted values from the model#| code-summary: Fitted values from the model#| message:false#| error:falsefitted_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) }) )``````{r}#| code-summary: Crude rate with poisson fit#| fig-asp:0.9fit_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"))```### Segmented fit```{r}#| code-summary: Crude rate with poisson fit#| fig-asp:0.9plot_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"))```### All countries::: panel-tabset### Poisson fit```{r}#| code-summary: Crude rate with poisson fit for all countries#| fig-asp:0.9plot_poisson(rate_df, fit_df)```### Segmented fit```{r}#| code-summary: Crude rate with poisson fit for all countries#| fig-asp:0.9plot_segmented(rate_df, fit_df, show_poisson = FALSE)```![](Plots/Sgmt-all.svg)::::::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)::: panel-tabset#### Plot```{r}#| fig-asp:0.5tidy_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 )```#### Table```{r}#| label: Calculating annual percentage change#| code-summary: Calculating annual percentage changeaapc_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")``````{r}#| label: Table data for APC#| code-summary: Table data for APCapc %>%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" )```:::### Comparing countries::: panel-tabset#### Incidence```{r}#| echo:true#| code-fold: showmdl_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))```#### Mortality```{r}#| echo:true#| code-fold: showmdl_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))```:::## 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::: {#refs}:::