Stats for

Psychometrics and Measurement

Discriminant Validity

Discriminant validity checks that two scales measure different things.

Discriminant validity takes two multi-item scales meant to measure different traits and asks whether they're distinct enough to count as two measures rather than one.

Example

Are worry and rumination distinct enough to measure with two separate scales? Three hundred adults answered a five-item worry scale and a five-item rumination scale, each item rated from 1 to 5.

Two Scales + 2+ Items Each + Item Scores → Discriminant Validity
Estimates
Correlation between two constructs, corrected for measurement error
Observations
Independent
Parametric
Yes
Headline Statistic
\text{HTMT}
Key Estimate
Heterotrait-Monotrait Ratio
Groups
1

The Basics

When to Use It

Use it when you have two multi-item scales, answered by the same people, that are meant to measure different but possibly related traits, and you want to know whether they really are two measures rather than one measure under two names. For example:

  • Are worry and rumination distinct enough to measure with two separate scales?
  • Does a new grit scale measure something different from conscientiousness on the Big Five Inventory?
  • Are the emotional-exhaustion and depersonalization subscales of a burnout measure distinct enough to score separately?

With more than two scales, check every pair and judge each one; htmt() in R gives the whole matrix.

Vocabulary You Need

Definition Discriminant Validity

Evidence that a measure captures something different from measures of other, related traits. Two scales meant to measure different things, such as worry and rumination, should correlate less than perfectly once measurement error is set aside; if their traits correlate close to 1, they're effectively measuring the same thing, whatever their names say. It's one strand of construct validity, paired with convergent validity (measures of the same trait should agree). It's usually judged from an error-corrected correlation between the two traits, such as the heterotrait-monotrait ratio (HTMT) or the factor correlation from a confirmatory factor analysis, or from the Fornell-Larcker criterion. No cutoff settles it alone: theory about how related the traits should be matters too. Glossary →

Definition Measurement Error (E)

The difference between an observed score and the person's true score. Random error pushes scores up on one occasion and down on another (a lapse of attention, a lucky guess), so it averages out over many measurements but makes any single score less trustworthy. Systematic error pushes scores the same way every time or on one occasion for everyone, such as a practice effect at retest or a lenient rater; it doesn't average out, and correlations can't see it. Glossary →

Definition Heterotrait-Monotrait Ratio (\text{HTMT})

An estimate of the correlation between two traits, corrected for measurement error, built only from item correlations. The numerator is the average correlation between items of different scales (heterotrait); the denominator is the geometric mean of the two scales' average correlations between their own items (monotrait). Within-scale correlations show how much the items share; if the between-scale correlations are nearly as strong, the two scales behave like one. It equals the correlation between the two scales' totals of standardized items, corrected for attenuation with standardized alpha, so it assumes every item measures its trait equally well. HTMT2 averages each block of item correlations with a geometric rather than an arithmetic mean, so it no longer needs every item to measure its trait equally well, provided all the item correlations are positive (Roemer et al., 2021). Glossary →

Definition Factor Loading (\lambda)

How strongly one observed variable, such as a questionnaire item, reflects a factor: an unobserved trait that a set of variables is assumed to share. A standardized loading puts everything in standard deviations; when each item reflects only one factor, it is the item's correlation with that factor, and its square is the share of the item's variance the factor accounts for. An unstandardized loading is in the item's own units: how much the item's score rises, on average, for each one-unit rise in the factor: one standard deviation when the factor's variance is fixed at 1, or one point of the marker item when that item's loading is fixed at 1. Loadings come from a factor analysis, so they depend on the model, the estimation method and which items are analyzed together. Glossary →

Definition Average Variance Extracted (AVE)

The average, across a construct's items, of each item's squared standardized loading: how much of a typical item's variance the construct accounts for, with the rest being measurement error and whatever is specific to that item. It comes from a factor model, usually a confirmatory factor analysis in which each item reflects one construct. An AVE of .50 means the construct explains as much of the average item as everything else does. Because it is an average of single items, it doesn't grow with the number of items, unlike composite reliability; a construct can have reliable items as a set and still a low AVE. With standardized loadings it equals the average of the items' reliabilities, which is why Rönkkö and Cho (2022) suggest calling it average indicator reliability. Fornell and Larcker (1981) proposed it, together with a check for discriminant validity that compares each construct's AVE with the variance it shares with other constructs. Glossary →

Assumptions

1. Correctly Specified Model Your model includes the paths and correlations that really matter.
What It Means
The model's pattern is right in the ways that count: every path, loading or covariance that matters is included, and every one the model fixes at zero really is near zero. In a factor model, the items load on the factors you assigned them to and any residuals that share something (similar wording, a shared method) are allowed to correlate; in a path model, the arrows left out of the diagram really are absent. Every estimate, and every fit index, is conditional on that pattern. An omitted path, cross-loading or residual correlation doesn't just cost fit; the model makes up for it by bending the parameters it does have.
Applies To
Items
How to Check
Specify the model from theory (and, for a factor model, item content) before seeing the data. Then look beyond the overall fit: the residual correlations for pairs the model misses, the modification indices for where it misses most, and paths, loadings or factor correlations that look implausible. Compare the model with plausible alternatives specified in advance. Fit statistics can show a model is wrong; they can't show it's right.
How Much It Matters
A lot. HTMT and the factor correlation both take the assignment of items to scales as given. An item that really belongs to both traits (a cross-loading), or a weak item that mostly measures something else, pushes HTMT up and makes the scales look less distinct than they are. Items within one scale that share wording or format raise that scale's own correlations and do the reverse.

