Fornell-Larcker Criterion with R using lavaan
Update 2025
The Fornell-Larcker criterion has been criticized in an influential paper on discriminant validity (Rönkko & Cho, 2022). The authors have kindly created a function to make use of their suggested procedure, available in the semTools package. The function is called discriminantValidity().
Main Post
The Fornell-Larcker criterion (Fornell & Larcker, 1981, p. 41) is a popular technique to check the discriminant validity of constructs in structural equation models. The criterion states that the average variance extracted (AVE) of items by a construct (factor) should be larger than the squared correlation of the latent construct with the discriminant construct. This article shows how to compute the Fornell-Larcker criterion in R with lavaan-based SEM analyses.
We use the classic dataset also used in the lavaan examples, the Holzinger and Swineford (1939) data of mental ability test scores. The factor model consists of three intercorrelated factors (visual, textual, speed), with 9 different tests making up the indicators.
library(tidyverse)
library(lavaan)
library(semTools)
HS.model <- ' visual =~ x1 + x2 + x3
textual =~ x4 + x5 + x6
speed =~ x7 + x8 + x9 '
fit <- cfa(HS.model, HolzingerSwineford1939)
The Fornell-Larcker criterion can be applied to test whether the three factors can be discriminated from each other. Let’s consider the two sides of the equation that makes up the criterion: Average Variance Extracted (AVE) and the (squared) correlations of the latent constructs.
AVE is the variance extracted of each indicator by its factor, as indicated by the squared standardized loadings, divided by the total variance of each indicator, averaged over all indicator that are specified to load on the factor. The package semTools provides the AVE of a lavaan model:
AVE(fit)
visual textual speed
0.371 0.721 0.424
The squared correlations of the latent constructs can be computed by extracting the correlation of the latent constructs from the fitted lavaan object and squaring them.
lavInspect(fit, what = "cor.lv")^2
visual textul speed
visual 1.000
textual 0.210 1.000
speed 0.221 0.080 1.000
To relate the AVE to the squared correlations, I have written a function that we will load next.
source("https://raw.githubusercontent.com/franciscowilhelm/r-collection/master/forn_larcker_test.R")
Let us assume we are interested in whether the visual factor can be discriminated from the textual and speed factors according to the Fornell-Larcker criterion. We supply the fitted lavaan object, as well as x (“our” construct) and y (the constructs that we want to test against) constructs to the function.
forn_larcker_test(fit, x = c("visual"), y = c("textual", "speed"))
Warning in semTools::reliability(lavmodel):
The reliability() function was deprecated in 2022 and will cease to be included in future versions of semTools. See help('semTools-deprecated) for details.
It is replaced by the compRelSEM() function, which can estimate alpha and model-based reliability in an even wider variety of models and data types, with greater control in specifying the desired type of reliability coefficient (i.e., more explicitly choosing assumptions).
The average variance extracted should never have been included because it is not a reliability coefficient. It is now available from the AVE() function.
Warning in semTools::reliability(lavmodel):
The reliability() function was deprecated in 2022 and will cease to be included in future versions of semTools. See help('semTools-deprecated) for details.
It is replaced by the compRelSEM() function, which can estimate alpha and model-based reliability in an even wider variety of models and data types, with greater control in specifying the desired type of reliability coefficient (i.e., more explicitly choosing assumptions).
The average variance extracted should never have been included because it is not a reliability coefficient. It is now available from the AVE() function.
# A tibble: 2 × 6
x y criterion latcor_sq ave_x ave_y
* <chr> <chr> <lgl> <dbl> <dbl> <dbl>
1 visual textual TRUE 0.210 0.371 0.721
2 visual speed TRUE 0.221 0.371 0.424
The function returns the names of the x and y constructs, whether the Fornell-Larcker criterion is met, the squared latent correlation of the x-y pair, as well as the AVE of X and Y. We can see that the Fornell-Larcker criterion is met, as the latent squared correlations are lower than the AVEs of X and Y.
Some papers use a modified version of the Fornell-Larcker criterion, where only the AVE of the X construct, not the AVE of the Y construct, is compared against the latent squared correlation. We can use this version by supplying the x.only = TRUE argument.
forn_larcker_test(fit, x = c("visual"), y = c("textual", "speed"), x.only = TRUE)
Warning in semTools::reliability(lavmodel):
The reliability() function was deprecated in 2022 and will cease to be included in future versions of semTools. See help('semTools-deprecated) for details.
It is replaced by the compRelSEM() function, which can estimate alpha and model-based reliability in an even wider variety of models and data types, with greater control in specifying the desired type of reliability coefficient (i.e., more explicitly choosing assumptions).
The average variance extracted should never have been included because it is not a reliability coefficient. It is now available from the AVE() function.
Warning in semTools::reliability(lavmodel):
The reliability() function was deprecated in 2022 and will cease to be included in future versions of semTools. See help('semTools-deprecated) for details.
It is replaced by the compRelSEM() function, which can estimate alpha and model-based reliability in an even wider variety of models and data types, with greater control in specifying the desired type of reliability coefficient (i.e., more explicitly choosing assumptions).
The average variance extracted should never have been included because it is not a reliability coefficient. It is now available from the AVE() function.
# A tibble: 2 × 6
x y criterion latcor_sq ave_x ave_y
* <chr> <chr> <lgl> <dbl> <dbl> <dbl>
1 visual textual TRUE 0.210 0.371 0.721
2 visual speed TRUE 0.221 0.371 0.424
References
Fornell, C., & Larcker, D. F. (1981). Evaluating Structural Equation Models with Unobservable Variables and Measurement Error. Journal of Marketing Research, 18(1), 39. https://doi.org/10/cwp Rönkkö, M., & Cho, E. (2022). An Updated Guideline for Assessing Discriminant Validity. Organizational Research Methods, 25(1), 6–14. https://doi.org/10.1177/1094428120968614