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.

Date de publication

30 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • 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().
  • TRTEMFL est 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) et AEDECOD (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 :

Grouped horizontal bar chart of the eight most frequent system organ classes for treatment-emergent adverse events, built from the derived ADAE dataset. For each system organ class, three bars give the number of subjects with at least one such event on Placebo (azure), Xanomeline High Dose (orange), and Xanomeline Low Dose (green). General disorders and administration-site conditions and skin and subcutaneous tissue disorders dominate, and the two active Xanomeline arms have far more subjects affected in those classes than placebo, the expected pattern for a transdermal patch.

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 :

  • AEDECOD et AEBODSYS arrivent 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 à NA sinon (la convention OCCDS), de sorte que le code en aval filtre avec TRTEMFL == "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().

🟢 Avec un agent IA

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.

Note

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.
Cette page vous a-t-elle été utile ?

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN

Réutilisation

Citation

BibTeX
@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}
}
Veuillez citer ce travail comme suit :
“Créer l’ADAE en R avec admiral : événements indésirables.” 2026. June 30. https://www.datanovia.com/learn/pharma-clinical/03-adam-admiral/adae-adverse-events-admiral.