If It's Violated

  • Alternative Test Confirmatory Factor Analysis (CFA). Fit the two-factor model, check its fit and look for large residual correlations between items of different scales.
  • Alternative Test Exploratory Factor Analysis (EFA). If you're not sure which items belong where, let an EFA suggest the structure in a separate sample first.
  • Design Change Reword or replace items whose content straddles both traits, then collect new data.
2. Items Reflect the Trait Your items are effects of the trait, not ingredients of it.
What It Means
The trait comes first and drives the answers, so a person high in worry tends to agree with every worry item, and the items correlate because they share a cause. Measures built the other way round, where the items define the construct (a checklist of life events that adds up to “stress”), have no reason to correlate, so comparisons of within-scale and between-scale correlations don't apply to them.
Applies To
Items
How to Check
By reasoning about the measure. Ask whether a change in the trait would change every item's answer (reflective), or whether a change in one item would change the construct (formative). Items meant to be interchangeable signs of one trait are reflective.
How Much It Matters
A lot. If the items define the construct rather than reflect it, as in a checklist of stressful life events, there's no reason for them to correlate, and HTMT, AVE and the Fornell-Larcker criterion stop meaning anything (Henseler et al., 2015).

If It's Violated

  • Proceed with Caveat For a checklist-style measure, make the case from what the items cover and how scores relate to other variables, not from item correlations.
3. Equally Strong Items Every item reflects the construct about equally strongly, though their averages may differ.
What It Means
Every item in a scale tracks its trait about equally well once the items are put on the same footing (equal standardized loadings), so a plain average of their correlations is fair to each.
Applies To
Items
How to Check
Look at the standardized loadings from the two-factor CFA (Table 1). A spread of .1 or so barely matters; much wider spreads are a reason to report HTMT2 or the factor correlation alongside HTMT.
How Much It Matters
Some. HTMT treats every item as an equally good measure. Because it works from correlations, that means equal standardized loadings: an item carrying more error than the others counts as weaker, even if its raw loading is the same. When standardized loadings differ, it tends to overstate the correlation between the traits; here the loadings run from .73 to .86 and HTMT (.751) and the factor correlation (.750) barely differ. With very uneven loadings, report HTMT2 or the factor correlation as well.

If It's Violated

  • Correction Use geometric instead of arithmetic means of the correlations (Roemer et al., 2021), which allows items to differ in strength. It's the default in R's semTools.
  • Alternative Test Confirmatory Factor Analysis (CFA). The two-factor model estimates each item's loading, so its correlation between the factors doesn't need equal loadings.
4. Independent Observations The people (or other units) in your study don't influence each other.
What It Means
Each person's data comes from a separate, unconnected source, so knowing one person's scores tells you nothing about anyone else's. In designs that measure people more than once, their own scores are meant to be related; it's different people who must be independent. Methods built for clustered data, such as multilevel models and GEE, also allow members of the same group to be related, as long as the analysis names the grouping; then it's the groups that must be independent.
Applies To
Observations
How to Check
By design, not by a test. Did each person contribute their own data, with no clusters such as roommates, couples, therapy groups or classrooms whose members influence each other? If there are clusters, does the analysis model every one of them?
How Much It Matters
Some. Clustered respondents, such as students from a few classrooms, leave HTMT roughly right but make the bootstrap interval too narrow, because resampling individuals ignores the clusters.

If It's Violated

  • Robust Estimation Bootstrap whole clusters instead of individuals.
  • Alternative Test Multilevel SEM. Estimate the factor correlation within and between clusters.

Limitations

This Is Not Your Test If…

What It Doesn't Tell You

  • Whether the scales measure what they're named for. Distinct isn't the same as correct. HTMT says the worry items and the rumination items behave like two different things, not that one of them is worry and the other rumination. That takes convergent evidence and a look at the items' content.
  • Whether a correlation of .75 is too high for your purpose. The cutoffs are conventions. Theory says worry and rumination should be closely related, so .75 is expected; two traits that theory says are unrelated would be a problem at .75.
  • Why they're related. A shared cause, such as general negative affect, or the fact that both were self-reported on the same day in the same format, can push the correlation up. Nothing here separates those.
  • What the Fornell-Larcker check adds. Less than it seems, because it errs in both directions. With loadings from partial least squares it usually misses a problem (Henseler et al., 2015); with CFA loadings it flags problems too readily, because it compares how well a trait explains a single item with how strongly two traits correlate (Rönkkö & Cho, 2022). Its agreement here backs up HTMT and φ rather than adding new evidence.
  • Who else. The .75 belongs to these 300 adults' answers. In a clinical sample, or a translated version, the two scales could overlap more or less.

Common Mistakes

  • Don'tRead a correlation between scale scores as the correlation between the traits.

    InsteadCorrect it for measurement error. Our scale scores correlate .67, but the traits correlate about .75.

  • Don'tTreat HTMT below .85 as proof that the scales measure different things.

    InsteadSay they're empirically distinct in this sample, and back it with what each scale's items are about.

  • Don'tSquare the correlation between observed scale scores and compare AVE with that.

    InsteadSquare the factor correlation from the CFA, which is corrected for random measurement error, as Fornell and Larcker intended.

  • Don'tReport HTMT without saying which version and which cutoff you used.

    InsteadName HTMT or HTMT2, the cutoff (.85 or .90) and give a bootstrap interval.

  • Don'tLeave reverse-worded items unrecoded before computing HTMT.

    InsteadRecode them first, or use absolute correlations, so negative correlations don't cancel positive ones.

  • Don'tCompare AVE with a correlation instead of a squared correlation.

    InsteadCompare AVE with the squared factor correlation, or √AVE with the correlation itself.

Result Decoder

Interpretation Guidelines

