
Score the Personality Inventory for DSM-5 Validity Scales
Source:R/validity_pid5.R
validity_pid5.RdCalculate validity scale scores on the Personality Inventory for DSM-5: full version (PID-5, 220 items), short form version (PID-5-SF, 100 items), or brief form version (PID-5-BF, 25 items) from item-level data and return alerts when when observations meet criteria for invalidity.
Arguments
- data
A data frame containing (at least) all the PID items (numerically scored and in order).
- items
A vector of column names (as strings) or numbers (as integers) corresponding to the PID items in order. Items must be supplied in instrument order; a misordered mapping silently scores the wrong items, so a warning is issued when the names share a common prefix and trailing number but those numbers are not ascending. Duplicated entries are an error. Each column must be numeric or logical, or character holding only numbers (blank cells and
NAvalues count as missing, but the text"NA"is refused). A haven labelled column is read as its plain values. Any other column, such as the choice text of an online export or a factor, is an error of classhitop_nonnumeric_items. So is a 64-bit integer (integer64) column, and, in a UTF-8 session, a column holding text that is not valid UTF-8 (text marked Latin-1 is read as its text); convert such text withiconv(). So is an SPSS column (haven_labelled_spss) that holds a value it declares missing; turn those codes intoNAwithhaven::zap_missing()first. A declared value that is blank is not refused, since blank cells count as missing. The SPSS class of haven before 2.0 (labelled_spss) is refused the same way, buthaven::zap_missing()leaves it unchanged, so set the values itsna_valuesorna_rangeattribute declares toNAfirst.- version
A string indicating the version of the PID to score: "FULL", "SF", or "BF". Only a full name is accepted, in any letter case. Any other value, a start of a name such as
"F"included, is an error of classhitop_unknown_version. The PID5BF+M and the PID-5 Informant Form have no validity scales. (default ="FULL")- srange
An optional numeric vector specifying the minimum and maximum values of the items, used for reverse-coding. (default =
c(0, 3))- prefix
An optional string to add before each scale column name. If no prefix is desired, set to an empty string
"". (default ="pid_")- append
An optional logical indicating whether the new columns should be added to the end of the
datainput. (default =TRUE)
Value
A tibble containing all validity scores and all
original data columns (if requested)
Details
For the full PID-5, a score of 17 or higher on the INC is indicative of inconsistent responding. A score of 3 or higher on the ORS is indicative of overreporting. A score of 10 or lower on the PRD is indicative of positive impression management (underreporting rather than genuine responding) whereas a score of 21 or higher on the PRD is indicative of genuine responding (rather than positive impression management). A score of 11 or lower on the SD-TD is indicative of social desirability (rather than defensiveness), whereas a score of 19 or higher on the SD-TD is indicative of defensiveness (rather than social desirability). For the PID-5-SF, scores of 8 or more on the INC-S are indicative of inconsistent responding. Cut-scores for the ORS-S, PRD-S, and SD-TD-S have not yet been validated.
The PRD and SD-TD cut scores are raw sums compared to fixed thresholds that
assume items are coded 0-3. Unlike the INC and ORS scales, they do not adapt
to srange, so scoring items on another scale (e.g. 1-4) mis-flags
respondents; a warning is issued when srange is not c(0, 3). The BF
version computes only the percent-missing (PNA) index and no cut-score
scales.
Errors. With append = TRUE, a column of data whose name this call
would also produce is an error rather than an overwrite or a duplicated
column: the message names every colliding column. Re-run with
append = FALSE to return only the new columns, or drop the colliding
columns from data first. The condition is classed
hitop_append_collision, so a caller can catch this refusal by name.
An item column that cannot be read as numbers (see items) is an error
of class hitop_nonnumeric_items, raised before the collision check and
the srange warning.
References
Keeley, J. W., Webb, C., Peterson, D., Roussin, L., & Flanagan, E. H. (2016). Development of a Response Inconsistency Scale for the Personality Inventory for DSM-5. Journal of Personality Assessment, 98(4), 351-359. doi:10.1080/00223891.2016.1158719
Sellbom, M., Dhillon, S., & Bagby, R. M. (2018). Development and validation of an overreporting scale for the Personality Inventory for DSM-5 (PID-5). Psychological Assessment, 30(5), 582-593. doi:10.1037/pas0000507
Bagby, R. M., & Sellbom, M. (2018). The Validity and Clinical Utility of the Personality Inventory for DSM–5 Response Inconsistency Scale. Journal of Personality Assessment, 100(4), 398–405. doi:10.1080/00223891.2017.1420659
Williams, M. M., Rogers, R., Sharf, A. J., & Ross, C. A. (2019). Faking Good: An Investigation of Social Desirability and Defensiveness in an Inpatient Sample With Personality Disorder Traits. Journal of Personality Assessment, 101(3), 253–263. doi:10.1080/00223891.2018.1455691
Lowmaster, S. E., Hartman, M. J., Zimmermann, J., Baldock, Z. C., & Kurtz, J. E. (2020). Further Validation of the Response Inconsistency Scale for the Personality Inventory for DSM-5. Journal of Personality Assessment, 102(6), 743–750. doi:10.1080/00223891.2019.1674320
Examples
# Compute the PID-5 validity scales and flag likely-invalid responders.
# (The simulated data are random, so most rows are flagged.)
validity_pid5(sim_pid5, items = 1:220, version = "FULL", append = FALSE)
#> ! A total of 99 observations (99.0%) met criteria for inconsistent responding on the INC (0 missing).
#> ℹ Consider removing them with `dplyr::filter(df, pid_INC < 17)`
#> ! A total of 53 observations (53.0%) met criteria for overreporting on the ORS (0 missing).
#> ℹ Consider removing them with `dplyr::filter(df, pid_ORS < 3)`
#> ! A total of 92 observations (92.0%) met criteria for defensiveness on the SDTD (0 missing).
#> ℹ Consider removing them with `dplyr::filter(df, pid_SDTD < 19)`
#> # A tibble: 100 × 5
#> pid_PNA pid_INC pid_ORS pid_PRD pid_SDTD
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 0 25 2 40 26
#> 2 0 18 2 34 31
#> 3 0 32 2 34 29
#> 4 0 29 3 34 31
#> 5 0 24 0 36 17
#> 6 0 23 2 35 36
#> 7 0 42 2 31 19
#> 8 0 17 1 28 21
#> 9 0 25 4 41 24
#> 10 0 30 5 31 29
#> # ℹ 90 more rows