# Fornell-Larcker Criterion with R using lavaan

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:

``reliability(fit)``
``````##           visual   textual     speed
## alpha  0.6261171 0.8827069 0.6884550
## omega  0.6253180 0.8851754 0.6877600
## omega2 0.6253180 0.8851754 0.6877600
## omega3 0.6120052 0.8850608 0.6858417
## avevar 0.3705589 0.7210163 0.4244883``````

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"))``
``````## # A tibble: 2 x 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)``
``````## # A tibble: 2 x 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``````