Benchmarks Heterotrait-Monotrait Ratio
  • HTMT < .85 Distinct

    Below both conventional cutoffs: no sign that the two scales measure one trait, especially if the whole interval is below the cutoff too.

  • .85 ≤ HTMT < .90 Borderline

    Distinct only by the more lenient .90 cutoff. Often accepted for traits that theory says are closely related; the stricter .85 reading flags a problem.

  • HTMT ≥ .90 Not Distinct

    Above both cutoffs: the scales behave like two measures of one trait, whatever their labels say.

The .85 and .90 cutoffs are conventions that Henseler et al. (2015) took from earlier writers, not values derived from theory; Rönkkö and Cho (2022) conclude that any threshold likely falls between .8 and .9 and must be set by consensus. The .85 cutoff is the stricter of the two; for the upper limit of a factor correlation's 95% interval, Rönkkö and Cho (2022) propose treating below .80 as no problem and .80 to .90 as a marginal problem. A point estimate ignores sampling error (Cheung et al., 2024), so read HTMT with its bootstrap interval, and weigh how related theory says the two traits should be.

More about effect size ↓

How It's Reported

Equation Form

Example

HTMT = .75, 95% bootstrap CI [.68, .81]; φ = .75, 95% CI [.69, .81]; AVE = .61 (worry) and .62 (rumination)

Table 1. Items and Standardized Loadings

Example
MSD\lambda^*
W1. My worries feel overwhelming 3.161.13.74
W2. Once I start worrying, I can't stop 3.201.21.79
W3. I keep thinking about what might go wrong 3.151.20.83
W4. I'm always worrying about something 3.091.20.76
W5. Worrying about the future makes me tense 3.201.15.80
R1. I keep asking myself why I feel this way 3.151.12.73
R2. I replay past conversations over and over 3.201.15.81
R3. I keep going back over my past mistakes 3.141.11.77
R4. I can't let go of things that upset me 3.201.11.86
R5. I dwell on how badly I've been feeling 3.161.17.77

Note. N = 300. Items rated from 1 (not at all like me) to 5 (very much like me). λ* = standardized loading on the item's own factor in a two-factor confirmatory factor analysis (maximum likelihood, factor variances fixed at 1).

Table 2. Item Correlations within and between the Scales

Example
PairsMean rLowestHighest
Within worry 10.61.55.66
Within rumination 10.62.54.69
Between worry and rumination 25.46.35.55

Note. N = 300. Pearson correlations between items. Within a scale, each pair of its five items is counted once (10 pairs); between the scales, every worry item is paired with every rumination item (25 pairs).

Table 3. Discriminant Validity of the Worry and Rumination Scales

Example
Estimate95% CICriterionMet
HTMT .75[.68, .81]Upper limit below .85Yes
Factor correlation, \phi .75[.69, .81]Upper limit below .80No (.81; marginal)
\sqrt{\text{AVE}}, worry .78Above φ = .75Yes
\sqrt{\text{AVE}}, rumination .79Above φ = .75Yes

Note. HTMT = heterotrait-monotrait ratio (Henseler et al., 2015), with a 95% percentile bootstrap interval from 5,000 resamples. φ = correlation between the worry and rumination factors; AVE = average variance extracted (mean squared standardized loading). 95% CI for φ: Wald interval from the CFA's standard errors. Fornell-Larcker criterion: each √AVE should exceed φ.

Full Text (APA Style)

Example

Worry scores (M = 3.16, SD = 0.98) and rumination scores (M = 3.17, SD = 0.94) were strongly related, r = .67. The heterotrait-monotrait ratio was .75, 95% percentile bootstrap CI [.68, .81] (5,000 resamples). A two-factor confirmatory factor analysis fit well, χ²(34) = 35.89, p = .380, CFI = .999, RMSEA = .014, 90% CI [.000, .045], SRMR = .020, with standardized loadings from .73 to .86 (Table 1), and estimated the correlation between the traits at φ = .75, 95% CI [.69, .81]. The factor correlation's upper limit falls just above .80, a marginal problem in Rönkkö and Cho's (2022) classification, under which treating the scales as distinct is probably safe but the high correlation should be acknowledged. HTMT's interval tells the same story, and both upper limits stay below .85. Worry and rumination are expected to be closely related, so we treat them as distinct but strongly overlapping traits. The Fornell-Larcker criterion agreed: the square root of each scale's average variance extracted (worry: AVE = .61, √AVE = .78; rumination: AVE = .62, √AVE = .79) exceeded the factor correlation.

  • Give the error-corrected correlation (HTMT or the factor correlation), not only the correlation between scale scores, which understates how related the traits are.
  • Name the index (HTMT or HTMT2), the cutoff you used and why, and give a bootstrap interval with the number of resamples.
  • If you report the Fornell-Larcker criterion, compare AVE with the squared factor correlation, not the squared scale-score correlation, and give both AVEs.
  • Say how well the factor model fit, since the factor correlation and AVE come from it.

Reading Each Piece

The equation form above, piece by piece, in this order: how big, then how certain.

HTMT = .75 Once measurement error is set aside, worry and rumination correlate about .75. They share roughly 56% of their variance: closely related, but well short of the 1 that would mean one trait, and below the .85 cutoff. Benchmarks ↑
95% bootstrap CI [.68, .81] The correlation between the traits is plausibly anywhere from .68 to .81. The top of the range is below the .85 cutoff but just above .80, as the factor correlation's is in the next step: distinct, but closely related.
AVE = .61 (worry) and .62 (rumination) Each trait explains about 61 to 62% of the variance in its own items, on average. That's the yardstick the Fornell-Larcker criterion holds the overlap between the traits against.
φ = .75 The factor model's estimate of the correlation between worry and rumination, also corrected for random measurement error if the two-factor model is right. It agrees with HTMT here because the items' loadings are fairly even.
95% CI [.69, .81] From the model's standard errors. Its upper limit, .81, falls in the .80 to .90 range that Rönkkö and Cho (2022) call a marginal problem: the scales are probably safe to treat as distinct, but the high correlation should be acknowledged.

