--- title: "Multi-d': Lee and Penrod's Signal Detection Framework for Lineups" author: - "Colin G. Tredoux" - "Tamsyn M. Naylor" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteEncoding{UTF-8} %\VignetteIndexEntry{Multi-d': Lee and Penrod's Signal Detection Framework for Lineups} %\VignetteEngine{knitr::rmarkdown} editor_options: markdown: wrap: 72 --- > **Acknowledgement.** Large language models supplied by Anthropic and > OpenAI were used in preparing this vignette, to assist with checking > code, testing the veracity of the approaches described, and on occasion > editing the text. Responsibility for the content rests with the authors. ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE, comment = "#>", warning = FALSE, message = FALSE, fig.width = 7, fig.height = 5) ``` # Overview Signal detection analyses of eyewitness identification usually reduce a lineup to a 2 x 2 table. Guilty-suspect identifications are hits, innocent-suspect identifications are false alarms, and filler identifications are pooled with rejections as "negative" responses. Lee and Penrod (2019) argue that this discards the information carried by filler choices. Their **Multi-d' model** keeps the full 2 x 3 table (suspect ID, filler ID, rejection) for target-present (TP) and target-absent (TA) lineups, and computes several empirical d' values from it. ```{r libraries} library(r4lineups) ``` # The indices Write G, Fp and Rp for the guilty-suspect, filler and rejection rates in TP lineups, and I, Fa and Ra for the innocent-suspect, filler and rejection rates in TA lineups. Each index is a difference between two z-transformed rates. | Index | Formula | Interpretation | |----|----|----| | d'(GI) | z(G) − z(I) | Guilty versus innocent suspect (the usual empirical d') | | d'(GFp) | z(G) − z(Fp) | Guilty suspect versus TP fillers | | d'(IFa) | z(I) − z(Fa) | Innocent suspect versus TA fillers: TA lineup bias | | d'(FaFp) | z(Fa) − z(Fp) | Greater appeal of TA than TP fillers | | d'(RaRp) | z(Ra) − z(Rp) | Detection of culprit presence versus absence | | d'(GFp) − d'(RaRp) | | TP lineup bias, net of memory strength | The three filler indices combine to give d'(GI): $$d'(GI) = d'(GFp) - d'(IFa) - d'(FaFp).$$ The filler terms cancel, so this holds for any data set. It is an accounting identity, not an empirical finding, and its value lies in showing *where* a given d'(GI) comes from. A lineup procedure can reach the same d'(GI) because witnesses separate the culprit well from the fillers, or because they rarely single out an innocent suspect. # A published example Lee and Penrod's Table 4 applies the model to the lineup data in Steblay et al.'s (2003) meta-analysis. The rates can be entered as counts per 100 lineups, and `correction = "none"` reproduces the published values. ```{r table4} md <- make_multid(counts = c(G = 45, Fp = 24, Rp = 31, I = 17, Fa = 26, Ra = 57), correction = "none") md ``` The published values are d'(GI) = 0.83, d'(GFp) = 0.58, d'(IFa) = −0.31, d'(FaFp) = 0.06 and d'(RaRp) = 0.67. The decomposition plot shows how the components add up to d'(GI). ```{r decomposition-plot} plot(md) ``` # Interpreting d'(IFa) as lineup bias Lee and Penrod use the **total** filler identification rate, so d'(IFa) compares the innocent suspect with all the fillers taken together. Consequently, a perfectly fair lineup does not give d'(IFa) = 0. If witnesses who choose spread their choices evenly over six members, the innocent suspect receives one sixth of the choices and the fillers five sixths, and d'(IFa) is z(1/6) − z(5/6) ≈ −1.93 when nobody rejects. The value also changes with the rejection rate. `make_multid()` therefore reports `fair_reference`, the d'(IFa) a perfectly fair lineup would give at the observed TA rejection rate, together with `ifa_vs_fair`, the observed d'(IFa) minus that reference. Positive values of `ifa_vs_fair` mean that the innocent suspect draws more than a fair share of choices. These two quantities are not part of Lee and Penrod's model; we provide them as an aid to interpretation. The alternative, `filler_rate = "per_filler"`, divides each filler rate by the number of fillers, so that the filler indices refer to an average single filler and a fair lineup gives d'(IFa) close to 0. ```{r fair-reference} md$indices[md$indices$index %in% c("IFa", "fair_reference", "ifa_vs_fair"), c("index", "estimate")] make_multid(counts = c(G = 45, Fp = 24, Rp = 31, I = 17, Fa = 26, Ra = 57), filler_rate = "per_filler", correction = "none")$indices[3, ] ``` When the TA lineups have no designated innocent suspect, the innocent-suspect rate is estimated as the TA filler rate divided by the nominal lineup size, as in `make_fullroc()`. Lee and Penrod call this the "average-filler" practice. It assumes the TA lineup to be fair, so in that case d'(IFa) carries no information about bias and moves only with the rejection rate. # Trial-level data, bootstrap intervals and confidence With trial-level data, `make_multid()` takes the same `target_present` and `identification` columns as the other confidence-based functions in the package. Bootstrap percentile intervals are obtained by resampling within the TP and TA arms. With `by_confidence = TRUE`, the indices are also computed cumulatively: at each threshold, only responses made with at least that confidence are counted, over the full number of lineups in each arm, as in Lee and Penrod's Table 9. ```{r trial-level} data(lineup_example) md2 <- make_multid(lineup_example, by_confidence = TRUE, n_bootstrap = 500, seed = 2026) summary(md2) ``` ```{r indices-plot} plot(md2, type = "indices") ``` Lee and Penrod report that d'(GI) is fairly stable across confidence thresholds while its components change. High-confidence witnesses earn their d'(GI) mainly by distinguishing the culprit from the fillers; low-confidence witnesses earn much of theirs because their choices spread over the fillers and so seldom land on the innocent suspect. ```{r confidence-plot} plot(md2, type = "confidence") ``` In `lineup_example`, rejections were recorded only at the lowest confidence level, so d'(RaRp) is uninformative above that threshold. # Comparing two conditions `compare_multid()` gives the difference between two conditions on each index, with bootstrap standard errors, intervals and p-values when both analyses were bootstrapped. Lee and Penrod's Table 3 reports simultaneous and sequential lineups from Steblay, Dysart and Wells (2011); here the rates are entered as counts per 100 lineups. ```{r compare} sim <- make_multid(counts = c(G = 52, Fp = 25, Rp = 24, I = 28, Fa = 26, Ra = 46), n_bootstrap = 500, seed = 1) sqn <- make_multid(counts = c(G = 44, Fp = 19, Rp = 39, I = 15, Fa = 17, Ra = 68), n_bootstrap = 500, seed = 2) compare_multid(sim, sqn, labels = c("simultaneous", "sequential")) ``` Because these are rates per 100, the intervals reflect samples of 100 lineups per arm, not the much larger samples of the meta-analysis. With real data, the counts should be the observed frequencies. # Cautions The Multi-d' indices are *resultant* measures: they require the responses of real witnesses to TP and TA lineups. They can describe or compare lineups after an experiment, but, unlike mock-witness measures such as `esize_T()` or `func_size()`, they cannot be used to vet a lineup before it is shown to a witness. Lee, Mansour and Penrod (2024) found that only resultant measures, including the Multi-d' bias indices, reliably predicted eyewitness performance across 40 lineup sets, while mock-witness measures, perceptual ratings and face-recognition algorithms did not. Each index is an equal-variance d' computed from a single pair of rates. Lee and Penrod present the model as a descriptive framework, a "series of thought experiments", and do not claim that the indices estimate underlying memory parameters. Models fitted to the full response distribution, such as `fit_max_sdt()` or `fit_winter_2ht()`, serve that purpose. Finally, the indices are sensitive to how extreme rates are handled. The default log-linear correction keeps them finite when a cell is empty, but it moves them slightly away from values computed from raw proportions. # References ::: {.hanging-indent} Lee, J., Mansour, J. K., & Penrod, S. D. (2022). Validity of mock-witness measures for assessing lineup fairness. *Psychology, Crime & Law*. https://doi.org/10.1080/1068316X.2021.1905811 Lee, J., Mansour, J. K., & Penrod, S. D. (2024). How to measure lineup fairness: Concurrent and predictive validity of lineup-fairness measures. *Psychology, Crime & Law*. https://doi.org/10.1080/1068316X.2024.2307358 Lee, J., & Penrod, S. D. (2019). New signal detection theory-based framework for eyewitness performance in lineups. *Law and Human Behavior*. https://doi.org/10.1037/lhb0000343 Steblay, N., Dysart, J., Fulero, S., & Lindsay, R. C. L. (2003). Eyewitness accuracy rates in police showup and lineup presentations: A meta-analytic comparison. *Law and Human Behavior, 27*, 523-540. Steblay, N. K., Dysart, J. E., & Wells, G. L. (2011). Seventy-two tests of the sequential lineup superiority effect: A meta-analysis and policy discussion. *Psychology, Public Policy, and Law, 17*, 99-139. ::: # Further Reading - `?make_multid`, `?compare_multid`, `?plot.multid` - `vignette("sdt_summary_comparisons")` for d' and criterion from 2 x 2 counts - `vignette("msdt_model")` and `vignette("lineup_memory_models")` for process models of the full response breakdown