Skip to contents

Calculate 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.

Usage

validity_pid5(
  data,
  items,
  version = c("FULL", "SF", "BF"),
  srange = c(0, 3),
  prefix = "pid_",
  append = TRUE
)

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 NA values 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 class hitop_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 with iconv(). So is an SPSS column (haven_labelled_spss) that holds a value it declares missing; turn those codes into NA with haven::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, but haven::zap_missing() leaves it unchanged, so set the values its na_values or na_range attribute declares to NA first.

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 class hitop_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 data input. (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