Calculations

The Running Example

Example

The worry-and-rumination study: 300 adults, five worry items and five rumination items, asking whether the two scales measure different traits.

There's no test of whether the traits correlate at all: for two related scales that's never in doubt. The target is the correlation between the worry and rumination traits themselves, free of measurement error, among adults like these. HTMT and the factor correlation \phi (“phi”) both estimate it; the question is whether it's clearly below 1, and below a cutoff such as .85. A model comparison can test that cutoff directly (see Statistical Significance).

What Your Data Should Look Like

One row per person and one numeric column per item, for both scales, with any reverse-worded items already reverse-scored so that higher always means more of the trait. You also need to say which items belong to which scale: that assignment comes from the scales' design, not from the data. Rating-scale items (1 to 5, 1 to 7) are treated as numbers, which usually works well with five or more options and answers that don't pile up at one end, as here. With fewer options or very skewed items, fit the CFA with a robust or ordinal estimator (in lavaan, estimator = "MLR" or ordered = TRUE). If some people skipped an item, use all the answers they gave (missing = "fiml" in lavaan) rather than dropping them; the SPSS program in the software section drops anyone with a missing answer. The data box below gives each scale's total; the Napkin Math and write-up use each scale's item average (total ÷ 5), which gives the same correlation.

Example
participantworry_1worry_2worry_3worry_4worry_5rumination_1rumination_2rumination_3rumination_4rumination_5
13444434343
24545444433
33343442344
42223322213
53213211111
62322223232
… 294 more rows
ItemMSDItem–Total r
Worry
Worry 13.161.13.68
Worry 23.201.21.73
Worry 33.151.20.77
Worry 43.091.20.71
Worry 53.201.15.74
Total15.804.90
Rumination
Rumination 13.151.12.68
Rumination 23.201.15.76
Rumination 33.141.11.71
Rumination 43.201.11.80
Rumination 53.161.17.72
Total15.864.71

N = 300. Each construct has its own total, adding its own items; each item's r is with the total of the other items in its construct (the corrected item–total correlation).

Simulated data.

Download all 300 rows (data.csv)

Napkin Math

