
Apply ICD-11 PTSD diagnostic criteria to PCL-5 data
Source:R/alternative_criteria.R
create_icd11_diagnosis.RdApplies ICD-11 PTSD diagnostic criteria to PCL-5 item scores and returns a
comparison dataframe against the full DSM-5-TR criteria. The output is
directly compatible with summarize_ptsd_changes so that ICD-11
diagnostic accuracy can be computed on the same footing as optimized
symptom combinations.
Arguments
- data
A dataframe containing exactly 20 columns of PCL-5 item scores (output of
rename_ptsd_columns). Columns must be namedsymptom_1throughsymptom_20, scored on a 0–4 scale, with no missing values.
Value
A data.frame with two logical columns and one row per
participant:
PTSD_orig: DSM-5-TR diagnosis (reference standard)PTSD_icd11: ICD-11 diagnosis
Any carry-through columns present in data (e.g. an ID column added
via rename_ptsd_columns) are prepended in original order so
results can be joined back to the source dataframe.
This dataframe can be passed directly to summarize_ptsd_changes
or used as an input to compare_diagnostic_systems.
Details
ICD-11 PTSD requires ALL THREE of the following clusters to be met (symptom present = score \(\ge\) 2 on original 0–4 scale):
Re-experiencing in the present: \(\ge\) 1 of PCL-5 items 2, 3 (nightmares, flashbacks)
Avoidance: \(\ge\) 1 of PCL-5 items 6, 7
Sense of current threat: \(\ge\) 1 of PCL-5 items 17, 18 (hypervigilance, exaggerated startle)
A minimum of 3 symptoms total across all ICD-11 items (2, 3, 6, 7, 17, 18) must be present. This is automatically satisfied when all three cluster requirements are met but is enforced explicitly for clarity.
This is the narrow six-item mapping used across the published
PCL-5-to-ICD-11 literature (e.g. Kuester et al. 2017, Schellong et al.
2019, Heeke et al. 2020, Pettrich et al. 2025): ICD-11 requires
re-experiencing to have a here-and-now quality, which nightmares (item 2)
and flashbacks (item 3) capture, while intrusive memories (item 1) as
worded in the PCL-5 do not. To benchmark the broader seven-item variant
(items 1, 2, 3, 6, 7, 17, 18) instead, compute it yourself and pass it to
compare_optimizations as a custom fixed criterion:
broad <- rowSums(data[, paste0("symptom_", c(1, 2, 3))] >= 2) >= 1 &
rowSums(data[, paste0("symptom_", c(6, 7))] >= 2) >= 1 &
rowSums(data[, paste0("symptom_", c(17, 18))] >= 2) >= 1
compare_optimizations(data, scenarios = list(
"ICD-11 (broad)" = list(type = "fixed", criterion = broad,
symptoms = c(1, 2, 3, 6, 7, 17, 18))))DSM-5-TR diagnosis (PTSD_orig) is computed using the same binarization
logic as the rest of the package (create_ptsd_diagnosis_binarized).
See also
compare_diagnostic_systems for a unified cross-system
comparison table.
summarize_ptsd_changes and create_readable_summary
for computing and formatting diagnostic metrics.
Examples
# Apply ICD-11 criteria to the built-in simulated dataset
ptsd_data <- rename_ptsd_columns(simulated_ptsd,
id_col = c("patient_id", "age", "sex"))
icd11_result <- create_icd11_diagnosis(ptsd_data)
head(icd11_result)
#> patient_id age sex PTSD_orig PTSD_icd11
#> 1 P0001 48 male TRUE TRUE
#> 2 P0002 29 male TRUE TRUE
#> 3 P0003 44 male TRUE FALSE
#> 4 P0004 41 female TRUE TRUE
#> 5 P0005 34 male TRUE TRUE
#> 6 P0006 18 male TRUE FALSE
# Feed directly into the metrics pipeline
metrics <- summarize_ptsd_changes(icd11_result)
create_readable_summary(metrics)
#> Scenario Total Diagnosed Total Non-Diagnosed True Positive True Negative
#> 1 PTSD_orig 4710 (94.2%) 290 (5.8%) 4710 290
#> 2 PTSD_icd11 4505 (90.1%) 495 (9.9%) 4476 261
#> Newly Diagnosed Newly Non-Diagnosed True Cases False Cases Sensitivity
#> 1 0 0 5000 0 1.0000
#> 2 29 234 4737 263 0.9503
#> Specificity PPV NPV Accuracy Balanced Accuracy
#> 1 1.0 1.0000 1.0000 1.0000 1.0000
#> 2 0.9 0.9936 0.5273 0.9474 0.9252