As a clinical trial statistician or programmer, challenge anything in this benchmark: describe a problem in Comments, or propose a fix with the Edit button on any source file.
- Task: Would a real study need this derivation, specified this way? Does it follow CDISC SDTM: variable names, controlled terms, record structure? Flag any rule that is ambiguous or that a sponsor would handle differently.
- Inputs: Do they look like data collected in a real trial, and do they include the situations you would expect to meet in one?
- Expected output: Would independent QC programming reproduce every value from these inputs and rules?
The other tabs beside Comments are background for assessment, not under review.
Summary
README.mdGoal: derive one laboratory record per collected result, dated by the sample the result came from.
Input: long-form Operational Data Model (ODM) data as an EDC vendor exports it, one row per collected item. The vendor writes every field name in capitals and adds a site and a user field. Each lab sample is one repeat of the lab item group: a collection date and its results.
Variables:
LBSEQnumbers each subject's results by collection date, then test.VISITis the visit the sample was collected at.LBTESTCDis the test of the result item,ALTorAST.LBORRESis the result as collected; an empty result stays missing.LBDTCis the collection date of the result's own sample, never of another sample at the same visit; a sample with no date keeps a missing date.
Note: field names match whatever their case, and the vendor's own fields take no part. A date recorded twice for one sample stops the run.
Inputs
Under review1 source fileinput/odm.csv
Edit10 rows| STUDYOID | METADATAVERSIONOID | SUBJECTKEY | STUDYEVENTOID | STUDYEVENTREPEATKEY | FORMOID | FORMREPEATKEY | ITEMGROUPOID | ITEMGROUPREPEATKEY | ITEMOID | VALUE | SITEID | ENTEREDBY |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| STUDY01 | MDV.1 | 101 | SCREENING | 1 | FO.DM | 1 | IG.DM | 1 | IT.DM.SEX | F | SITE01 | jdoe |
| STUDY01 | MDV.1 | 101 | SCREENING | 1 | FO.LB | 1 | IG.LB | 1 | IT.LB.LBDTC | 2025-01-05 | SITE01 | jdoe |
| STUDY01 | MDV.1 | 101 | SCREENING | 1 | FO.LB | 1 | IG.LB | 1 | IT.LB.ALT | 32 | SITE01 | jdoe |
| STUDY01 | MDV.1 | 101 | SCREENING | 1 | FO.LB | 1 | IG.LB | 1 | IT.LB.AST | 28 | SITE01 | jdoe |
| STUDY01 | MDV.1 | 101 | WEEK2 | 1 | FO.LB | 1 | IG.LB | 1 | IT.LB.LBDTC | 2025-01-19 | SITE01 | jdoe |
| STUDY01 | MDV.1 | 101 | WEEK2 | 1 | FO.LB | 1 | IG.LB | 1 | IT.LB.ALT | 41 | SITE01 | jdoe |
| STUDY01 | MDV.1 | 101 | WEEK2 | 1 | FO.LB | 1 | IG.LB | 2 | IT.LB.LBDTC | 2025-01-20 | SITE01 | asmith |
| STUDY01 | MDV.1 | 101 | WEEK2 | 1 | FO.LB | 1 | IG.LB | 2 | IT.LB.ALT | 39 | SITE01 | asmith |
| STUDY01 | MDV.1 | 102 | SCREENING | 1 | FO.LB | 1 | IG.LB | 1 | IT.LB.ALT | 25 | SITE02 | bkim |
| STUDY01 | MDV.1 | 102 | SCREENING | 1 | FO.LB | 1 | IG.LB | 1 | IT.LB.AST | — | SITE02 | bkim |
Expected output
Under review6 expected rowsexpected/lb.csv
Edit6 rows| STUDYID | USUBJID | LBSEQ | VISIT | LBTESTCD | LBORRES | LBDTC |
|---|---|---|---|---|---|---|
| STUDY01 | 1 | SCREENING | ALT | 32 | 2025-01-05 | |
| STUDY01 | 2 | SCREENING | AST | 28 | 2025-01-05 | |
| STUDY01 | 3 | WEEK2 | ALT | 41 | 2025-01-19 | |
| STUDY01 | 4 | WEEK2 | ALT | 39 | 2025-01-20 | |
| STUDY01 | 1 | SCREENING | ALT | 25 | — | |
| STUDY01 | 2 | SCREENING | AST | — | — |
Comments and assessment materials
| Variable Name | Variable Label | Type | Length | Controlled Terms or Format | Origin | Core | Conversion Definition | Variable Type | Variable Order | Comments for Define |
|---|---|---|---|---|---|---|---|---|---|---|
| STUDYID | Study Identifier | Char | Collected | Copy value from ODM.StudyOID. | SDTM | 1 | ||||
| USUBJID | Unique Subject Identifier | Char | Collected | Copy value from ODM.SubjectKey. | SDTM | 2 | ||||
| VISIT | Visit Name | Char | Collected | Copy value from ODM.StudyEventOID. | SDTM | 3 | ||||
| LBTESTCD | Lab Test or Examination Short Name | Char | Derived | Set per constructed row; see the Row construction sheet. | SDTM | 4 | ||||
| LBORRES | Result or Finding in Original Units | Char | Derived | Set per constructed row; see the Row construction sheet. | SDTM | 5 | ||||
| LBDTC | Date/Time of Specimen Collection | Char | ISO 8601 | Collected | Read collected ODM item IT.LB.LBDTC; no identified record yields blank. | SDTM | 6 | |||
| LBSEQ | Sequence Number | Num | Derived | Row number within each group of STUDYID, USUBJID, ordered by LBDTC then LBTESTCD. | SDTM | 7 |
| Template | Include when | LBTESTCD | LBORRES |
|---|---|---|---|
| result | LBTESTCD IS NOT NULL | Recode ODM.ItemOID: "IT.LB.ALT" → "ALT", "IT.LB.AST" → "AST"; missing values are errors; unlisted values stay missing | Copy ODM.Value |
| Version | Date | Author | Description | Reviewer | Sign-off |
|---|---|---|---|---|---|
| 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
Comments
Signed in with GitHub; saved in repository Discussions