Stage 3: data standards
SDTM-like inputs, ADaM with admiral, specification checks and XPT
Synthetic data only: simulated for this worked example; not real trial data and not a regulatory deliverable.
SDTM-like source domains are simulated by 03_adam/01_sdtm.R, which reuses the sim_lifecycle/ priors and one-compartment model (N = 40, seed 2026) and takes each participant's sequence from the stage 1 randomization schedule. ADaM datasets are derived with admiral 1.5.0 following its ad_adsl.R, ad_adpc.R, ad_adpp.R and ad_adae.R templates, checked against the specification with metacore 0.3.0 and metatools 0.3.0, and written as SAS XPORT v5 with xportr 0.6.0.
SDTM-like inputs
| Domain | Records | Content | File |
|---|---|---|---|
| DM | 40 | Demographics and reference dates | dm.csv |
| EX | 79 | One record per dose (Test or Reference) | ex.csv |
| PC | 1185 | Plasma concentrations at actual sampling times; BLQ as text | pc.csv |
| AE | 32 | Adverse events from the sim_lifecycle priors | ae.csv |
| VS | 80 | Screening height and weight | vs.csv |
| DS | 120 | Consent, randomization and disposition | ds.csv |
| PP | 1027 | PK parameters from the NCA in stage 4 (derived, then fed back into ADPP) | pp.csv |
Files: dm.csv, ex.csv, pc.csv, ae.csv, vs.csv, ds.csv, pp.csv, scenarios.json. No LB domain: no output in this example needs laboratory data.
Documented scenarios that exercise the SAP rules
| Participant | Scenario |
|---|---|
| SIMBE01-101-017 | withdraws consent after Period 1 (no Period 2 dose) |
| SIMBE01-101-029 | vomits 45 minutes after the Period 2 dose |
| SIMBE01-101-008 | measurable Period 2 pre-dose concentration at 2.5% of that period's Cmax (below the 5% rule) |
| SIMBE01-101-035 | 12 h sample in Period 1 not collected |
| SIMBE01-101-012 | 4 h sample in Period 1 drawn 25 minutes late |
| SIMBE01-101-024 | 6 h sample in Period 2 reported below the LLOQ between quantifiable samples (a simulated sample-handling problem; no reassay) |
ADaM datasets
| Dataset | Records | Variables | Template |
|---|---|---|---|
| ADSL | 40 | 54 | ad_adsl.R pattern; derive_vars_period() for the crossover |
| ADPC | 1264 | 52 | ad_adpc.R, step by step (adaptations listed below) |
| ADPP | 1027 | 34 | ad_adpp.R; SAP exclusion rules |
| ADAE | 32 | 31 | ad_adae.R pattern; period from create_period_dataset() |
- adsl.xptSAS XPORT v5 (xportr_write) csv Dataset-JSON
- adpc.xptSAS XPORT v5 (xportr_write) csv Dataset-JSON
- adpp.xptSAS XPORT v5 (xportr_write) csv Dataset-JSON
- adae.xptSAS XPORT v5 (xportr_write) csv Dataset-JSON
Template adaptations in ADPC (each one commented in 03_adam/03_adpc.R)
- The analyte name joins PC and EX, because EXTRT carries the formulation (
SIMDRUG TESTorSIMDRUG REFERENCE). - A pre-dose sample belongs to the dose that follows it (ARRLT below 0, NRRLT = 0), as the template's DTYPE COPY records do for repeated dosing.
- BLQ values are 0 in AVAL (SAP, ICH M13A); the template's LLOQ/2 records are not created.
- The sample that was not collected stays in ADPC with ANL01FL not Y, so a listing can show it.
derive_var_nfrlt()andconvert_xxtpt_to_hours()are labeled EXPERIMENTAL in admiral 1.5.0; NFRLT is re-derived by plain arithmetic in stage 5 (Q4).
Specification
adam_spec.xlsx uses the Pinnacle 21 specification layout (Study, Datasets, Variables, ValueLevel, WhereClauses, Codelists, Dictionaries, Methods, Comments, Documents), which metacore::spec_to_metacore() reads. adam_spec.json holds the same tables for scripts and diffs. Both come from one definition in 03_adam/spec/build_spec.R. Variable labels follow CDISC naming (for example USUBJID, "Unique Subject Identifier").
Metadata checks (executed)
| dataset | check | pass | detail |
|---|---|---|---|
| ADSL | metatools::check_variables (strict) | pass | 54 variables in data, 54 in spec |
| ADSL | metatools::check_ct_data | pass | all values in their codelists |
| ADSL | metatools::check_unique_keys | pass | STUDYID, USUBJID |
| ADSL | text values fit the spec lengths | pass | 34 text variables |
| ADSL | mandatory variables populated | pass | 48 mandatory variables |
| ADSL | XPT v5 read back: names, order and labels match the spec | pass | 40 rows x 54 columns; dataset label 'Subject-Level Analysis Dataset' |
| ADPC | metatools::check_variables (strict) | pass | 52 variables in data, 52 in spec |
| ADPC | metatools::check_ct_data | pass | all values in their codelists |
| ADPC | metatools::check_unique_keys | pass | STUDYID, USUBJID, ASEQ |
| ADPC | text values fit the spec lengths | pass | 30 text variables |
| ADPC | mandatory variables populated | pass | 35 mandatory variables |
| ADPC | XPT v5 read back: names, order and labels match the spec | pass | 1264 rows x 52 columns; dataset label 'PK Concentrations Analysis Dataset' |
| ADPP | metatools::check_variables (strict) | pass | 34 variables in data, 34 in spec |
| ADPP | metatools::check_ct_data | pass | all values in their codelists |
| ADPP | metatools::check_unique_keys | pass | STUDYID, USUBJID, APERIOD, PARAMCD |
| ADPP | text values fit the spec lengths | pass | 24 text variables |
| ADPP | mandatory variables populated | pass | 26 mandatory variables |
| ADPP | XPT v5 read back: names, order and labels match the spec | pass | 1027 rows x 34 columns; dataset label 'PK Parameters Analysis Dataset' |
| ADAE | metatools::check_variables (strict) | pass | 31 variables in data, 31 in spec |
| ADAE | metatools::check_ct_data | pass | all values in their codelists |
| ADAE | metatools::check_unique_keys | pass | STUDYID, USUBJID, ASEQ |
| ADAE | text values fit the spec lengths | pass | 20 text variables |
| ADAE | mandatory variables populated | pass | 30 mandatory variables |
| ADAE | XPT v5 read back: names, order and labels match the spec | pass | 32 rows x 31 columns; dataset label 'Adverse Events Analysis Dataset' |
Gap: not authored here. No define.xml and no Analysis Data Reviewer's Guide (ADRG). No Pinnacle 21 or CDISC CORE conformance run: the checks above test the datasets against this study's own specification. The source domains are SDTM-like (no trial design domains, no SUPP datasets). The Dataset-JSON v1.1 copies are a demonstration: FDA has not accepted Dataset-JSON as of Oct 2026, and SAS XPORT v5 remains the submission format.