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
README.mdPublic 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:
AVISITwould be the analysis window the study day falls in:SCREENINGbefore day 0,BASELINEon days 0 and 1,WEEK 2on days 2 to 21,WEEK 4on days 22 to 42, andPOST-TREATMENTfrom 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
Editthe run is rejected; no artifact is acceptedexpected/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 review1 source fileinput/advs_raw.csv
Edit9 rows| STUDYID | USUBJID | PARAMCD | VSSEQ | ADT | ADY | AVAL |
|---|---|---|---|---|---|---|
| YAMAA-01 | SYSBP | 1 | 2025-01-08 | 1 | 132 | |
| YAMAA-01 | SYSBP | 2 | 2025-01-22 | 15 | 138 | |
| YAMAA-01 | SYSBP | 3 | 2025-02-05 | 29 | 130 | |
| YAMAA-01 | SYSBP | 4 | 2025-02-19 | 43 | 128 | |
| YAMAA-01 | SYSBP | 1 | 2025-02-08 | 1 | 118 | |
| YAMAA-01 | SYSBP | 2 | 2025-02-21 | 14 | 122 | |
| YAMAA-01 | SYSBP | 3 | — | — | 120 | |
| YAMAA-01 | SYSBP | 1 | 2025-01-02 | -5 | 140 | |
| YAMAA-01 | SYSBP | 2 | 2025-01-07 | 0 | 136 |
Unexpected Output
Under review9 rows presented to the failing check - not an accepted artifactexpected/advs.csv
Edit9 rows| STUDYID | USUBJID | PARAMCD | VSSEQ | ADT | ADY | AVAL | AVISIT |
|---|---|---|---|---|---|---|---|
| YAMAA-01 | SYSBP | 1 | 2025-01-08 | 1 | 132 | BASELINE | |
| YAMAA-01 | SYSBP | 2 | 2025-01-22 | 15 | 138 | WEEK 2 | |
| YAMAA-01 | SYSBP | 3 | 2025-02-05 | 29 | 130 | WEEK 4 | |
| YAMAA-01 | SYSBP | 4 | 2025-02-19 | 43 | 128 | POST-TREATMENT | |
| YAMAA-01 | SYSBP | 1 | 2025-02-08 | 1 | 118 | BASELINE | |
| YAMAA-01 | SYSBP | 2 | 2025-02-21 | 14 | 122 | WEEK 2 | |
| YAMAA-01 | SYSBP | 3 | — | — | 120 | — | |
| YAMAA-01 | SYSBP | 1 | 2025-01-02 | -5 | 140 | SCREENING | |
| YAMAA-01 | SYSBP | 2 | 2025-01-07 | 0 | 136 | BASELINE |
Human review and assessment
| Dataset Name | Variable Name | Variable Label | Type | Codelist/Controlled Terms | Core | Computational Method | Origin |
|---|---|---|---|---|---|---|---|
| ADVS | STUDYID | Study Identifier | character | Copy value from ADVS_RAW.STUDYID. | Predecessor | ||
| ADVS | USUBJID | Unique Subject Identifier | character | Copy value from ADVS_RAW.USUBJID. | Predecessor | ||
| ADVS | PARAMCD | Parameter Code | character | Copy value from ADVS_RAW.PARAMCD. | Predecessor | ||
| ADVS | VSSEQ | Sequence Number | numeric | Copy value from ADVS_RAW.VSSEQ. | Predecessor | ||
| ADVS | ADT | Analysis Date | numeric | ISO 8601 | Copy value from ADVS_RAW.ADT. | Predecessor | |
| ADVS | ADY | Analysis Relative Day | numeric | Copy value from ADVS_RAW.ADY. | Predecessor | ||
| ADVS | AVAL | Analysis Value | numeric | Copy value from ADVS_RAW.AVAL. | Predecessor | ||
| ADVS | AVISIT | Analysis Visit | character | Band ADY at 0, 2, 22, 43 into "SCREENING", "BASELINE", "WEEK 2", "WEEK 4" and "POST-TREATMENT", intervals closed on the left. | Derived |
| Version | Date | Author | Description | Reviewer | Sign-off |
|---|---|---|---|---|---|
| 1.7 | 2026-10-20 | yamaa docs build | Read 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.6 | 2026-10-17 | yamaa docs build | Describe collected date parts written as ISO 8601 date text and times of day counted in seconds since midnight | ||
| 1.5 | 2026-10-17 | yamaa docs build | Name 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.4 | 2026-10-15 | yamaa docs build | State datetime precision codes through the hour and minute, and complete only the time parts a collected datetime lacks | ||
| 1.3 | 2026-09-29 | yamaa docs build | Show study codelist names, external dictionaries, and ISO 8601 formats in variable rows; list the document's codelist values and metadata | ||
| 1.2 | 2026-09-29 | yamaa docs build | Classify ADaM copies from a declared input as Predecessor and recodes as Derived, and SDTM recodes of locally derived columns as Derived | ||
| 1.1 | 2026-09-29 | yamaa docs build | Resolve lookups into the donor record they select, and give every derivation shape a plain-language rule instead of its raw YAML | ||
| 1.0 | yamaa docs build | Initial generation from spec.yaml |
yamaa