The whole test, one idea at a time. Under each heading, a line says why the step matters, and the green note reads the equation in plain English with the worry-and-rumination study's numbers. Collapse all to read just the headings: they tell the whole story on their own.

  1. 1. See How Strongly the Two Scale Scores Go Together

    Start with what most people would compute first, the correlation between everyone's worry score and their rumination score. It usually understates how related the traits are, because both scores carry measurement error, and random error weakens a correlation. (Error the two scales share, such as answering both in the same format on the same day, can do the opposite.)

    r = \dfrac{\text{cov}_{xy}}{s_x \, s_y} =\dfrac{0.616}{0.98 \times 0.94}

    = .67

    \text{cov}_{xy} = 0.616

    M_{\text{worry}} = 3.16

    SD_{\text{worry}} = 0.98

    M_{\text{rumination}} = 3.17

    SD_{\text{rumination}} = 0.94

    Each adult's worry score is their average on the five worry items (M = 3.16, s_x = 0.98), and likewise for rumination (M = 3.17, s_y = 0.94). \text{cov}_{xy} = 0.616, so .616 ÷ (0.98 × 0.94) = .67: people who worry more tend to ruminate more.

  2. 2. Average How Strongly Items Agree within Each Scale

    Each answer is part trait, part noise (measurement error): mood that day, how the item is read. Items on the same scale should correlate well with each other: they're meant to be interchangeable measures of one trait. Their average correlation is how much any two of them share, and it sets the ceiling for how strongly items could agree if the traits were the same.

    \bar{r}_{\text{within}} = \dfrac{\text{sum of the 10 within-scale correlations}}{10} =\dfrac{6.13}{10} = .61 \text{ (worry)}, \quad \dfrac{6.20}{10} = .62 \text{ (rumination)}

    \bar{r}_{\text{worry}} = 0.61

    \bar{r}_{\text{rumination}} = 0.62

    Each scale's five items make 10 pairs. The 10 worry correlations (from .55 to .66, Table 2) average \bar{r}_{\text{worry}} = .61; the 10 rumination correlations (.54 to .69) average \bar{r}_{\text{rumination}} = .62.

  3. 3. Average How Strongly Items Agree across the Two Scales

    Now pair every worry item with every rumination item. If the scales measured one trait, these correlations would be as strong as the within-scale ones; if they measured unrelated traits, they'd be near zero.

    \bar{r}_{\text{between}} = \dfrac{\text{sum of the 25 between-scale correlations}}{25} =\dfrac{11.58}{25} = .46

    \bar{r}_{\text{between}} = 0.46

    Five worry items times five rumination items make 25 pairs, from .35 to .55. They average \bar{r}_{\text{between}} = .46, clearly weaker than the .61 and .62 within the scales, but far from zero.

  4. 4. Compare Agreement across the Scales with Agreement within Them

    Divide the between-scale average by the within-scale averages (their geometric mean, the square root of their product). The result estimates the correlation between the traits themselves. Why: suppose every worry item tracks worry equally well, with loading \lambda_W, and every rumination item tracks rumination with \lambda_R. Then two worry items correlate \lambda_W^2, two rumination items \lambda_R^2, and a worry item with a rumination item \lambda_W \, \phi \, \lambda_R, where \phi is the correlation between the traits. Divide the last by \sqrt{\lambda_W^2 \lambda_R^2} and only \phi is left. So the division undoes the weakening that random error causes, exactly so when each scale's items are equally good measures. The name comes from Campbell and Fiske's (1959) table of correlations among different traits (heterotrait) and the same trait (monotrait); despite the name, HTMT is simply a correlation corrected for measurement error.

    \text{HTMT} = \dfrac{\bar{r}_{\text{between}}}{\sqrt{\bar{r}_{\text{within},1} \times \bar{r}_{\text{within},2}}} =\dfrac{.46}{\sqrt{.61 \times .62}} = \dfrac{.463}{.617}

    = .75

    \sqrt{\bar{r}_{\text{worry}} \, \bar{r}_{\text{rumination}}} = .617

    \bar{r}_{\text{between}} is the .463 across the scales, and \sqrt{.613 \times .620} = .617 is the within-scale agreement. .463 ÷ .617 = .75: worry and rumination items agree three-quarters as well across the scales as within them. In the formula, \bar{r}_{\text{within},1} and \bar{r}_{\text{within},2} are the worry and rumination averages.

  5. 5. Resample People to See How Much HTMT Could Vary

    Another 300 adults would give a somewhat different HTMT. Draw 5,000 new samples of 300 from our own data, with replacement, recompute HTMT in each, and keep the middle 95%.

    \left[\, \text{HTMT}^{*}_{(2.5\%)},\; \text{HTMT}^{*}_{(97.5\%)} \,\right] =\text{middle 95\% of 5{,}000 resampled HTMT}^{*}

    = [.68, .81]

    Each \text{HTMT}^{*} is the ratio in one resample of our 300 adults. Sorting all 5,000 and cutting 2.5% from each end leaves .68 to .81. Only 2 of the 5,000 reached .85. Another seed or program moves the limits slightly: the R code below gives .68 to .81 too (1 resample at .85), and the Python code .69 to .81.

  6. 6. Estimate the Correlation between the Traits with a Factor Model

    A factor is the unobserved trait a set of items shares (the trait, or construct, under another name); an item's loading is how strongly it tracks that factor, and standardized, it's the item's correlation with the factor. A two-factor confirmatory factor analysis does the same job as HTMT differently: it models each scale's items as reflecting one factor, lets each item have its own loading, and estimates the correlation between the two factors directly. It also checks whether two factors describe the items well.

    \Sigma = \Lambda \Phi \Lambda^{\top} + \Theta, \quad \Phi = \begin{bmatrix} 1 & \phi \\ \phi & 1 \end{bmatrix} =\phi = .75, \quad \chi^2(34) = 35.89

    \phi = .75

    95\%\ \text{CI}_{\phi} = [.69, .81]

    \chi^2 = 35.89

    df = 34

    p = .380

    CFI = .999

    RMSEA = .014

    \text{90\% CI}_{\text{RMSEA}} = [.000, .045]

    SRMR = .020

    \Sigma is the item correlations the model predicts, \Lambda holds the ten loadings (Table 1), \Theta the items' unique variances (what each item doesn't share with its factor), \top turns \Lambda on its side, and \phi is the one correlation between worry and rumination: .75, 95% CI [.69, .81], the same as HTMT to two decimals. The 34 df are the 55 variances and correlations among the 10 items minus the 21 values the model estimates. \chi^2(34) = 35.89, p = .380: if two factors described the items exactly, sampling error alone would give misfit at least this large about 38% of the time. CFI near 1 (above about .95) and RMSEA and SRMR near 0 (below about .06 and .08) are the usual signs of good fit (Hu & Bentler, 1999), and they're conventions too; here they're .999, .014 and .020.

  7. 7. Find How Much of Each Item Its Own Trait Explains

    A standardized loading squared is the share of an item's variance its factor accounts for. Averaging those shares across a scale's items gives the average variance extracted: how much, on average, the trait explains of its own items.

    \text{AVE} = \dfrac{1}{k}\sum_{i=1}^{k} \lambda^{*2}_i =\text{AVE}_{\text{worry}} = \dfrac{.735^2 + .790^2 + .834^2 + .756^2 + .800^2}{5}

    = .61

    \text{AVE}_{\text{rumination}} = .62

    \lambda^*_i are the five worry loadings in Table 1 and k = 5. Their squares (.54, .62, .70, .57, .64) average .61; the rumination items average .62. Either way, the trait accounts for about 60% of a typical item's variance, from about half to three-quarters item by item (.53 to .75); the rest is error and whatever is specific to each item.

  8. 8. Check That Each Trait Explains Its Own Items Better Than It Overlaps with the Other

    Fornell and Larcker's rule: a trait should share more with its own items than with the other trait. Compare each AVE with the squared factor correlation, or, the same thing, each √AVE with the factor correlation itself.

    \sqrt{\text{AVE}_1} > |\phi_{12}| \;\text{ and }\; \sqrt{\text{AVE}_2} > |\phi_{12}| =\sqrt{.61} = .78 > .75, \quad \sqrt{.62} = .79 > .75

    \sqrt{\text{AVE}_{\text{worry}}} = .78

    \sqrt{\text{AVE}_{\text{rumination}}} = .79

    \phi^2 = .56

    \phi is our .75 factor correlation, so the traits share \phi^2 = .56 of their variance. Worry's AVE of .61 and rumination's .62 both beat .56; in square roots, .78 and .79 both beat .75. The criterion is met, but by only .03 or .04.

Run It in Software

