::p_load(
pacman# importer/exporter des données
rio, # localisation des fichiers
here, # nettoyage des caractères et des chaînes de caractères
stringr, # nécessaire pour dsr, pour les modèles de frailty
frailtypack, # standardiser les taux
dsr, # alternative pour la standardisation des taux
PHEindicatormethods, # gestion et visualisation des données tidyverse)
21 Taux standardisés
Cette page vous montre deux façons de normaliser un résultat, tel que les hospitalisations ou la mortalité, en fonction de caractéristiques telles que l’âge et le sexe.
- Utilisation du paquet dsr
- Utilisation du paquet PHEindicatormethods.
Nous commençons par démontrer de manière extensive les processus de préparation/nettoyage/jonction des données, car cela est courant lorsqu’on combine des données de population provenant de plusieurs pays, des données de population standard, des décès, etc.
21.1 Vue d’ensemble
Il existe deux manières principales de normaliser : la normalisation directe et la normalisation indirecte. Supposons que nous voulions normaliser le taux de mortalité par âge et par sexe pour le pays A et le pays B, et comparer les taux normalisés entre ces pays.
- Pour une standardisation directe, vous devrez connaître le nombre de personnes à risque et le nombre de décès pour chaque strate d’âge et de sexe, pour le pays A et le pays B. Une strate dans notre exemple pourrait être les femmes âgées de 15 à 44 ans.
- Pour une standardisation indirecte, il suffit de connaître le nombre total de décès et la structure d’âge et de sexe de chaque pays. Cette option est donc envisageable si les taux de mortalité ou les chiffres de population par âge et par sexe ne sont pas disponibles. La standardisation indirecte est en outre préférable en cas de petits effectifs par strate, car les estimations en standardisation directe seraient influencées par une variation d’échantillonnage importante.
21.2 Préparation
Pour montrer comment se fait la standardisation, nous allons utiliser des comptages fictifs de population et de décès du pays A et du pays B, par âge (en catégories de 5 ans) et par sexe (femme, homme). Pour que les ensembles de données soient prêts à être utilisés, nous allons effectuer les étapes de préparation suivantes :
- Charger les paquets
- Charger les jeux de données
- Joignez les données de population et de décès des deux pays.
- Pivoter plus longtemps pour qu’il y ait une ligne par strate âge-sexe.
- Nettoyez la population de référence (population standard mondiale) et joignez-la aux données du pays.
Dans votre scénario, vos données peuvent se présenter sous un format différent. Peut-être vos données sont-elles présentées par province, ville ou autre zone d’attraction. Vous avez peut-être une ligne pour chaque décès et des informations sur l’âge et le sexe pour chacun (ou une proportion importante) de ces décès. Dans ce cas, consultez les pages sur le Travailler sur des données groupées, Pivoter les données, and Tableaux descriptifs pour créer un ensemble de données avec des comptes d’événements et de population par strate âge-sexe.
Nous avons également besoin d’une population de référence, la population standard. Pour les besoins de cet exercice, nous utiliserons la world_standard_population_by_sex
(population standard mondiale par sexe). La population standard mondiale est basée sur les populations de 46 pays et a été développée en 1960. Il existe de nombreuses populations “standard” - à titre d’exemple, le site web de NHS Scotland est assez informatif sur la population standard européenne, la population standard mondiale et la population standard écossaise.
Chargement des paquets
Ce chunk de code montre le chargement des paquets nécessaires aux analyses. Dans ce manuel, nous mettons l’accent sur p_load()
de pacman, qui installe le paquet si nécessaire et le charge pour l’utiliser. Vous pouvez également charger les paquets installés avec library()
de base R. Voir la page sur bases de R pour plus d’informations sur les paquets R.
**ATTENTION:_** Si vous avez une version plus récente de R, le paquet dsr ne peut pas être téléchargé directement avec CRAN. Cependant, il est toujours disponible de l’archive CRAN. Vous pouvez installer et utiliser celui-ci.
Pour les utilisateurs non-Mac :
<- "https://cran.r-project.org/src/contrib/Archive/dsr/dsr_0.2.2.tar.gz"
packageurl install.packages(packageurl, repos=NULL, type="source")
# Autre solution qui peut fonctionner
require(devtools)
::install_version("dsr", version="0.2.2", repos="http:/cran.us.r.project.org") devtools
Pour les utilisateurs de Mac :
require(devtools)
::install_version("dsr", version="0.2.2", repos="https://mac.R-project.org") devtools
Charger les données de la population
Voir la page Télécharger le manuel et les données pour savoir comment télécharger tous les exemples de données du manuel. Vous pouvez importer les données de la page de normalisation directement dans R depuis notre dépôt Github en exécutant les commandes import()
suivantes :
# importer les données démographiques du pays A directement depuis Github
<- import("https://github.com/epirhandbook/Epi_R_handbook/raw/master/data/standardization/country_demographics.csv")
A_demo
# importer les décès pour le pays A directement depuis Github
<- import("https://github.com/epirhandbook/Epi_R_handbook/raw/master/data/standardization/deaths_countryA.csv")
A_deaths
# Importez les données démographiques pour le pays B directement depuis Github.
<- import("https://github.com/epirhandbook/Epi_R_handbook/raw/master/data/standardization/country_demographics_2.csv")
B_demo
# importer les décès pour le pays B directement depuis Github.
<- import("https://github.com/epirhandbook/Epi_R_handbook/raw/master/data/standardization/deaths_countryB.csv")
B_deaths
# Importez les données démographiques pour le pays B directement depuis Github.
<- import("https://github.com/epirhandbook/Epi_R_handbook/raw/master/data/standardization/world_standard_population_by_sex.csv") standard_pop_data
Tout d’abord, nous chargeons les données démographiques (comptage des hommes et des femmes par catégorie d’âge de 5 ans) pour les deux pays que nous allons comparer, le “pays A” et le “pays B”.
# Pays A
<- import("country_demographics.csv") A_demo
# Pays B
<- import("country_demographics_2.csv") B_demo
Chargement du nombre de morts
De manière pratique, nous disposons également du nombre de décès survenus pendant la période qui nous intéresse, par âge et par sexe. Les chiffres de chaque pays sont dans un fichier séparé, comme indiqué ci-dessous.
Décès dans le pays A
Décès dans le pays B
Nettoyer les populations et les décès
Nous devons joindre et transformer ces données de la manière suivante :
- Combiner les populations des pays en un seul ensemble de données et faire un pivot “long” pour que chaque strate âge-sexe soit une ligne.
- Combiner le nombre de décès par pays dans un ensemble de données et faire pivoter “long” pour que chaque strate âge-sexe soit une ligne.
- Joindre les décès aux populations
Tout d’abord, nous combinons les ensembles de données sur les populations des pays, nous effectuons un pivot plus long et un nettoyage mineur. Voir la page Pivoter les données pour plus de détails.
<- A_demo %>% # Commencez avec l'ensemble de données du pays A
pop_countries bind_rows(B_demo) %>% # lier les lignes, car les colonnes portent le même nom
pivot_longer( # pivot plus long
cols = c(m, f), # colonnes à combiner en une seule
names_to = "Sex", # nom de la nouvelle colonne contenant la catégorie ("m" ou "f")
values_to = "Population") %>% # nom de la nouvelle colonne contenant les valeurs numériques pivotées
mutate(Sex = recode(Sex, # re-code les valeurs pour plus de clarté
"m" = "Male",
"f" = "Female"))
Les données de population combinées ressemblent maintenant à ceci (cliquez pour voir les pays A et B) :
Et maintenant, nous effectuons des opérations similaires sur les deux ensembles de données de décès.
<- A_deaths %>% # Commencez avec l'ensemble de données des décès du pays A
deaths_countries bind_rows(B_deaths) %>% # lier les lignes avec l'ensemble de données B, parce que les colonnes sont nommées de manière identique
pivot_longer( # pivot plus long
cols = c(Male, Female), # colonne à transformer en une seule
names_to = "Sex", # nom de la nouvelle colonne contenant la catégorie ("m" ou "f")
values_to = "Deaths") %>% # nom pour la nouvelle colonne contenant les valeurs numériques pivotées
rename(age_cat5 = AgeCat) # renomme pour plus de clarté
Les données de décès ressemblent maintenant à ceci, et contiennent les données des deux pays :
Nous joignons maintenant les données de décès et de population sur la base des colonnes communes Country
, age_cat5
, et Sex
. Cela ajoute la colonne Deaths
.
<- pop_countries %>%
country_data left_join(deaths_countries, by = c("Country", "age_cat5", "Sex"))
Nous pouvons maintenant classer Country
, age_cat5
, et Sex
comme facteurs et définir l’ordre des niveaux en utilisant la fonction fct_relevel()
du paquet forcats, comme décrit dans la page sur Facteurs. Notez que le classement des niveaux des facteurs ne change pas visiblement les données, mais la commande arrange()
les trie par Pays, catégorie d’âge et sexe.
<- country_data %>%
country_data mutate(
Country = fct_relevel(Country, "A", "B"),
Sex = fct_relevel(Sex, "Male", "Female"),
age_cat5 = fct_relevel(
age_cat5,"0-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")) %>%
arrange(Country, age_cat5, Sex)
**__ATTENTION:_** Si vous avez peu de décès par strate, envisagez d’utiliser des catégories de 10, ou 15 ans, au lieu de catégories de 5 ans pour l’âge.
Chargement de la population de référence
Enfin, pour la standardisation directe, nous importons la population de référence (la “population standard” mondiale par sexe).
# Population de référence
<- import("world_standard_population_by_sex.csv") standard_pop_data
Nettoyer la population de référence
Les valeurs des catégories d’âge dans les cadres de données country_data
et standard_pop_data
devront être alignées.
Actuellement, les valeurs de la colonne age_cat5
du cadre de données standard_pop_data
contiennent le mot “years” et “plus”, alors que celles du cadre de données country_data
ne le font pas. Nous devrons faire correspondre les valeurs des catégories d’âge. Nous utilisons str_replace_all()
du paquet stringr, comme décrit dans la page Caractères et chaînes de caractères, pour remplacer ces motifs par des ""
sans espace.
De plus, le paquet dsr s’attend à ce que dans la population standard, la colonne contenant les comptes soit appelée "pop"
. Nous renommons donc cette colonne en conséquence.
# Suppression d'une chaîne spécifique des valeurs de la colonne
<- standard_pop_data %>%
standard_pop_clean mutate(
age_cat5 = str_replace_all(age_cat5, "years", ""), # supprime "year" (année)
age_cat5 = str_replace_all(age_cat5, "plus", ""), # supprimez "plus".
age_cat5 = str_replace_all(age_cat5, " ", "")) %>% # supprime l'espace " ".
rename(pop = WorldStandardPopulation) # change le nom de la colonne en "pop", car cela est attendu par le paquet dsr
CAUTION: Si vous essayez d’utiliser str_replace_all()
pour supprimer un symbole plus, cela ne fonctionnera pas car c’est un symbole spécial. “Échappez” au spécial en mettant deux barres obliques inverses devant, comme dans str_replace_call(column, "\\+", "")
.
21.2.1 Créer un jeu de données avec une population standard
Enfin, le package PHEindicatormethods, détaillé ci-dessous, attend les populations standards jointes aux événements et aux comptages de population du pays. Nous allons donc créer un jeu de données all_data
à cet effet.
<- left_join(country_data, standard_pop_clean, by=c("age_cat5", "Sex")) all_data
Cet ensemble de données complet ressemble à ceci :
21.3 dsr package
Nous démontrons ci-dessous le calcul et la comparaison de taux directement standardisés à l’aide du package dsr. Le package dsr vous permet de calculer et de comparer des taux directement standardisés (pas de taux indirectement standardisés !).
Dans la section Préparation des données, nous avons créé des jeux de données distincts pour le nombre de pays et la population standard :
- l’objet
country_data
, qui est un tableau de population avec le nombre de population et le nombre de décès par strate par pays
- l’objet
standard_pop_clean
, contenant le nombre de personnes par strate pour notre population de référence, la population standard mondiale.
Nous utiliserons ces ensembles de données distincts pour l’approche dsr.
Taux standardisés
Ci-dessous, nous calculons les taux par pays directement standardisés pour l’âge et le sexe. Nous utilisons la fonction dsr()
.
A noter - dsr()
s’attend à un cadre de données pour les populations des pays et le nombre d’événements (décès), et un autre cadre de données avec la population de référence. Il s’attend également à ce que dans cette base de données de la population de référence, le nom de la colonne unité-temps soit “pop” (nous nous en sommes assurés dans la section Préparation des données).
Il y a de nombreux arguments, comme annoté dans le code ci-dessous. Notamment, event =
est fixé à la colonne Deaths
, et le fu =
(“follow-up”) est fixé à la colonne Population
. Nous définissons les sous-groupes de comparaison comme la colonne Country
et nous standardisons sur la base de age_cat5
et Sex
. Ces deux dernières colonnes n’ont pas d’argument nommé particulier. Voir ?dsr
pour plus de détails.
# Calculez les taux par pays directement standardisés pour l'âge et le sexe
<- dsr::dsr(
mortality_rate data = country_data, # spécifier l'objet contenant le nombre de décès par strate
event = Deaths, # colonne contenant le nombre de décès par strate
fu = Population, # colonne contenant le nombre de population par strate
subgroup = Country, # unités que nous souhaitons comparer
# autres colonnes - les taux seront standardisés par celles-ci
age_cat5,
Sex,refdata = standard_pop_clean, # cadre de données de la population de référence, avec une colonne appelée "pop".
method = "gamma", # méthode pour calculer l'IC à 95%.
sig = 0,95, # niveau de signification
mp = 100000, # nous voulons les taux pour 100.000 habitants
decimals = 2) # nombre de décimales)
# Imprimez la sortie sous la forme d'un joli tableau HTML
::kable(mortality_rate) # Afficher le taux de mortalité avant et après la standardisation directe knitr
Subgroup | Numerator | Denominator | Crude Rate (per 1e+05) | 0% LCL (Crude) | 0% UCL (Crude) | Std Rate (per 1e+05) | 0% LCL (Std) | 0% UCL (Std) |
---|---|---|---|---|---|---|---|---|
A | 11344 | 86790567 | 13.07 | 13.07 | 13.07 | 23.57 | 23.57 | 23.57 |
B | 9955 | 52898281 | 18.82 | 18.82 | 18.82 | 19.33 | 19.32 | 19.33 |
Ci-dessus, nous voyons que même si le pays A avait un taux de mortalité brut plus faible que le pays B, il a un taux standardisé plus élevé après standardisation directe par âge et par sexe.
Ratios de taux standardisés
# Calculer le RR
<- dsr::dsrr(
mortality_rr data = country_data, # spécifier l'objet contenant le nombre de décès par strate
event = Deaths, # colonne contenant le nombre de décès par strate
fu = Population, # colonne contenant le nombre de population par strate
subgroup = Country, # unités que nous souhaitons comparer
age_cat5,# caractéristiques sur lesquelles nous aimerions nous standardiser
Sex, refdata = standard_pop_clean, # population de référence, avec des chiffres dans la colonne appelée pop
refgroup = "B", # référence pour la comparaison
estimate = "ratio", # type d'estimation
sig = 0.95, # niveau de signification
mp = 100000, # nous voulons des taux pour 100.000 habitants
decimals = 2) # nombre de décimales
# Imprimer le tableau
::kable(mortality_rr) knitr
Comparator | Reference | Std Rate (per 1e+05) | Rate Ratio (RR) | 95% LCL (RR) | 95% UCL (RR) |
---|---|---|---|---|---|
A | B | 23.57 | 1.22 | 1.17 | 1.27 |
B | B | 19.33 | 1.00 | 0.94 | 1.06 |
Le taux de mortalité standardisé est 1,22 fois plus élevé dans le pays A que dans le pays B (IC 95 % 1.17-1.27).
Différence de taux standardisé
# Calculer RD
<- dsr::dsrr(
mortality_rd data = country_data, # spécifier l'objet contenant le nombre de décès par strate
event = Deaths, # colonne contenant le nombre de décès par strate
fu = Population, # colonne contenant le nombre de population par strate
subgroup = Country, # unités que nous souhaitons comparer
# caractéristiques sur lesquelles nous voulons nous standardiser
age_cat5,
Sex, refdata = standard_pop_clean, # population de référence, avec des chiffres dans la colonne appelée pop
refgroup = "B", # référence pour la comparaison
estimate = "difference", # type d'estimation
sig = 0.95, # niveau de signification
mp = 100000, # nous voulons des taux pour 100.000 habitants
decimals = 2) # nombre de décimales
# Imprimer le tableau
::kable(mortality_rd) knitr
Comparator | Reference | Std Rate (per 1e+05) | Rate Difference (RD) | 95% LCL (RD) | 95% UCL (RD) |
---|---|---|---|---|---|
A | B | 23.57 | 4.24 | 3.24 | 5.24 |
B | B | 19.33 | 0.00 | -1.24 | 1.24 |
Le pays A a 4.24 décès supplémentaires pour 100.000 habitants (IC 95% 3.24-5.24) par rapport au pays A.
21.4 PHEindicatormethods package
Une autre façon de calculer les taux standardisés est avec le paquet PHEindicatormethods. Ce package vous permet de calculer les taux standardisés directement et indirectement. Nous allons montrer les deux.
Cette section utilisera le cadre de données all_data
créé à la fin de la section Préparation. Ce cadre de données inclut les populations des pays, les événements de décès, et la population de référence standard mondiale. Vous pouvez le visualiser ici.
Taux directement standardisés
Ci-dessous, nous regroupons d’abord les données par Pays, puis nous les passons à la fonction phe_dsr()
pour obtenir les taux directement standardisés par pays.
A noter - la population de référence (standard) peut être fournie comme une colonne dans le cadre de données spécifique au pays ou comme un vecteur séparé. Si elle est fournie dans le cadre de données spécifique au pays, vous devez définir stdpoptype = "field"
. Si elle est fournie sous forme de vecteur, définissez stdpoptype = "vector"
. Dans ce dernier cas, vous devez vous assurer que l’ordre des rangées par strate est similaire dans le cadre de données spécifique au pays et dans la population de référence, car les enregistrements seront appariés par position. Dans notre exemple ci-dessous, nous avons fourni la population de référence sous forme de colonne dans le cadre de données spécifique au pays.
Consultez l’aide de ?phe_dsr
ou les liens dans la section Références pour plus d’informations.
# Calculez les taux par pays directement normalisés pour l'âge et le sexe.
<- all_data %>%
mortality_ds_rate_phe group_by(Country) %>%
::phe_dsr(
PHEindicatormethodsx = Deaths, # colonne avec le nombre d'événements observés
n = Population, # colonne avec les pops non standard pour chaque strate
stdpop = pop, # populations standard pour chaque strate
stdpoptype = "field") # soit "vector" pour un vecteur autonome, soit "field" pour signifier que les populations std sont dans les données.
# Imprimer le tableau
::kable(mortality_ds_rate_phe) knitr
Country | total_count | total_pop | value | lowercl | uppercl | confidence | statistic | method |
---|---|---|---|---|---|---|---|---|
A | 11344 | 86790567 | 23.56686 | 23.08107 | 24.05944 | 95% | dsr per 100000 | Dobson |
B | 9955 | 52898281 | 19.32549 | 18.45516 | 20.20882 | 95% | dsr per 100000 | Dobson |
Taux standardisés indirectement
Pour la standardisation indirecte, vous avez besoin d’une population de référence avec le nombre de décès et le nombre de population par strate. Dans cet exemple, nous allons calculer les taux pour le pays A en utilisant le pays B comme population de référence, car la population de référence standard_pop_clean
n’inclut pas le nombre de décès par strate.
Ci-dessous, nous créons d’abord la population de référence du pays B. Ensuite, nous passons les données de mortalité et de population pour le pays A, nous les combinons avec la population de référence, et nous les passons à la fonction phe_isr()
, pour obtenir des taux indirectement standardisés. Bien sûr, vous pouvez aussi faire l’inverse.
A noter - dans notre exemple ci-dessous, la population de référence est fournie comme un cadre de données séparé. Dans ce cas, nous nous assurons que les vecteurs x =
, n =
, x_ref =
et n_ref =
sont tous ordonnés par les mêmes valeurs de catégorie de standardisation (strate) que celles de notre cadre de données spécifique au pays, puisque les enregistrements seront appariés par position.
Consultez l’aide de ?phe_isr
(maintenant calculate_ISRate
depuis dec 2022) ou les liens dans la section Références pour plus d’informations.
# Créez la population de référence
<- country_data %>%
refpopCountryB filter(Country == "B")
# Calculer les taux pour le pays A indirectement standardisés par âge et sexe
<- country_data %>%
mortality_is_rate_phe_A filter(Country == "A") %>%
::calculate_ISRate( #avant c'etait phe_isr()
PHEindicatormethodsx = Deaths, # colonne avec le nombre d'événements observés
n = Population, # colonne avec les pops non standard pour chaque strate
x_ref = refpopCountryB$Deaths, # nombre de décès de référence pour chaque strate
n_ref = refpopCountryB$Population) # population de référence pour chaque strate
# Imprimez le tableau
::kable(mortality_is_rate_phe_A) knitr
observed | expected | ref_rate | value | lowercl | uppercl | confidence | statistic | method |
---|---|---|---|---|---|---|---|---|
11344 | 15847.42 | 18.81914 | 13.47123 | 13.22446 | 13.72145 | 95% | indirectly standardised rate per 100000 | Byars |
21.5 Ressources
Si vous souhaitez voir un autre exemple reproductible utilisant dsr, veuillez consulter cette vignette.
Pour un autre exemple utilisant PHEindicatormethods, veuillez vous rendre sur ce site Web
Voir les PHEindicatormethods fichier pdf de référence