p21_rules.RdEvery rule Pinnacle 21 Community reported on, keyed by its Pinnacle 21 identifier and carrying the Publisher (FDA) identifier, the canonical message and description, the category, the severity and the fix class p21bridge uses to classify a finding by rule id instead of by message text.
p21_rulesA tibble with 537 rows and 9 columns:
Pinnacle 21 identifier, e.g. "SD0002". Unique.
Publisher identifier, i.e. the FDA rule id, e.g. "FDAC036".
Canonical rule message.
Canonical rule description.
Pinnacle 21 category: Consistency, Cross-reference, Format, Limit, Metadata, Presence, Structure or Terminology.
"Error" (423), "Warning" (113) or "Notice" (1).
Which harvested report(s) the rule was seen in.
The suggest_fix() class this rule maps to: one of
human_judgement (406), missing_ts_param (35), variable_name_format
(25), key_not_unique (11), ts_val_format (9), duplicate_ts_record
(8), drop_variable (7), ct_codelist (5), missing_variable (5),
required_value_null (5), code_decode_pair (4), label_mismatch (3),
datetime_component (2), define_missing_entry (2), iso8601_date (2),
domain_value, non_ascii, referential_integrity, split_length,
studyid_mismatch, type_mismatch, variable_length or
variable_order (1 each).
Namespace of the rule id, from rule_class().
Pinnacle 21 Community validator reports in https://github.com/phuse-org/phuse-scripts (MIT licence): the CDISCPILOT01 SDTM report of 2017-09-29 and the PHUSE Test Data Factory v1.0 SDTM and ADaM reports.
Harvested from the Rules sheet of the Pinnacle 21 Community validator
reports distributed in phuse-org/phuse-scripts (MIT licence), by
data-raw/make-rule-catalogue.R. Re-run that script against newer reports
when Pinnacle 21 updates its rule set.
fix_class is derived once, at build time, from the canonical rule text -
not from the message text of any one report. It is deliberately conservative:
131 of the 537 rules name a mechanic suggest_fix() can recompute from the
data, and the other 406 carry "human_judgement". Of those 406, 387 are
undecidable in principle (the remedy is in the protocol, the CRF or a
clinician's head) and 19 need data the package does not ship (MedDRA,
WHODrug, the SDTM IG's own type list). The 48 that 0.0.1.9000 listed as
reachable with more handlers now have them, so that count is 0; the split is
counted by data-raw/make-rule-catalogue.R on every rebuild. A finding whose
rule maps to "human_judgement", or whose rule id is not in this catalogue at
all, falls through to the message-text matching p21bridge has always used, so
a rule missing from the catalogue is never worse off than before.
p21_rules[p21_rules$rule_id == "SD0064", c("severity", "category", "message")]
#> # A tibble: 1 × 3
#> severity category message
#> <chr> <chr> <chr>
#> 1 Error Cross-reference Subject is not present in DM domain
table(p21_rules$severity)
#>
#> Error Notice Warning
#> 423 1 113
table(p21_rules$fix_class)
#>
#> code_decode_pair ct_codelist datetime_component
#> 4 5 2
#> define_missing_entry domain_value drop_variable
#> 2 1 7
#> duplicate_ts_record human_judgement iso8601_date
#> 8 406 2
#> key_not_unique label_mismatch missing_ts_param
#> 11 3 35
#> missing_variable non_ascii referential_integrity
#> 5 1 1
#> required_value_null split_length studyid_mismatch
#> 5 1 1
#> ts_val_format type_mismatch variable_length
#> 9 1 1
#> variable_name_format variable_order
#> 25 1