The code below reads the running example's data from data.csv; save it in the same folder you run the code from.

SPSS (version 30, as documented by IBM)

SPSS has no HTMT command, but HTMT only needs the item correlations, so a short MATRIX program computes it. The factor correlation and AVE need a confirmatory factor analysis, which base SPSS doesn't do (it's in SPSS Amos); use R or Python for that part.

  1. Optional: Analyze → Correlate → Bivariate, move all ten items across and click OK, to see the correlation matrix (the CORRELATIONS syntax below).
  2. Open a syntax window (File → New → Syntax), paste the MATRIX program below and run it. It assumes the five worry items come first in the file, then the five rumination items.

Or paste this syntax:

CORRELATIONS
  /VARIABLES=worry_1 TO rumination_5
  /PRINT=TWOTAIL NOSIG
  /MISSING=LISTWISE.

MATRIX.
GET x /VARIABLES=worry_1 TO rumination_5 /MISSING=OMIT.
COMPUTE n = NROW(x).
COMPUTE dev = x - MAKE(n, 1, 1) * CSUM(x) / n.
COMPUTE s = SSCP(dev) / (n - 1).
COMPUTE d = INV(MDIAG(SQRT(DIAG(s)))).
COMPUTE r = d * s * d.
COMPUTE rw = (MSUM(r(1:5, 1:5)) - 5) / 20.
COMPUTE rr = (MSUM(r(6:10, 6:10)) - 5) / 20.
COMPUTE rh = MSUM(r(1:5, 6:10)) / 25.
COMPUTE htmt = rh / SQRT(rw * rr).
PRINT {rw, rr, rh, htmt} /FORMAT=F8.3
  /CLABELS="Worry" "Rumin" "Between" "HTMT".
END MATRIX.

Reading the Output

Read HTMT first; the three averages before it are its ingredients. Each within-scale block of the matrix counts every pair twice and includes the five 1s on the diagonal, which is why the program subtracts 5 and divides by 20 (10 pairs, twice).

Worry Rumin Between HTMT
.613 .620 .463 .751

For a bootstrap interval, add a loop that resamples rows, or use R.

Output laid out from this page's computed results, not captured from a live run; labels and layout may differ slightly in your version.

R
library(lavaan)
library(semTools)

rum <- read.csv("data.csv")

model <- '
  worry      =~ worry_1 + worry_2 + worry_3 + worry_4 + worry_5
  rumination =~ rumination_1 + rumination_2 + rumination_3 + rumination_4 + rumination_5
'

# HTMT: htmt2 = FALSE gives Henseler et al.'s original (arithmetic means)
htmt(model, data = rum, htmt2 = FALSE)

# Percentile bootstrap interval for HTMT
set.seed(2026)
boot <- replicate(5000, htmt(model, data = rum[sample(nrow(rum), replace = TRUE), ], htmt2 = FALSE)[2, 1])
quantile(boot, c(.025, .975))

# Two-factor CFA: fit and the factor correlation
fit <- cfa(model, data = rum, std.lv = TRUE)
fitMeasures(fit, c("chisq", "df", "pvalue", "cfi", "rmsea", "srmr"))
lavInspect(fit, "cor.lv")

# Model comparison: fix the factor correlation at .85 and test the loss of fit
fit85 <- cfa(paste(model, "worry ~~ 0.85*rumination"), data = rum, std.lv = TRUE)
anova(fit, fit85)

# AVE as the mean squared standardized loading, and its square root
lambda <- lavInspect(fit, "std")$lambda
ave <- colSums(lambda^2) / colSums(lambda != 0)
ave
sqrt(ave)
           worry rumntn
worry      1.000
rumination 0.751  1.000
     2.5%     97.5%
0.6834255 0.8104877
 chisq     df pvalue    cfi  rmsea   srmr
35.885 34.000  0.380  0.999  0.014  0.020
           worry rumntn
worry       1.00
rumination  0.75   1.00

Chi-Squared Difference Test

      Df    AIC    BIC  Chisq Chisq diff   RMSEA Df diff Pr(>Chisq)
fit   34 7630.6 7708.4 35.886
fit85 35 7642.2 7716.3 49.476      13.59 0.20486       1  0.0002273 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
     worry rumination
 0.6147558  0.6232198
     worry rumination
 0.7840637  0.7894427

Read HTMT (.751) and its interval first, then the model's fit, the factor correlation (.75), the model comparison (fixing the correlation at .85 worsens fit by 13.59 on 1 df, p = .0002) and the √AVEs to compare with the factor correlation. The bootstrap uses R's own random numbers, so its limits differ from the page's in the third decimal. Left at its default, htmt() gives HTMT2, which uses geometric means (.750 here). semTools' AVE(fit) weights each item by its variance and gives .616 and .623, a hair different from the plain average of squared loadings.

Output from a real run: R 4.6.1 (lavaan 0.7-2, semTools 0.5-9), run 2026-10-10.

Python
import numpy as np
import pandas as pd
import semopy

rum = pd.read_csv("data.csv")

worry = [f"worry_{i}" for i in range(1, 6)]
rumination = [f"rumination_{i}" for i in range(1, 6)]

def htmt(data, a, b):
    R = data[a + b].corr().to_numpy()
    k = len(a)
    within_a = R[:k, :k][np.triu_indices(k, 1)].mean()
    within_b = R[k:, k:][np.triu_indices(len(b), 1)].mean()
    between = R[:k, k:].mean()
    return between / np.sqrt(within_a * within_b)

htmt(rum, worry, rumination)              # 0.7510

rng = np.random.default_rng(2026)
boot = [htmt(rum.iloc[rng.integers(0, len(rum), len(rum))], worry, rumination)
        for _ in range(5000)]
