As a clinical trial statistician or programmer, answer two short questions in Your review: the task and the inputs and outputs. 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: 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 | — | — |
Human review and assessment
| 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 or unlisted values stay missing | Copy ODM.Value |
| 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