
Créer l’ADAE en R avec admiral : événements indésirables
Dérivez un ADAE conforme au CDISC — la structure d’occurrence OCCDS, l’indicateur d’apparition sous traitement TRTEMFL et les indicateurs d’occurrence — à partir du SDTM avec admiral, puis résumez les événements indésirables par bras de traitement et classe de système d’organes
Un tutoriel complet et exécutable pour l’ADAE, le jeu de données d’analyse des événements indésirables. Découvrez la structure d’occurrence OCCDS de l’ADaM (une ligne par enregistrement d’événement indésirable, pas une par sujet), dérivez un ADAE conforme en R à partir d’un ADSL pré-construit et du domaine AE du SDTM avec admiral : fusionnez les variables de traitement avec derive_vars_merged(), imputez les dates d’analyse avec derive_vars_dt(), construisez l’indicateur d’apparition sous traitement TRTEMFL avec derive_var_trtemfl(), ajoutez les indicateurs en cours de traitement et de première occurrence, et produisez une synthèse de base des événements indésirables par bras de traitement et classe de système d’organes — sur des données pharmaverse publiques, pour que chaque ligne s’exécute.
- L’ADAE est le jeu de données derrière chaque tableau d’événements indésirables. Il contient une ligne par enregistrement d’événement indésirable — la structure d’occurrence OCCDS — donc un sujet qui rapporte trois événements a trois lignes, contrairement à l’ossature un-sujet-par-ligne de l’ADSL.
- Vous le construisez à partir du domaine AE du SDTM et de l’ADSL. Le domaine AE brut fournit les événements ; l’ADSL fournit les dates de traitement et les variables d’analyse, fusionnées sur chaque enregistrement AE avec
derive_vars_merged(). TRTEMFLest la variable qui compte le plus. L’indicateur d’apparition sous traitement marque les EI qui ont commencé le jour de la première dose ou après — ceux que les tableaux de sécurité comptent réellement.derive_var_trtemfl()le dérive à partir de la date d’analyse et de la fenêtre de traitement.- Les indicateurs d’occurrence désignent une ligne à compter.
derive_var_extreme_flag()marque le premier événement apparu sous traitement par sujet (AOCCFL) et par classe de système d’organes (AOCCSFL), de sorte qu’un tableau « sujets avec ≥1 EI » compte chaque sujet une seule fois. - La classe de système d’organes et le terme préféré sont déjà codés. L’ADAE lit
AEBODSYS(SOC) etAEDECOD(terme préféré) directement depuis le domaine AE du SDTM — aucune recherche dans le dictionnaire MedDRA n’est nécessaire pour résumer les événements par système corporel.
Introduction
Chaque bilan de sécurité d’un rapport d’étude clinique — quels événements indésirables sont survenus, chez qui, à quelle fréquence et dans quel bras — est calculé à partir d’un seul jeu de données d’analyse : l’ADAE, le jeu de données ADaM (Analysis Data Model) des événements indésirables. Avant qu’un seul tableau de synthèse des EI ou listing des événements apparus sous traitement puisse être produit, quelqu’un doit transformer le domaine AE brut et désordonné en un ADAE prêt pour l’analyse : de vraies dates d’analyse, un indicateur d’apparition sous traitement, des indicateurs d’occurrence et les variables de traitement par lesquelles chaque tableau se décline.
L’ADAE est le premier jeu de données où apparaît la structure d’occurrence : contrairement à l’ADSL, qui porte exactement une ligne par sujet, l’ADAE porte une ligne par enregistrement d’événement indésirable. Cette seule différence structurelle commande tout — comment marquer l’apparition sous traitement, comment compter les « sujets avec un événement » sans double comptage, et comment résumer par système corporel. Cette leçon construit un ADAE conforme en R avec admiral, le package du pharmaverse pour la dérivation ADaM, en travaillant sur des données d’exemple pharmaverse publiques afin que chaque ligne s’exécute telle quelle. La construction suit la vignette officielle OCCDS / ADAE d’admiral, réécrite en un seul parcours guidé.
Voici où nous allons — les événements indésirables apparus sous traitement par classe de système d’organes et par bras, calculés directement à partir de l’ADAE que nous dérivons :
Cette figure se lit à partir de trois colonnes de l’ADAE — AEBODSYS, TRT01A et TRTEMFL — plus une ligne par événement. À la fin de cette leçon, vous aurez dérivé les indicateurs dont elle dépend. Si « ADaM », « OCCDS » ou « SDTM » vous sont nouveaux, commencez par les standards CDISC, qui situe où l’ADAE se place ; cette leçon suppose que vous avez un ADSL construit, l’ossature au niveau du sujet que produit la leçon ADSL.
Ce qu’est l’ADAE
L’ADAE repose sur la structure OCCDS — la structure ADaM pour les données d’occurrence définie par CDISC pour les événements qui surviennent plutôt que d’être mesurés : événements indésirables (ADAE), médicaments concomitants (ADCM), antécédents médicaux (ADMH). Sa règle déterminante est celle qui prend de court les personnes venant de l’ADSL :
- L’ADSL est une ligne par sujet.
- OCCDS / ADAE est une ligne par enregistrement — une ligne par événement indésirable. Un sujet avec cinq événements indésirables a cinq lignes.
- BDS (la structure d’ADTTE, ADLB, ADVS) est une ligne par sujet, par paramètre, par moment d’analyse, indexée par
PARAMCD.
Ce choix structurel explique pourquoi l’ADAE a besoin d’indicateurs plutôt que d’une valeur unique par sujet : avec de nombreuses lignes par sujet, vous marquez les lignes qui comptent (apparues sous traitement, en cours de traitement) et la ligne à compter une fois (première occurrence), au lieu de tout réduire à un seul nombre.
Les colonnes se répartissent en quelques groupes. Voici les colonnes porteuses que cette leçon dérive ou transporte :
| Groupe | Variables | Ce qu’elles contiennent |
|---|---|---|
| Sujet & traitement (depuis l’ADSL) | STUDYID, USUBJID, TRT01A, TRTA, TRTSDT, TRTEDT |
Clés du sujet plus les variables et dates de traitement fusionnées depuis l’ADSL. |
| L’événement (depuis le domaine AE du SDTM) | AETERM, AEDECOD, AEBODSYS, AESEV, AESER, AESEQ |
Terme rapporté, le terme préféré codé (AEDECOD) et la classe de système d’organes (AEBODSYS), la sévérité, la gravité. |
| Dates d’analyse | ASTDT, AENDT, ASTDY, AENDY, ADURN, ADURU |
Le début/la fin de l’EI comme vraies dates d’analyse, le jour d’étude relatif à la première dose, et la durée de l’événement. |
| Indicateurs temporels | TRTEMFL, ONTRTFL |
Indicateurs "Y"/NA marquant les événements apparus sous traitement et en cours de traitement. |
| Indicateurs d’occurrence | AOCCFL, AOCCSFL |
Indicateurs "Y"/NA marquant le premier événement apparu sous traitement par sujet et par classe de système d’organes. |
| Valeurs d’analyse | ASEV, AREL |
Copies d’analyse de la sévérité et de la relation, gardées distinctes de la source SDTM afin que le SDTM reste intact. |
Deux conventions méritent d’être fixées d’emblée :
AEDECODetAEBODSYSarrivent déjà codés. Dans le domaine AE du SDTM, le terme préféré (AEDECOD) et la classe de système d’organes (AEBODSYS) sont renseignés par l’étape de codage MedDRA (Medical Dictionary for Regulatory Activities) de l’étude avant l’ADaM. L’ADAE les lit comme des colonnes ordinaires — vous pouvez donc résumer par système corporel sans dictionnaire sous la main, et cette leçon n’embarque aucune terminologie MedDRA sous licence.- Un indicateur vaut
"Y"ou est manquant, pas"Y"/"N". Les indicateurs d’occurrence et temporels de l’ADaM sont renseignés"Y"pour les enregistrements qui qualifient et laissés àNAsinon (la convention OCCDS), de sorte que le code en aval filtre avecTRTEMFL == "Y"et qu’un comptage des"Y"est le comptage qui compte.
L’essai que nous utilisons est l’étude pilote CDISC livrée dans pharmaversesdtm et pharmaverseadam — une étude à bras parallèles synthétique et libre de licence comparant un placebo à deux doses de Xanomeline, administré sous forme de patch transdermique.
Les données sources
admiral construit l’ADAE à partir de deux entrées : le domaine AE brut (les événements) et un ADSL pré-construit (l’ossature de traitement et de dates au niveau du sujet). Nous prenons l’ADSL tout prêt depuis pharmaverseadam pour que cette leçon reste centrée sur le côté AE ; la leçon ADSL montre comment cette ossature est construite.
library(admiral)
library(dplyr, warn.conflicts = FALSE)
library(pharmaversesdtm)
library(pharmaverseadam)
library(lubridate)
library(stringr)
# ADSL — one row per subject, the treatment + date backbone
adsl <- pharmaverseadam::adsl
# AE — the raw adverse-event domain, one row per reported event.
# convert_blanks_to_na() turns SDTM's empty strings "" into proper NA.
ae <- pharmaversesdtm::ae %>% convert_blanks_to_na()
ae %>%
select(USUBJID, AETERM, AEDECOD, AEBODSYS, AESEV, AESTDTC) %>%
head(5)# A tibble: 5 × 6
USUBJID AETERM AEDECOD AEBODSYS AESEV AESTDTC
<chr> <chr> <chr> <chr> <chr> <chr>
1 01-701-1015 APPLICATION SITE ERYTHEMA APPLIC… GENERAL… MILD 2014-0…
2 01-701-1015 APPLICATION SITE PRURITUS APPLIC… GENERAL… MILD 2014-0…
3 01-701-1015 DIARRHOEA DIARRH… GASTROI… MILD 2014-0…
4 01-701-1023 ATRIOVENTRICULAR BLOCK SECOND DEGR… ATRIOV… CARDIAC… MILD 2012-0…
5 01-701-1023 ERYTHEMA ERYTHE… SKIN AN… MILD 2012-0…
Chaque ligne AE est un événement rapporté : un AETERM verbatim, ses AEDECOD/AEBODSYS codés, une sévérité, et une date de début sous forme de caractère AESTDTC (une chaîne ISO qui peut être partielle). convert_blanks_to_na() est la première étape essentielle — le SDTM utilise des chaînes vides pour les valeurs manquantes, et les fonctions de date et de fusion d’admiral attendent un vrai NA.
Fusionner les variables de traitement de l’ADSL sur chaque AE
L’ADAE a besoin des dates de traitement et du bras de traitement de chaque sujet sur chacune de ses lignes AE, car l’apparition sous traitement est définie par rapport à la première dose. derive_vars_merged() copie les variables ADSL choisies sur chaque enregistrement AE correspondant, par sujet.
adsl_vars <- exprs(TRTSDT, TRTEDT, TRT01A, TRT01P, DTHDT, EOSDT, AGE, SEX, RACE)
adae <- ae %>%
derive_vars_merged(
dataset_add = adsl,
new_vars = adsl_vars,
by_vars = exprs(STUDYID, USUBJID)
)
adae %>%
select(USUBJID, AEDECOD, TRT01A, TRTSDT, TRTEDT) %>%
head(5)# A tibble: 5 × 5
USUBJID AEDECOD TRT01A TRTSDT TRTEDT
<chr> <chr> <chr> <date> <date>
1 01-701-1015 APPLICATION SITE ERYTHEMA Placebo 2014-01-02 2014-07-02
2 01-701-1015 APPLICATION SITE PRURITUS Placebo 2014-01-02 2014-07-02
3 01-701-1015 DIARRHOEA Placebo 2014-01-02 2014-07-02
4 01-701-1023 ATRIOVENTRICULAR BLOCK SECOND DEGREE Placebo 2012-08-05 2012-09-01
5 01-701-1023 ERYTHEMA Placebo 2012-08-05 2012-09-01
Comme l’ADSL a une ligne par sujet et que l’AE en a plusieurs, c’est une fusion un-à-plusieurs : l’unique enregistrement ADSL se déploie sur toutes les lignes AE d’un sujet. TRTSDT (première dose) et TRTEDT (dernière dose) sont les deux dates qui définissent la fenêtre de traitement dont nous avons besoin ensuite.
Dériver les dates d’analyse
Le début et la fin de l’EI arrivent sous forme de chaînes de caractères (AESTDTC, AEENDTC) qui peuvent être partielles — une valeur comme 2014-01 n’a pas de jour. derive_vars_dt() impute les parties manquantes et convertit chacune en une vraie date R. derive_vars_dy() calcule ensuite le jour d’étude relatif à la première dose, et derive_vars_duration() la durée de l’événement.
adae <- adae %>%
# AESTDTC -> ASTDT, imputing a missing day/month to the first; never before first dose
derive_vars_dt(
new_vars_prefix = "AST", dtc = AESTDTC,
highest_imputation = "M", min_dates = exprs(TRTSDT)
) %>%
# AEENDTC -> AENDT, imputing a missing day/month to the last; never after death / end of study
derive_vars_dt(
new_vars_prefix = "AEN", dtc = AEENDTC,
highest_imputation = "M", date_imputation = "last", max_dates = exprs(DTHDT, EOSDT)
) %>%
# ASTDY / AENDY: AE start/end as a study day relative to first dose (TRTSDT = day 1)
derive_vars_dy(reference_date = TRTSDT, source_vars = exprs(ASTDT, AENDT)) %>%
# ADURN / ADURU: how many days the event lasted, with its unit
derive_vars_duration(new_var = ADURN, new_var_unit = ADURU, start_date = ASTDT, end_date = AENDT)
adae %>%
select(USUBJID, AESTDTC, ASTDT, ASTDY, AENDT, ADURN, ADURU) %>%
head(5)# A tibble: 5 × 7
USUBJID AESTDTC ASTDT ASTDY AENDT ADURN ADURU
<chr> <chr> <date> <dbl> <date> <dbl> <chr>
1 01-701-1015 2014-01-03 2014-01-03 2 NA NA <NA>
2 01-701-1015 2014-01-03 2014-01-03 2 NA NA <NA>
3 01-701-1015 2014-01-09 2014-01-09 8 2014-01-11 3 DAYS
4 01-701-1023 2012-08-26 2012-08-26 22 NA NA <NA>
5 01-701-1023 2012-08-07 2012-08-07 3 2012-08-30 24 DAYS
Deux choix d’imputation encodent des règles cliniques. Une date de début s’impute au premier jour de la période et est bornée inférieurement par TRTSDT (min_dates), de sorte qu’un EI enregistré comme 2014-01 pour un sujet dosé le 2014-01-15 est lu comme 2014-01-15, jamais avant la première dose. Une date de fin s’impute au dernier jour de la période et est bornée supérieurement par le décès ou la fin de l’étude (max_dates), de sorte qu’elle ne dépasse jamais le moment où le sujet a quitté l’étude. ASTDY est le jour d’étude de l’EI — le jour 1 est la première dose — et ADURN est sa durée en jours. Rien de tout cela n’est de l’arithmétique de dates à la main.
Dériver l’indicateur d’apparition sous traitement (TRTEMFL)
C’est la variable pour laquelle l’ADAE existe. Un événement indésirable apparu sous traitement (TEAE) est un événement qui a commencé le jour de la première dose ou après (et, par convention, jusqu’à une fenêtre après la dernière dose) — les événements plausiblement attribuables au médicament à l’étude, et ceux que les tableaux de sécurité comptent. derive_var_trtemfl() compare les dates d’analyse de chaque EI à la fenêtre de traitement et met TRTEMFL à "Y" pour les événements apparus sous traitement.
adae <- adae %>%
derive_var_trtemfl(
start_date = ASTDT,
end_date = AENDT,
trt_start_date = TRTSDT,
trt_end_date = TRTEDT,
end_window = 30
)
adae %>%
select(USUBJID, ASTDT, TRTSDT, TRTEDT, TRTEMFL) %>%
head(5)# A tibble: 5 × 5
USUBJID ASTDT TRTSDT TRTEDT TRTEMFL
<chr> <date> <date> <date> <chr>
1 01-701-1015 2014-01-03 2014-01-02 2014-07-02 Y
2 01-701-1015 2014-01-03 2014-01-02 2014-07-02 Y
3 01-701-1015 2014-01-09 2014-01-02 2014-07-02 Y
4 01-701-1023 2012-08-26 2012-08-05 2012-09-01 Y
5 01-701-1023 2012-08-07 2012-08-05 2012-09-01 Y
adae %>% count(TRTEMFL)# A tibble: 2 × 2
TRTEMFL n
<chr> <int>
1 Y 1122
2 <NA> 69
end_window = 30 étend la période d’apparition sous traitement à 30 jours après la dernière dose — un choix courant pour qu’un événement à survenue tardive compte encore comme lié au médicament ; votre plan d’analyse statistique fixe la fenêtre exacte. Sur les 1191 enregistrements AE, 1122 sont apparus sous traitement et 69 ne le sont pas (ils ont commencé avant la première dose — des événements pré-traitement qui relèvent d’un listing d’antécédents médicaux, pas d’un tableau TEAE). À partir d’ici, TRTEMFL == "Y" est le filtre de chaque synthèse de sécurité.
Ajouter les indicateurs en cours de traitement et d’occurrence
Deux indicateurs supplémentaires achèvent l’ADAE prêt pour l’analyse. L’indicateur en cours de traitement (ONTRTFL) marque les événements qui tombent strictement à l’intérieur de la fenêtre de traitement — une coupe plus stricte que l’apparition sous traitement, utilisée pour les analyses en cours de traitement. Les indicateurs d’occurrence résolvent le problème de comptage que crée la structure OCCDS : avec de nombreuses lignes par sujet, quelle ligne comptez-vous pour un tableau « sujets avec ≥1 EI » ? derive_var_extreme_flag() marque le premier enregistrement qualifiant, et restrict_derivation() limite l’indicateur aux lignes apparues sous traitement.
adae <- adae %>%
# ONTRTFL: events within the treatment window (first dose to last dose + 30 days)
derive_var_ontrtfl(
start_date = ASTDT,
ref_start_date = TRTSDT,
ref_end_date = TRTEDT,
ref_end_window = 30
) %>%
# AOCCFL: first treatment-emergent AE per subject (count each subject once overall)
restrict_derivation(
derivation = derive_var_extreme_flag,
args = params(
by_vars = exprs(USUBJID),
order = exprs(ASTDT, AESEQ),
new_var = AOCCFL,
mode = "first"
),
filter = TRTEMFL == "Y"
) %>%
# AOCCSFL: first treatment-emergent AE per subject within each system organ class
restrict_derivation(
derivation = derive_var_extreme_flag,
args = params(
by_vars = exprs(USUBJID, AEBODSYS),
order = exprs(ASTDT, AESEQ),
new_var = AOCCSFL,
mode = "first"
),
filter = TRTEMFL == "Y"
)
adae %>% count(AOCCFL)# A tibble: 2 × 2
AOCCFL n
<chr> <int>
1 Y 217
2 <NA> 974
adae %>% count(AOCCSFL)# A tibble: 2 × 2
AOCCSFL n
<chr> <int>
1 Y 549
2 <NA> 642
AOCCFL == "Y" sur 217 lignes signifie que 217 sujets ont eu au moins un EI apparu sous traitement — marquez le premier événement par sujet, comptez l’indicateur, et chaque sujet est compté exactement une fois. AOCCSFL fait la même chose au sein de chaque AEBODSYS, de sorte qu’un tableau « sujets affectés, par classe de système d’organes » se lit à partir d’ AOCCSFL == "Y" sans double-compter un sujet qui a eu trois événements dans la même classe. Le wrapper restrict_derivation() est ce qui maintient les indicateurs sur les seules lignes apparues sous traitement — marquer un événement pré-traitement comme la « première occurrence » d’un sujet serait erroné.
Résumer les événements indésirables
Une fois les indicateurs en place, les synthèses de sécurité standard sont de courts filtres et comptages. Commencez par l’ étendue globale de l’exposition aux EI — combien de sujets de chaque bras ont eu au moins un événement apparu sous traitement — en utilisant l’indicateur d’occurrence par sujet.
teae <- adae %>% filter(TRTEMFL == "Y", TRT01A != "Screen Failure")
# subjects with >=1 TEAE per arm (AOCCFL counts each subject once)
teae %>%
filter(AOCCFL == "Y") %>%
count(TRT01A, name = "subjects_with_teae")# A tibble: 3 × 2
TRT01A subjects_with_teae
<chr> <int>
1 Placebo 65
2 Xanomeline High Dose 68
3 Xanomeline Low Dose 84
Soixante-cinq sujets sous placebo ont eu un EI apparu sous traitement, contre 68 et 84 sur les deux bras Xanomeline — les bras actifs affectent plus de sujets, comme attendu pour un médicament actif. Ensuite, les classes de système d’organes les plus fréquentes, en comptant les sujets une fois par classe avec AOCCSFL :
teae %>%
filter(AOCCSFL == "Y") %>%
count(AEBODSYS, sort = TRUE, name = "n_subjects") %>%
head(8)# A tibble: 8 × 2
AEBODSYS n_subjects
<chr> <int>
1 GENERAL DISORDERS AND ADMINISTRATION SITE CONDITIONS 108
2 SKIN AND SUBCUTANEOUS TISSUE DISORDERS 98
3 NERVOUS SYSTEM DISORDERS 53
4 GASTROINTESTINAL DISORDERS 51
5 CARDIAC DISORDERS 40
6 INFECTIONS AND INFESTATIONS 38
7 PSYCHIATRIC DISORDERS 28
8 RESPIRATORY, THORACIC AND MEDIASTINAL DISORDERS 27
Et les termes préférés les plus fréquents, en comptant les événements (chaque ligne TEAE, pas seulement les premières occurrences) :
teae %>%
count(AEDECOD, sort = TRUE, name = "n_events") %>%
head(8)# A tibble: 8 × 2
AEDECOD n_events
<chr> <int>
1 PRURITUS 78
2 APPLICATION SITE PRURITUS 77
3 ERYTHEMA 56
4 APPLICATION SITE ERYTHEMA 46
5 APPLICATION SITE IRRITATION 41
6 RASH 40
7 APPLICATION SITE DERMATITIS 36
8 DIZZINESS 31
Le tableau est cohérent et cliniquement évident : les troubles généraux et anomalies au site d’administration et les affections de la peau et du tissu sous-cutané dominent, et les principaux termes préférés sont le prurit et le prurit/érythème au site d’application. Le Xanomeline dans cette étude est un patch transdermique, de sorte que les réactions cutanées et au site d’application sont exactement le signal de sécurité attendu — et l’ADAE dérivé le fait ressortir directement. C’est là tout l’intérêt du jeu de données : une fois les indicateurs corrects, l’histoire des événements indésirables se déduit de quelques appels count().
Demandez à Prova « comment ajouter un indicateur de sévérité maximale à mon ADAE pour construire un tableau d’EI par pire grade de sévérité par sujet avec admiral ? » — elle répond en s’appuyant sur les leçons de ce pilier, avec du code admiral exécutable que vous pouvez essayer sur les données d’exemple pharmaverse. The runtime is the judge. Demander à Prova →
Problèmes fréquents
Vos comptages de TEAE sont trop élevés — des événements pré-traitement se glissent dedans. Vous avez filtré sur le domaine AE mais pas sur TRTEMFL. Un tableau d’EI doit filtrer TRTEMFL == "Y" ; sans cela, des événements qui ont commencé avant la première dose (des antécédents médicaux saisis comme EI) gonflent chaque comptage. Dérivez l’indicateur, puis filtrez dessus pour chaque synthèse de sécurité.
Un comptage de « sujets avec un EI » est plus grand que le nombre de sujets. Vous avez compté des lignes AE, pas des sujets. Comme l’ADAE a de nombreuses lignes par sujet, count(TRT01A) sur les lignes brutes compte les événements. Pour compter les sujets une fois, filtrez sur l’indicateur d’occurrence (AOCCFL == "Y" au total, AOCCSFL == "Y" par classe de système d’organes) — c’est exactement à cela que servent les indicateurs d’occurrence.
derive_var_trtemfl() signale une erreur d’ASTDTM/AENDTM manquants. Ses valeurs par défaut attendent des variables datetime. Si vous avez dérivé des variables date avec derive_vars_dt() (comme ici), passez-les explicitement : start_date = ASTDT, end_date = AENDT. La voie datetime (derive_vars_dtm() → ASTDTM/AENDTM) est l’alternative quand vous avez besoin de la composante heure.
Chaque comparaison avec une variable caractère SDTM se comporte bizarrement. Vous avez sauté convert_blanks_to_na(). Le SDTM utilise des chaînes vides "" pour les valeurs manquantes, donc is.na() renvoie FALSE sur elles et l’imputation de date s’étouffe. Exécutez toujours convert_blanks_to_na() sur le domaine AE d’abord.
Questions fréquentes
L’ADAE est le jeu de données d’analyse des événements indésirables — le jeu de données ADaM derrière chaque synthèse, listing et tableau d’événements apparus sous traitement. Il suit la structure d’occurrence OCCDS, qui est une ligne par enregistrement d’événement indésirable (un sujet avec trois événements a trois lignes), et il porte des variables de traitement fusionnées depuis l’ADSL plus des dates d’analyse et les indicateurs — TRTEMFL, AOCCFL — sur lesquels les analyses de sécurité filtrent.
Un événement indésirable apparu sous traitement est un événement qui a commencé le jour de la première dose du médicament à l’étude ou après (souvent étendu à une fenêtre après la dernière dose). Il sépare les événements plausiblement liés au traitement des affections préexistantes enregistrées avant l’administration. Dans l’ADAE, il est marqué par l’indicateur TRTEMFL ("Y" pour les événements apparus sous traitement), qu’admiral dérive avec derive_var_trtemfl() en comparant la date d’analyse de chaque EI à la fenêtre de traitement. Les tableaux de sécurité ne comptent que les événements apparus sous traitement.
Partez du domaine AE du SDTM et d’un ADSL pré-construit. Fusionnez les dates de traitement de l’ADSL sur chaque enregistrement AE avec derive_vars_merged(), convertissez les dates AE partielles en vraies dates avec derive_vars_dt(), dérivez l’indicateur d’apparition sous traitement avec derive_var_trtemfl(), ajoutez l’ indicateur en cours de traitement avec derive_var_ontrtfl(), et marquez les premières occurrences avec derive_var_extreme_flag() à l’intérieur de restrict_derivation(). La séquence complète est déroulée ci-dessus et suit la vignette OCCDS d’admiral.
Parce que l’ADAE utilise la structure d’occurrence OCCDS : une ligne par événement, pas par sujet. Un sujet qui rapporte cinq événements indésirables contribue cinq lignes. C’est l’inverse de l’ADSL, qui est une ligne par sujet. Pour compter les sujets (pour un tableau « sujets avec ≥1 EI »), vous marquez le premier événement qualifiant par sujet avec un indicateur d’occurrence (AOCCFL) et comptez l’indicateur — compter les lignes brutes compterait les événements, pas les sujets.
Non — pas pour le construire ou le résumer à partir des données pilotes ici. La classe de système d’organes (AEBODSYS) et le terme préféré (AEDECOD) sont codés dans le domaine AE du SDTM pendant l’étape de codage MedDRA de l’étude, avant l’ADaM. L’ADAE les lit comme des colonnes ordinaires, vous pouvez donc résumer les événements par système corporel ou par terme préféré sans dictionnaire. MedDRA (et la terminologie sous licence) compte quand vous réalisez le codage en amont du SDTM, ce qui est hors de la dérivation de l’ADAE.
TRTEMFL marque les événements apparus sous traitement — ceux qui ont commencé le jour de la première dose ou après, incluant généralement une fenêtre après la dernière dose, de sorte qu’un événement à survenue tardive compte encore. ONTRTFL marque les événements en cours de traitement — ceux qui tombent strictement à l’intérieur de la fenêtre de traitement. En cours de traitement est la coupe la plus stricte : tout événement en cours de traitement est apparu sous traitement, mais un événement apparu sous traitement dans la fenêtre de suivi post-traitement n’est pas en cours de traitement. Le choix de l’un ou l’autre dépend du plan d’analyse statistique.
Testez vos connaissances
En utilisant l’objet adae construit dans cette leçon, comptez combien de sujets ont eu au moins un EI grave apparu sous traitement, par bras de traitement. Les EI graves sont marqués par AESER == "Y" dans les données. Comptez chaque sujet une fois par bras.
Vous avez besoin d’apparu sous traitement et grave et chaque sujet compté une fois. Filtrez TRTEMFL == "Y" et AESER == "Y", puis comptez les sujets distincts par bras — distinct(USUBJID, TRT01A) avant count(TRT01A) réduit chaque sujet à une seule ligne. (Vous ne pouvez pas réutiliser AOCCFL ici : il marque le premier EI de n’importe quel type, qui peut ne pas être grave.)
adae %>%
filter(TRTEMFL == "Y", AESER == "Y", TRT01A != "Screen Failure") %>%
distinct(USUBJID, TRT01A) %>%
count(TRT01A, name = "subjects_with_serious_teae")Les EI graves sont bien plus rares que les EI en général, donc attendez-vous à de petits comptages dans chaque bras. L’idée clé est que AOCCFL n’aidera pas : il marque le premier événement apparu sous traitement d’un sujet quelle que soit la gravité, donc pour compter les sujets avec un événement grave vous devez filtrer sur AESER puis réduire vous-même aux sujets distincts. Dans un ADAE de production, vous dériveriez un indicateur d’occurrence grave dédié (derive_var_extreme_flag() restreint à TRTEMFL == "Y" & AESER == "Y") afin que le tableau soit un unique comptage d’indicateur.
A. Une ligne par sujet B. Une ligne par sujet par paramètre C. Une ligne par enregistrement d’événement indésirable (OCCDS)
C. L’ADAE utilise la structure d’occurrence OCCDS — une ligne par enregistrement d’événement indésirable, donc un sujet avec plusieurs événements a plusieurs lignes. A décrit l’ADSL (le jeu de données au niveau du sujet) et B décrit la Basic Data Structure (BDS) utilisée par ADTTE et ADLB. La structure d’occurrence est la raison pour laquelle l’ADAE s’appuie sur des indicateurs (TRTEMFL, AOCCFL) pour marquer quelles lignes compter.
Conclusion
L’ADAE transforme une pile brute d’enregistrements d’événements indésirables en un jeu de données prêt pour l’analyse en répondant à trois questions par ligne : quand l’événement s’est-il produit (les dates d’analyse ASTDT/AENDT et le jour d’étude ASTDY), compte-t-il comme apparu sous traitement (TRTEMFL, et le plus strict ONTRTFL), et est-ce la ligne à compter une fois (les indicateurs d’occurrence AOCCFL/AOCCSFL). admiral transforme chacune en une étape déclarative — derive_vars_merged(), derive_vars_dt(), derive_var_trtemfl(), derive_var_extreme_flag() — lisible et traçable jusqu’à la source AE du SDTM. Obtenez les bons indicateurs et chaque synthèse de sécurité est un court filter() plus count(), avec la classe de système d’organes et le terme préféré déjà codés dans les données. L’ADAE est le jeu de données qui fait des tableaux d’événements indésirables d’un rapport d’étude clinique quelques lignes de code au lieu d’un dédale de logique de dates.
Cette leçon est reproductible : chaque résultat de cette page a été produit par le code montré — copiez n’importe quel bloc et exécutez-le pour les reproduire. The runtime is the judge.
Leçons connexes
- Créer l’ADSL en R avec admiral — l’ossature au niveau du sujet dont cet ADAE fusionne ses dates de traitement et son bras. · Construire le jeu de données ADaM time-to-event (ADTTE) — réutilise exactement cette préparation de l’ADAE pour dériver le temps jusqu’au premier événement indésirable et exécuter une analyse de Kaplan-Meier. · Les standards CDISC : CDASH, SDTM, ADaM, Define-XML — où l’ADAE et la structure OCCDS se situent dans le modèle ADaM. · Le passage de SAS à R pour la programmation clinique — pourquoi admiral joue le rôle d’une bibliothèque de macros de dérivation validée.
- Où cela s’insère : les fondations réglementaires et CDISC → construire l’ADaM avec admiral (ADSL → ADAE — vous êtes ici → ADTTE et les jeux de données BDS) → produire les tableaux, listings et figures d’événements indésirables que livre chaque analyse de sécurité. L’ADAE est le jeu de données dont chaque synthèse d’EI part.
Réutilisation
Citation
@online{2026,
author = {},
title = {Créer l’ADAE en R avec admiral : événements indésirables},
date = {2026-06-30},
url = {https://www.datanovia.com/learn/pharma-clinical/03-adam-admiral/adae-adverse-events-admiral},
langid = {fr}
}