np.percentile(boot, [2.5, 97.5])          # [0.6858, 0.8093]

model = semopy.Model("""
worry =~ worry_1 + worry_2 + worry_3 + worry_4 + worry_5
rumination =~ rumination_1 + rumination_2 + rumination_3 + rumination_4 + rumination_5
""")
model.fit(rum)
std = model.inspect(std_est=True)
std[(std.op == "~~") & (std.lval != std.rval)]["Est. Std"]   # factor correlation 0.7505
loadings = std[std["op"] == "~"]
ave = loadings.groupby("rval")["Est. Std"].apply(lambda l: (l**2).mean())
ave                                       # rumination 0.6232, worry 0.6148
np.sqrt(ave)                              # rumination 0.7895, worry 0.7841
semopy.calc_stats(model).T.loc[["chi2", "DoF", "chi2 p-value", "CFI", "RMSEA"]]
# chi2 35.885, DoF 34, p 0.380, CFI 0.999, RMSEA 0.0136

The only covariance between two different variables in this model is the one between the factors, which is why the filter finds it. semopy's model syntax matches lavaan's. Its standardized estimates agree with lavaan's to four decimals; its optimizer stops a little sooner, so the fifth decimal can differ. The bootstrap limits depend on the random seed.

Output from a real run: Python 3.9.6 (semopy 2.3.11, numpy 2.0.2, pandas 2.3.3), run 2026-10-03.

Impact

Effect Size

HTMT is itself the size measure here: an estimate of how strongly the two traits correlate once measurement error is set aside. Like any correlation it has no units, so it can be compared across scales and studies, and squaring it gives the share of variance the traits have in common.

\text{HTMT} = \dfrac{\bar{r}_{\text{between}}}{\sqrt{\bar{r}_{\text{worry}} \times \bar{r}_{\text{rumination}}}} = \dfrac{.463}{\sqrt{.613 \times .620}} = .75

Worry and rumination share about 56% of their variance (.75 squared). Knowing how much someone worries tells you a lot about how much they ruminate, but not everything.

The correction matters. The raw correlation between the two scale scores is .67, which would suggest the traits share 45% of their variance; the error-corrected .75 raises that to 56%. Readers who see only the raw .67 underestimate how close the constructs are, which is exactly the mistake discriminant validity is meant to catch. Whether 56% overlap is acceptable is a question about worry and rumination, not statistics: theory expects them to be closely related, and the useful point is that 44% of each is not the other.

Benchmarks Heterotrait-Monotrait Ratio at a Glance
Distinct
HTMT < .85
Borderline
.85 ≤ HTMT < .90
Not Distinct
HTMT ≥ .90

Full benchmarks and caveats ↑

Uncertainty

HTMT comes with no p-value. You could test whether the traits correlate at all, but for two related scales that's never in doubt; the question is whether the correlation is clearly below 1, or below a cutoff such as .85. The bootstrap interval answers that. Henseler et al. (2015) proposed a test built on the same idea, asking whether the interval excludes 1, but in their own simulations it seldom flagged traits that correlated close to, but below, 1, so checking the interval against .85 or .90 is the more useful reading.

Our interval runs from .68 to .81. It excludes 1 by a wide margin, and it excludes .85 too: only 2 of our 5,000 resamples reached .85. It doesn't quite exclude .80, and neither does the factor correlation's interval, [.69, .81]. Rönkkö and Cho (2022) classify a factor correlation whose upper limit falls from .80 to .90 as a marginal problem (their scheme is built on the factor correlation's interval, not HTMT's, but here the two agree): the scales are probably safe to treat as distinct, but the high correlation should be acknowledged and its cause discussed.

The model-comparison version tests the cutoff directly: refit the CFA with φ fixed at the cutoff and compare the two models' χ². Here, fixing φ at .85 makes the fit worse, Δχ²(1) = 13.59, p < .001: if the correlation between the traits were .85, a loss of fit at least this large would turn up less than 0.1% of the time. Fixing it at 1, which is the same as scoring all ten items as one scale, makes the fit far worse, Δχ²(1) = 225.46. Rönkkö and Cho (2022) recommend this comparison, or φ's interval, as the general approach; HTMT is the quick version for when you can't fit a CFA, and here all three agree.

If your scales come out worse than these, the next step depends on how much worse. When the upper limit falls between .90 and 1, Rönkkö and Cho (2022) call it a moderate problem: check whether earlier studies with the same scales found the same overlap. When the interval reaches 1, the scales can't be told apart in your data. Look for items whose wording straddles both traits, rewrite or drop them and collect new data, or score the items as one scale and say so.

Which limit you check is itself a choice. Rönkkö and Cho (2022) put the burden on distinctness: the upper limit of a 95% interval must fall below the cutoff. Cheung et al. (2024) take the opposite view and flag a problem only when the lower limit of a 90% interval is above the cutoff, which here it clearly isn't. Say which rule you used.

The one test in the analysis is the factor model's fit, χ²(34) = 35.89, p = .380. That asks whether two factors describe the items, not whether they're distinct. With a large sample it flags even trivial misfit, so read it alongside CFI, RMSEA and SRMR.

Precision and Sample Size

Power is the chance that a study detects an effect that's really there. HTMT isn't tested against zero, so power in that sense doesn't apply. Power to reject a cutoff does apply if you use the model comparison (fixing the factor correlation at .85), but it's simpler to plan for precision: enough people that the bootstrap interval is narrow enough to say which side of your cutoff the correlation falls on. The closer the true correlation sits to the cutoff, the more people you need.

