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