Skip to content

seminr

2.6.0Package record

Building and Estimating Structural Equation Models

1packages dependsuggested by 2
46.4Kdownloads / year
88.4%test coverage
13/13flavors OK

Overview

About

A powerful, easy to use syntax for specifying and estimating complex Structural Equation Models. Models can be estimated using Partial Least Squares Path Modeling or Covariance-Based Structural Equation Modeling or covariance based Confirmatory Factor Analysis (Ray, Danks, and Valdez 2021 doi:10.2139/ssrn.3900621).

Changes in 2.6.0

New features

  • predict() now works for CB-SEM models from estimate_cbsem(), using the model-implied conditional expectation of de Rooij et al. (2023), the rule of lavaan::lavPredictY(). predict_DA and predict_EA choose the predictor items as for PLS and PLSc, so the three estimators' predictions are comparable. Models with interaction terms, higher-order constructs, ordinal indicators or multiple groups, and non-converged or inadmissible fits, stop with the reason (#426).

Fixed

  • predict() and predict_pls() pushed composite scores, built from the uncorrected outer weights, through the PLSc-corrected path coefficients and loadings whenever a model had reflective() constructs. PLSc coefficients describe the common factors, not the composites, so the predictions were over-dispersed (by 1/sqrt(rho_A) with a single antecedent) or reweighted across correlated antecedents. PLSc models are now predicted with the model-implied conditional expectation of de Rooij et al. (2023), using the indicator correlations implied by the PLSc estimates; predict_DA and predict_EA set the predictor items. Inadmissible PLSc solutions stop with the reason (the checks are listed in ?predict.seminr_model), and PLSc models with interaction terms are no longer predicted (#427). Models without reflective constructs are unchanged (#425).
Show all changes in 2.6.0Hide the rest of the changes in 2.6.0
  • In predict_pls(), a PLSc solution can be inadmissible in a training fold even when the full-sample solution is admissible, especially with few folds (for the mobi ECSI model, in about 70% of 5-fold and 30% of 10-fold runs). Such folds are skipped with one warning that names them: their test rows are NA for both PLS and the LM benchmark, and the prediction metrics use the remaining rows. If every fold is inadmissible, predict_pls() stops. The PLS chain is never used as a fallback. Cross-validation also no longer turns any error or warning inside a fold into a failure with an unrelated message ("row names supplied are of the wrong length"); they now reach the caller.
  • Models estimated by seminr < 2.6.0 and saved (e.g. with saveRDS()) keep their old PLSc estimates. predict() on such a model that mixes reflective() constructs with Mode A or unit-weighted composites now warns to re-estimate it. estimate_pls() stamps models with seminr_version for this purpose.
  • PLSc (estimate_pls() with reflective() constructs) corrected the paths into and out of Mode A and unit-weighted composites as if they were common factors, by dividing their correlations by sqrt(rho_A). Only Mode B composites were left uncorrected. Consistent PLS corrects only common factors and treats composites as fully reliable (Dijkstra & Henseler, 2015), as cSEM does. All composites now use rho_A = 1 in PLSc. **Path coefficients and R² change for models that mix reflective() constructs with Mode A or unit-weighted composite() constructs.** Loadings, all-reflective models, models with only Mode B composites next to reflective constructs, and models without reflective constructs are unchanged. The rho_A reported by summary() is unchanged. Calling PLSc() directly on a model without reflective constructs now leaves it unchanged (it used to disattenuate its composites) (#430).
  • PLSc corrected a two-stage higher_composite() with rho_A computed on its lower-order construct (LOC) scores, as if the HOC were a common factor of them. A HOC of composite LOCs is now treated as fully reliable (rho = 1). A HOC of common-factor LOCs is corrected with the reliability of its stage-2 proxy, a weighted sum of error-laden LOC scores: w'S*w, with the LOCs' stage-1 reliabilities on the diagonal of S* (van Riel et al., 2017), as cSEM's two-stage approach does. **Path coefficients and R² change for PLSc models with higher_composite() constructs** (on mobi, IE -> Satisfaction 0.953 -> 0.920 with reflective LOCs; cSEM 0.918). A HOC of common factors is now corrected even when no stage-2 construct is reflective, and a reflective() construct that is declared but not used in the structural model no longer makes estimate_pls() run PLSc.
  • predict_pls() on a model from estimate_cbsem() failed with an unrelated low-level error (the CB-SEM object inherits seminr_model but has no weights or loadings). It now stops with a message pointing to predict(). predict() and predict_pls() on a model from estimate_cfa() failed the same way; they now stop and say that a CFA has no structural model to predict from (#426).
  • plot.reliability_table() drew its reference line at 0.708, which is the indicator **loading** threshold (0.708² ≈ 0.50 explained variance). The metrics that plot shows — Cronbach's alpha, rhoA and rhoC — are construct-level internal consistency reliabilities, judged against **0.70**. The line is now drawn at 0.70, and the value is exposed as a threshold argument so it can be overridden and so the intended value is documented rather than buried (#421). Reported by Marko Sarstedt.
  • predict_pls(reps = k) repeated the cross-validation on the same folds, so every repetition gave the same predictions and reps had no effect. Each repetition now draws new random folds, and the predictions are averaged over the repetitions. **Results change for any call with reps greater than 1**, including assess_cvpat(), assess_cvpat_compare(), assess_pcm() and assess_coa() in seminrExtras, which pass reps on to predict_pls(). reps = NULL and reps = 1 give the same results as before. A fold skipped as inadmissible (PLSc) in one repetition is averaged over the others.
  • predict() on test data with a missing value returned NA for every prediction in that case's row, because the matrix products spread the NA through zero weights, loadings and paths (NA * 0 is NA). Only the predictions that use the missing value are NA now: a missing item makes its own construct's score NA and the predictions that depend on it, and leaves the others. Predictions for complete data are unchanged. PLSc models already behaved this way.
  • estimate_pls() returned inadmissible PLSc solutions without notice. It now warns, once, with every problem found: a rho_A above one, a standardized loading above one, a disattenuated construct correlation of 1 or more in absolute value, a structural-model-implied construct correlation matrix that is not positive definite, or an R-squared outside [0, 1]. The estimates are still returned. Such solutions are common in small samples.
  • bootstrap_model() drops resamples whose estimation fails or warns, so inadmissible PLSc resamples are now excluded from the bootstrap statistics. The number dropped is reported in the final message, stored in the model as boots_dropped (with boots_requested), and printed by summary(). **Bootstrap standard errors, t values, p values and confidence intervals change for PLSc models with inadmissible resamples**: for a mobi model with a weak reflective block, 69 of 500 resamples were dropped, and the t value of its weakest discriminant validity estimate rose from 0.95 to 1.52.
  • PLSc divides by sqrt(rho_A). A rho_A of zero or below gave NaN paths, R-squared and loadings with only R's "NaNs produced" warnings; estimate_pls() now stops and names the constructs. A cross-validation fold or bootstrap resample with such a rho_A is skipped.
  • construct_order() looped forever on structural models in which an outcome construct's antecedents are ordered before the rest of the model (e.g. Image -> Loyalty next to Image -> Expectation -> Quality), so predict(technique = predict_EA) hung on them. A structural model with a cycle now stops with an error.
  • The note that PLSc estimates of interaction models are subject to some bias (Becker et al., 2018) never showed, because estimate_pls() checked a field that is never set. It now shows for PLSc models with interaction terms.
  • estimate_pls() with a higher_reflective() construct, which is supported by estimate_cbsem() only, failed with "undefined columns selected". It now stops and points to estimate_cbsem() or higher_composite().
  • PLSc() on a model with a higher-order construct, already corrected by estimate_pls(), failed with "subscript out of bounds". It now returns the model unchanged with a message.
  • Parallel processing failed to start ("creation of server socket failed") when its port was in use, e.g. by another R session started at the same time. It now retries on other ports.

Changed

  • The package maintainer address is now seminrgroup@gmail.com (#420).
  • bootstrap_model() with the default cores = NULL still uses every core. During R CMD check with CRAN's core limit set (_R_CHECK_LIMIT_CORES_, as with --as-cran and on CRAN), it uses at most two, so the package's tests and vignettes stay within CRAN policy. Results do not depend on the number of cores.

Performance

Substantial internal speedups across the heavy routines. **These are refactors

only — no result changes.** Verified against the PLS-SEM R book code: with seeds

pinned, 2.5.0 and 2.6.0 agree to max|diff| = 0 on every deterministic quantity

(path coefficients, loadings, weights, R², reliability, HTMT, AVE, VIF) and every

bootstrap quantity, for both cores = 1 and cores = 2.

  • simplePLS() skips redundant matrix work in the estimation loop.
  • HTMT() reuses one correlation block per construct instead of recomputing.
  • predict_pls() avoids redundant model refits and per-item lm fits.
  • Cross-validation reuses the full-model reference scores.
  • PLS-MGA p-values are computed without expand.grid.
  • bootstrap_model(cores = 1) now runs replicates in-process rather than shipping them to a one-worker PSOCK cluster, and saves and restores the caller's RNG state. Replicates continue to use set.seed(seed + i), so bootstrap results remain identical across core counts and across versions.
  • Added a benchmark harness covering the heavy PLS routines.

From NEWS.md in the release

Install

Health

CRAN checks
13OK
Slowest check: 8.9 min · r-release-macos-x86_64
Status changes
  • OK13 OK2026-08-04
  • NOTE12 OK, 1 NOTE2026-08-01
  • OK13 OK2026-06-09
  • ERROR12 OK, 1 ERROR2026-06-08
  • NOTE12 OK, 1 NOTE2026-06-07
Show 2 earlier changesHide 2 earlier changes
  • OK12 OK2026-04-25
  • NOTE13 OK, 1 NOTE2026-03-10
Advisories

none known

Documentation

In release 2.6.0
READMEYes · 1,101 wordsVignettesYes · 1 · dynamicNEWSYes · 100% structured · mentions 2.6.0Citation fileNo
Help pages
117 (10 internal)includes a package overview page
Examples that run
98%46 run in a plain check · 1 never run
Exported functions with examples
49%
Documented parameters
98%
Return-value docs
84%
Help pages citing references
17%

Also includes 10 demo scripts (run with demo())

Vignettes (1)

Downloads

46.4K
CRAN downloads in the past year
Rank #1,494 · ~127/day · ~3.9K/mo
Daily download trend is not available in this view yet.
5.3K30 days
16.6K90 days
46.4K1 year
Compare downloads with other packages →
Also on140 r2u9 autocran

Repository

79Stars
30Forks
46Open issues
6Open PRs
3Releases
661Commits
9Commit identities
pls-modelscommon-factorscompositesconstructr
661 commits · Last activity 2026-10-20 · 0% stars, 30d · Discussions: 3 posts
Responsiveness
How these are sampled
PRs merged (all time)
87%
Median days to close, 50 most recently updated closed issues
546
Median days to close, 50 most recently updated closed PRs
1

Stars over time

2025-09-30 · 622026-08-26 · 79
PracticesBeta

9 development-tooling and community-health practices detected across 5 families in the upstream repository

Checks run against github.com/sem-in-r/seminr on 2026-10-18.

Continuous integration (2)
GitHub ActionsR CMD check workflow

The R CMD check workflow runs on Linux, macOS and Windows, and on R-devel

Governance and community (2)
Issue templatesCODEOWNERS
Docs source (2)
README.Rmd

GitHub Pages site last deployed 2021-10-18

CRAN release process (1)
cran-comments.md
Show all practicesHide 1 practice
Lint, format, editor (2)
lintrRStudio project
How this is detected·Detection ruleset v3 (2026-09-26)
AI coding toolsBeta

This repository shows signs of AI coding tools.

  • Claude Codefirst seen 2026-02-01
    Seen in the repository: CLAUDE.md
    Named in .Rbuildignore: .claude, CLAUDE.local.md, CLAUDE.md
    Named in .gitignore: .claude, CLAUDE.local.md
    Pull request it wrote: opened by a project member
    Commits: at least 17 crediting it in the message
Models named in its commits
  • Claude Opus 4.516 commits · Feb 2026
  • Claude Opus 4.61 commit · Feb 2026
Counts are commits, not lines of code. Commits by a tool's accounts count once across all of its accounts. Commits crediting it are the largest count among its credit lines, a minimum.How this is detected·Detection ruleset v4 (updated 2026-09-27)

Dependencies

Declared dependencies
8 external dependencies (excludes base and recommended)

Installing seminr adds 70 packages (37 with compiled code, 55 MB of source tarballs). Heaviest: stringi 11 MB, bslib 5.6 MB, igraph 4.8 MB.

Depends (1)
R >= 4.1.0
Imports (6)
LinkingTo (0)
none
Enhances (0)
none
Reverse dependencies
1direct
0indirect
Imports 1
Suggested by 2
Depends, Imports or LinkingTo, most downloaded first
Suggests, most downloaded first

Datasets

People & History

People (10)
Author, Maintainer · added in 1.0.1
Author · added in 2.0.0
Author, Thesis advisor
Contributor · added in 2.0.0
Contributor · added in 2.0.0
Contributor · added in 1.1.0
Contributor · added in 0.4.0
Contributor · added in 2.0.0
Contributor · added in 2.0.0
Contributor · added in 1.1.0

Maintainer since 0.3.1 (2018)

Listed in earlier versions (1)
Nicholas Danks
no longer listed · 0.3.1 to 1.0.0
Releases (29)

Pick two releases to compare their code metrics.

  • 2.6.0Latest
    record
    2026-10-13 · current release · diff ↗ ·
    5 hours in CRAN's queue
    Listed in CRAN's incoming queue from 2026-10-13 16:37 to 2026-10-13 21:40 UTC, in 2 readings.
  • 2.5.0
    record
    2026-05-25 · diff ↗ ·
    removed 1 export
    is_sink
    added 10 exports
    all_composites, all_factors, all_non_interactions, construct_items, construct_mode, construct_name, construct_names, construct_type, is_only_endogenous, quadratic_term
  • R
    R 4.6.0 released · 2026-04-24
  • 2.4.2
    record
    2026-02-18 · diff ↗ ·
    removed 1 export
    check_test_plot
  • 2.4.0
    record
    2026-01-27 · diff ↗ ·
    removed 1 export
    seminr_theme_old
    added 2 exports
    mode_plsc, seminr_theme_academic
  • unarchivedReturned to CRAN
    2025-09-03
  • 2.3.7
    record
    2025-09-03 · diff ↗ ·
    added 1 export
    report_missing
  • archivedRemoved from CRAN
    2025-08-25
    errors were not corrected in time
  • 2.3.6
    record
    2025-07-24 · diff ↗ ·
    added 1 export
    rhoC_AVE
  • R
    R 4.5.0 released · 2025-04-11
  • 2.3.4
    record
    2024-10-13 · diff ↗
  • 2.3.3
    record
    2024-06-17 · diff ↗
  • R
    R 4.4.0 released · 2024-04-24
  • R
    R 4.3.0 released · 2023-04-21
  • 2.3.2
    record
    2022-10-12 · diff ↗
  • 2.3.1
    record
    2022-06-30 · diff ↗ ·
    added 2 exports
    boot_paths_df, unit_weights
Show 27 earlier eventsHide 27 earlier events
  • R
    R 4.2.0 released · 2022-04-22
  • 2.3.0
    record
    2022-01-04 · diff ↗ ·
    added 2 exports
    estimate_pls_mga, rerun
  • 2.2.1
    record
    2021-09-02 · diff ↗
  • 2.2.0
    record
    2021-08-18 · diff ↗ ·
    added 1 export
    plot_interaction
  • R
    R 4.1.0 released · 2021-05-18
  • 2.1.0
    record
    2021-05-13 · diff ↗ ·
    removed 1 export
    confidence_interval
    added 3 exports
    higher_reflective, is_sink, specific_effect_significance
  • unarchivedReturned to CRAN
    2021-04-25
  • 2.0.2
    record
    2021-04-25 · diff ↗
  • archivedRemoved from CRAN
    2021-03-31
    policy violation Harassing CRAN team with HTML, repeatedly
  • 2.0.1
    record
    2021-03-22 · diff ↗
  • 2.0.0
    record
    2021-03-10 · diff ↗ ·
    added 29 exports
    browse_plot, check_test_plot, compute_itcriteria_weights, csem2seminr, dot_graph, dot_graph_htmt, edge_template_default, edge_template_minimal, get_theme_doc, last_seminr_plot, mean_replacement, node_endo_template_default, node_exo_template_default, plot_htmt, predict_DA, predict_EA, predict_pls, save_plot, seminr_theme_create, seminr_theme_dark, seminr_theme_default, seminr_theme_get, seminr_theme_old, seminr_theme_set, seminr_theme_smart, set_last_seminr_plot, slope_analysis, specify_model, total_indirect_ci
  • 1.1.0
    record
    2020-07-23 · diff ↗ ·
    added 6 exports
    as.reflective, associations, estimate_cbsem, estimate_cfa, estimate_lavaan_ten_berge, item_errors
  • 1.0.2
    record
    2020-05-08 · diff ↗
  • R
    R 4.0.0 released · 2020-04-24
  • 1.0.1
    record
    2019-12-12 · diff ↗
  • 1.0.0
    record
    2019-09-27 · diff ↗ ·
    removed 4 exports
    SRMR, interaction_ortho, interaction_scaled, interactions
    added 6 exports
    fSquared, higher_composite, interaction_term, orthogonal, product_indicator, two_stage
  • 0.7.0
    record
    2019-05-07 · diff ↗
  • R
    R 3.6.0 released · 2019-04-26
  • 0.6.0
    record
    2019-03-20 · diff ↗ ·
    added 1 export
    confidence_interval
  • 0.5.3
    record
    2018-10-18 · diff ↗
  • 0.5.2
    record
    2018-09-19 · diff ↗
  • 0.5.1
    record
    2018-09-10 · diff ↗
  • 0.5.0
    record
    2018-06-26 · diff ↗ ·
    removed 1 export
    rhoA
    added 2 exports
    SRMR, rho_A
  • R
    R 3.5.0 released · 2018-04-23
  • 0.4.0
    record
    2018-01-18 · diff ↗
  • 0.3.1
    record
    2018-01-05
  • R
    R 3.4.0 released · 2017-04-21
Across CRAN, the median accepted release of the past year spent 26 hours in the queue, 90% under 11 days.How queue time is measured

Package metadata

First published
2018-01-05
Total releases
29 / 8 yrs
License
GPL-3 OSI
Minimum R
≥ 4.1.0
Bundled data
21 KB / 4 files
Download size
1.7 MB

Cite

Cite this package

Run in R for the authors' preferred citation:

citation("seminr")
Danks, N. P., Adler, S., Burbach, L., Calero Valdez, A., Cano Bejar, A. H., Estrada, J. M. V., Koyan, L., Nakayama, J., Ray, S., & Uanhoro, J. (2026). seminr: Building and Estimating Structural Equation Models (Version 2.6.0) [Computer software]. https://doi.org/10.32614/CRAN.package.seminr

This package has no citation file, so citation() returns this entry built from DESCRIPTION.

Cite the R Observatory

For a number measured here: a download total, a coverage figure, an archival date.

APA

Balamuta, J. J. (2026). R Observatory: Metrics for seminr version 2.6.0 [Data set]. HJJB, LLC. Data release v2026-10-22. https://doi.org/10.5281/zenodo.21843040

From data release v2026-10-22, which the citation names so these numbers can be found later. More on citing and the projects behind them.

Report a problem with this page →

Privacy choices

These apply to this browser and are stored on this device only. Nothing about your choice is sent to us.

Read the privacy policy