Review ask

As a clinical trial statistician or programmer, answer two short questions in Your review: the task and the inputs. Agreeing with both approves this benchmark; disagreeing with either needs a comment. Propose a fix with the Edit button on any source file, or add it to your comments.

We suggest spending no more than 5 minutes on a review. The other tabs beside Your review are background for assessment, not under review.

Summary

Lifecycle: reviewedEditUnder review
What this benchmark means
README.md

Public entries: Python and R. Passing coverage requires an installed inventory.

Goal: carry the analysis date (ADT), study day (ADY), and measured value (AVAL) through from a pre-derived ADVS slice (ADVS_RAW), placing each record in the analysis window its study day falls in.

Input: pre-derived ADVS slice carrying analysis date (ADT), study day (ADY), and measured value (AVAL).

Variables:

  • AVISIT would be the analysis window the study day falls in: SCREENING before day 0, BASELINE on days 0 and 1, WEEK 2 on days 2 to 21, WEEK 4 on days 22 to 42, and POST-TREATMENT from day 43; blank when the study day is missing, so the record belongs to no window.

Note: a record is identified here by study, subject, parameter, and analysis window. With nothing else choosing the rows, those identities are the rows, so they are settled before any other value is computed. The window is placed from the study day, which is one of those other values, so the run is rejected before any data is read and no artifact is accepted. Even if the window read the slice's study day directly, a record with no study day would have no window and so no identity. The expected file shows the intended rows, not an accepted result.

How to fix

Decide which keys the dataset is on. If it is one record per analysis visit, every record must fall in a window. Recover the analysis date in the governed source where it is available. Where it is not, keep the record out of the dataset rather than give it a place it does not have. A row template selects the records that become rows, and each row then comes from one kept record, so its window can be placed from its study day. Move one column's derivation into it and leave the rest where they are:

columns:
  - name: AVAL
    type: float

rows:
  - id: windowed
    filter: "ADVS_RAW.ADY IS NOT NULL"
    derivations:
      AVAL: ADVS_RAW.AVAL

If it is one record per collected record, identify rows by the collected record instead, and a record with no window keeps an empty one:

keys: [STUDYID, USUBJID, PARAMCD, VSSEQ]

Do not label the record into a placeholder window such as NOT ASSIGNED. That keeps the row by asserting an analysis visit the data does not support, and a second such record collides with the first.

Expected failure

Edit
the run is rejected; no artifact is accepted
expected/error.yaml
phase
validation
condition
key_dependency
rule
COLUMN-7
expected/error.yaml
phase: validation
condition: key_dependency
spec_paths:
  - columns.AVISIT.derivation
rule: COLUMN-7
context:
  column: AVISIT
  dependency: ADY

Inputs

Under review
1 source file

input/advs_raw.csv

Edit
9 rows
input/advs_raw.csv
STUDYIDUSUBJIDPARAMCDVSSEQADTADYAVAL
YAMAA-01SYSBP12025-01-081132
YAMAA-01SYSBP22025-01-2215138
YAMAA-01SYSBP32025-02-0529130
YAMAA-01SYSBP42025-02-1943128
YAMAA-01SYSBP12025-02-081118
YAMAA-01SYSBP22025-02-2114122
YAMAA-01SYSBP3——120
YAMAA-01SYSBP12025-01-02-5140
YAMAA-01SYSBP22025-01-070136

Unexpected Output

Under review
9 rows presented to the failing check - not an accepted artifact

expected/advs.csv

Edit
9 rows
expected/advs.csv
STUDYIDUSUBJIDPARAMCDVSSEQADTADYAVALAVISIT
YAMAA-01SYSBP12025-01-081132BASELINE
YAMAA-01SYSBP22025-01-2215138WEEK 2
YAMAA-01SYSBP32025-02-0529130WEEK 4
YAMAA-01SYSBP42025-02-1943128POST-TREATMENT
YAMAA-01SYSBP12025-02-081118BASELINE
YAMAA-01SYSBP22025-02-2114122WEEK 2
YAMAA-01SYSBP3——120—
YAMAA-01SYSBP12025-01-02-5140SCREENING
YAMAA-01SYSBP22025-01-070136BASELINE
Shaded columns are derived— = missing value

Human review and assessment

Your review

2 questions and your comments · View benchmark discussions

Mapping spec

Generated from the benchmark YAML; do not edit by hand

Dataset NameVariable NameVariable LabelTypeCodelist/Controlled TermsCoreComputational MethodOrigin
ADVSSTUDYIDStudy IdentifiercharacterCopy value from ADVS_RAW.STUDYID.Predecessor
ADVSUSUBJIDUnique Subject IdentifiercharacterCopy value from ADVS_RAW.USUBJID.Predecessor
ADVSPARAMCDParameter CodecharacterCopy value from ADVS_RAW.PARAMCD.Predecessor
ADVSVSSEQSequence NumbernumericCopy value from ADVS_RAW.VSSEQ.Predecessor
ADVSADTAnalysis DatenumericISO 8601Copy value from ADVS_RAW.ADT.Predecessor
ADVSADYAnalysis Relative DaynumericCopy value from ADVS_RAW.ADY.Predecessor
ADVSAVALAnalysis ValuenumericCopy value from ADVS_RAW.AVAL.Predecessor
ADVSAVISITAnalysis VisitcharacterBand ADY at 0, 2, 22, 43 into "SCREENING", "BASELINE", "WEEK 2", "WEEK 4" and "POST-TREATMENT", intervals closed on the left.Derived
VersionDateAuthorDescriptionReviewerSign-off
1.72026-10-20yamaa docs buildRead a specification in the 1.0 surface as its 0.5 counterpart; state that missing values stay missing where a mapping declares no missing handler, and leave out a declared missing answer that restates a handler's default
1.62026-10-17yamaa docs buildDescribe collected date parts written as ISO 8601 date text and times of day counted in seconds since midnight
1.52026-10-17yamaa docs buildName collected precision in words instead of letter codes; state imputation fallbacks, minimum source precision, bounds ignored outside the collected period, and invalid text with no handler as an error; describe date and datetime shifts, imputation flag codes, and partial text giving no date part
1.42026-10-15yamaa docs buildState datetime precision codes through the hour and minute, and complete only the time parts a collected datetime lacks
1.32026-09-29yamaa docs buildShow study codelist names, external dictionaries, and ISO 8601 formats in variable rows; list the document's codelist values and metadata
1.22026-09-29yamaa docs buildClassify ADaM copies from a declared input as Predecessor and recodes as Derived, and SDTM recodes of locally derived columns as Derived
1.12026-09-29yamaa docs buildResolve lookups into the donor record they select, and give every derivation shape a plain-language rule instead of its raw YAML
1.0yamaa docs buildInitial generation from spec.yaml