With our 300 adults the interval is about ±.06 wide. The width shrinks with the square root of the sample size, so with 100 adults it would be roughly ±.11: anywhere from about .64 to .86, too wide to say whether the traits clear .85.

Plan for precision: aim for an interval whose upper end would fall below your cutoff if the correlation is what theory expects. For two closely related traits, that usually means a few hundred people, not a few dozen. There's no calculator for this test.

Other Info

Follow-Up and Post Hoc Tests

None. This page estimates rather than tests, so there are no follow-up comparisons to run.

References

  • Campbell, D. T., & Fiske, D. W. (1959). Convergent and discriminant validation by the multitrait-multimethod matrix. Psychological Bulletin, 56(2), 81–105. https://doi.org/10.1037/h0046016
  • Fornell, C., & Larcker, D. F. (1981). Evaluating structural equation models with unobservable variables and measurement error. Journal of Marketing Research, 18(1), 39–50. https://doi.org/10.1177/002224378101800104
  • Henseler, J., Ringle, C. M., & Sarstedt, M. (2015). A new criterion for assessing discriminant validity in variance-based structural equation modeling. Journal of the Academy of Marketing Science, 43(1), 115–135. https://doi.org/10.1007/s11747-014-0403-8
    “We suggest assessing the heterotrait-monotrait ratio (HTMT) of the correlations, which is the average of the heterotrait-heteromethod correlations (i.e., the correlations of indicators across constructs measuring different phenomena), relative to the average of the monotrait-heteromethod correlations (i.e., the correlations of indicators within the same construct).” (p. 121)
    “The most commonly used approach, the Fornell-Larcker criterion, fails to identify discriminant validity issues in the vast majority of cases” (p. 124)
    “Some authors suggest a threshold of 0.85 (Clark and Watson 1995; Kline 2011), whereas others propose a value of 0.90 (Gold et al. 2001; Teo et al. 2008).” (p. 121)
    “the HTMT approach is an estimate of the correlation between the constructs” (p. 121)
    “the HTMT-based criteria assume reflectively measured constructs” (p. 131)
  • Rönkkö, M., & Cho, E. (2022). An updated guideline for assessing discriminant validity. Organizational Research Methods, 25(1), 6–47. https://doi.org/10.1177/1094428120968614
    “HTMT is equivalent to a disattenuated correlation of unit-weighted composites using parallel reliability (i.e., the standardized alpha, proof in the appendix).” (Heterotrait-Monotrait Ratio (HTMT))
    “The original criterion is that both AVE values must be greater than the SV.” (AVE/SV or Fornell-Larcker Criterion)
    “In the Marginal case, the interpretation of the scales as representations of distinct constructs is probably safe.” (A Guideline for Assessing Discriminant Validity, p. 31 (OnlineFirst))
    “Thus, if there is a threshold, it is likely to fall between .8 and .9.” (On Choosing a Technique and a Cutoff)
    “Thus, the term “average indicator reliability” might be more informative than “average variance extracted.”” (AVE/SV or Fornell-Larcker Criterion)
  • Cheung, G. W., Cooper-Thomas, H. D., Lau, R. S., & Wang, L. C. (2024). Reporting reliability, convergent and discriminant validity with structural equation modeling: A review and best-practice recommendations. Asia Pacific Journal of Management, 41(2), 745–783. https://doi.org/10.1007/s10490-023-09871-y
    “we suggest the more appropriate strategy is to compare the lower limit of the 90% CI with the threshold” (p. 761)
    “comparing the disattenuated correlation or HTMT ratio with a threshold value of 0.85 disregards sampling error” (p. 756)
  • Roemer, E., Schuberth, F., & Henseler, J. (2021). HTMT2—An improved criterion for assessing discriminant validity in structural equation modeling. Industrial Management & Data Systems, 121(12), 2637–2650. https://doi.org/10.1108/IMDS-02-2021-0082
  • Hu, L., & Bentler, P. M. (1999). Cutoff criteria for fit indexes in covariance structure analysis: Conventional criteria versus new alternatives. Structural Equation Modeling, 6(1), 1–55. https://doi.org/10.1080/10705519909540118
  • Efron, B. (1979). Bootstrap methods: Another look at the jackknife. The Annals of Statistics, 7(1), 1–26. https://doi.org/10.1214/aos/1176344552
  • Preacher, K. J., & Hayes, A. F. (2008). Asymptotic and resampling strategies for assessing and comparing indirect effects in multiple mediator models. Behavior Research Methods, 40(3), 879–891. https://doi.org/10.3758/BRM.40.3.879
    “percentile bootstrap CIs can be asymmetrical because they are based on an empirical estimation of the sampling distribution of the indirect effect, rather than on an assumption that the sampling distribution is normal” (p. 883)
    “We recommend at least 5,000 resamples for final reporting, although 1,000 is probably sufficient for preliminary analyses.” (p. 889, note 5)
  • MacCallum, R. C., Roznowski, M., & Necowitz, L. B. (1992). Model modifications in covariance structure analysis: The problem of capitalization on chance. Psychological Bulletin, 111(3), 490–504. https://doi.org/10.1037/0033-2909.111.3.490
    “The use of alternative a priori models is recommended as a preferred strategy.” (Abstract)
  • Dunn, T. J., Baguley, T., & Brunsden, V. (2014). From alpha to omega: A practical solution to the pervasive problem of internal consistency estimation. British Journal of Psychology, 105(3), 399–412. https://doi.org/10.1111/bjop.12046
    “Generally, the larger the violation of tau-equivalence the more coefficient alpha underestimates score reliability” (Accepted manuscript, p. 8)

Spot an error? Something still confusing? Tell us at support@statsforpsychology.com.