Average Variance Extracted (AVE)
Source:R/average_variance_extracted.R
average_variance_extracted.RdThe average variance extracted (AVE) is the mean proportion of indicator
variance a factor accounts for, a standard convergent validity summary
for a reflective measurement block in confirmatory factor analysis and
structural equation modeling. With standardized loadings \(\ell_j\),
$$\mathrm{AVE} = \frac{1}{J} \sum_j \ell_j^2.$$
The quantity itself is elementary. In a model with cross-loadings, an
item contributes its loading to the AVE of every factor it loads on;
the same shared variance then counts toward each factor's summary, so
compare AVE values across factors of such a model with that overlap in
mind. Fornell and Larcker (1981) are
credited for establishing it as a validity criterion: a construct shows
convergent validity when its AVE reaches the conventional 0.50 (the
construct explains at least half its indicators' variance), and the
Fornell-Larcker discriminant criterion compares each construct's AVE with
its squared correlations with the other constructs. AVE is closely
related to composite reliability (omega); the modern complement on the
discriminant side is htmt.
Usage
average_variance_extracted(
fit = NULL,
loadings = NULL,
conf_level = 0.95,
ci_method = c("none", "percentile"),
B = 1000L,
seed = NULL
)Arguments
- fit
Optional lavaan fit (for example from
cfa_1orlavaan::cfa); the standardized loadings of every factor are extracted and one AVE is reported per factor.- loadings
Optional numeric vector of standardized loadings for a single block, as an alternative to
fit. Supply exactly one offitandloadings. No interval can be constructed from loadings alone (their sampling variability is not carried by the numbers), soci_method = "percentile"requiresfit.- conf_level
Confidence level for the bootstrap interval (default
0.95); used whenci_method = "percentile".- ci_method
Interval method:
"none"(the default) or"percentile". No closed-form interval for the AVE is in common use; the percentile bootstrap is the standard route in the validity literature. The cases in the fitted data are resampled with replacementBtimes, the model is refit to each resample, and each factor's interval is the pair of empirical quantiles of itsBAVE values (Efron & Tibshirani, 1993). Replications whose refit fails or does not converge are dropped, and the interval is computed from those that return a value; a single warning reports how many were dropped.- B
Number of bootstrap replications when
ci_method = "percentile"(default1000). The default is smaller than the package's usual10000because every replication refits the model; raise it for a reported analysis when time allows.- seed
Optional integer seed for the bootstrap. The default
NULLuses the current state of the random number generator; a supplied seed is set internally and the prior state restored on exit.
Value
A data.frame (class dmar_tbl) with one row
per factor: factor (label), ave, and
ci_lower / ci_upper (the percentile bootstrap
limits; NA when ci_method = "none").
References
Efron, B., & Tibshirani, R. J. (1993). An introduction to the bootstrap. New York, NY: Chapman & Hall/CRC.
Fornell, C., & Larcker, D. F. (1981). Evaluating structural equation models with unobservable variables and measurement error. Journal of Marketing Research, 18(1), 39–50.
See also
htmt for discriminant validity;
reliability_omega for the composite reliability of the
same block (coefficient omega is what the composite-reliability
literature computes); cfa_1 to obtain the fit.
Other multivariate and latent variable methods:
bifactor_indices(),
cfa_1(),
cfa_2(),
cfa_k(),
ci_eigenvalue(),
common_method_marker(),
common_method_single_factor(),
dmacs(),
ecvi(),
htmt(),
irt_grm(),
irt_information(),
measurement_alignment(),
measurement_invariance(),
procrustes_phi(),
simple_structure()
Author
Ken Kelley kkelley@nd.edu
Examples
# Directly from the standardized loadings a paper reports:
average_variance_extracted(loadings = c(.8, .7, .6))
#> factor ave ci_lower ci_upper
#> f 0.497 <NA> <NA>
# From a fitted model, one AVE per factor (requires lavaan).
data(holzinger_swineford)
fit <- lavaan::cfa(
"verbal =~ t6_paragraph_comprehension + t7_sentence +
t9_word_meaning
deduction =~ t20_deduction + t22_problem_reasoning +
t23_series_completion",
data = holzinger_swineford)
ave_tbl <- average_variance_extracted(fit)
ave_tbl
#> factor ave ci_lower ci_upper
#> deduction 0.469 <NA> <NA>
#> verbal 0.719 <NA> <NA>
# The Fornell and Larcker (1981) discriminant criterion compares each
# factor's AVE with the squared correlation between the factors: a
# factor should account for more of its own indicators' variance than
# it shares with the other factor. Here the comparison favors verbal
# and goes against deduction, whose AVE falls below the shared
# variance. Fitting with cfa_k(..., output = "measurement") puts the
# AVE values and the latent correlations in one table.
lavaan::lavInspect(fit, "cor.lv")["verbal", "deduction"]^2
#> [1] 0.5327517
# An interval comes from ci_method = "percentile", which resamples the
# cases and refits the model once per replication. That refitting is
# why it is not run here; the call is
# average_variance_extracted(fit, ci_method = "percentile",
# B = 1000, seed = 113)
# and a reported interval deserves the default B = 1000 or more.
# The broom verbs: one row per factor.
generics::tidy(ave_tbl)
#> term estimate ci_lower ci_upper
#> 1 deduction 0.4694312 NA NA
#> 2 verbal 0.7193173 NA NA
generics::glance(ave_tbl)
#> n_terms conf_level B_used
#> 1 2 NA NA