Build Status CRAN_Status_Badge metacran downloads

Introduction

SEMinR brings many advancements to creating and estimating structural equation models (SEM) using Partial Least Squares Path Modeling (PLS-PM):

SEMinR follows the latest best-practices in methodological literature:

Briefly, there are three steps to specifying and estimating a structural equation model using SEMinR:

  1. Describe measurement model for each construct and its items, specifying interaction terms and higher order constructs:
# Distinguish and mix composite or reflective (common-factor) measurement models
measurements <- constructs(
  composite("Image",       multi_items("IMAG", 1:5), weights = mode_B),
  composite("Expectation", multi_items("CUEX", 1:3), weights = mode_A),
  composite("Loyalty",    multi_items("CUSL", 1:3)),
  composite("Quality",      multi_items("PERQ", 1:7)),
  composite("Complaints",   single_item("CUSCO")),
  interaction_term("Image", "Expectation", method =  orthogonal, weights = mode_A),
  higher_composite("Value", "Complaints", method = two_stage, weights = mode_B)
)
  1. Describe the structural model of causal relationships between constructs (and interaction terms):
# Quickly create multiple paths "from" and "to" sets of constructs
structure <- relationships(
  paths(from = c("Image", "Expectation", "Image*Expectation", "Value"), 
        to = "Loyalty")
)
  1. Put the above elements together to estimate and bootstrap the model:
# Dynamically compose SEM models from individual parts
pls_model <- estimate_pls(data = mobi, measurements, structure)
summary(pls_model)

# Use multi-core parallel processing to speed up bootstraps
boot_estimates <- bootstrap_model(pls_model, nboot = 1000, cores = 2)
summary(boot_estimates)

SEMinR seeks to combine ease-of-use, flexible model construction, and high-performance. Below, we will cover the details and options of each of the three parts of model construction and estimation demonstrated above.

Setup

You must install the SEMinR library once on your local machine:

install.packages("seminr")

And then load it in every session you want to use it:

library(seminr)

Data

You must load your data into a dataframe from any source you wish (CSV, etc.). Column names must be names of your measurement items.

Important: Avoid using asterixes ’*’ in your column names (these are reserved for interaction terms).

For demonstration purposes, we will start with a dataset bundled with the seminr package - the mobi data frame (also found in the semPLS R package). This dataset comes from a measurement instrument for the European Customer Satisfaction Index (ECSI) adapted to the mobile phone market (Tenenhaus et al. 2005).

You can see a description and sample of what is in mobi:

dim(mobi)
#> [1] 250  24
head(mobi)
#>   CUEX1 CUEX2 CUEX3 CUSA1 CUSA2 CUSA3 CUSCO CUSL1 CUSL2 CUSL3 IMAG1 IMAG2
#> 1     7     7     6     6     4     7     7     6     5     6     7     5
#> 2    10    10     9    10    10     8    10    10     2    10    10     9
#> 3     7     7     7     8     7     7     6     6     2     7     8     7
#> 4     7    10     5    10    10    10     5    10     4    10    10    10
#> 5     8     7    10    10     8     8     5    10     3     8    10    10
#> 6    10     9     7     8     7     7     8    10     3    10     8     9
#>   IMAG3 IMAG4 IMAG5 PERQ1 PERQ2 PERQ3 PERQ4 PERQ5 PERQ6 PERQ7 PERV1 PERV2
#> 1     5     5     4     7     6     4     7     6     5     5     2     3
#> 2    10    10     9    10     9    10    10     9    10    10    10    10
#> 3     6     4     7     7     8     5     7     8     7     7     7     7
#> 4     5     5    10     8    10    10     8     4     5     8     5     5
#> 5     5     8     9    10     9     8    10     9     9     8     6     6
#> 6    10     8     9     9    10     9    10     8     9     9    10    10

Measurement model description

SEMinR uses the following functions to describe measurement models:

These functions should be natural to SEM practitioners and encourages them to explicitly specify their core nature of their measurement models: composite or common-factor (See Sarstedt et al., 2016, and Henseler et al., 2013, for clear definitions).

Let’s take a closer look at the individual functions.

Create measurement model matrix with constructs()

constructs() compiles the measurement model source-target matrix from the user specified construct descriptions described in the parameters. You must supply it with any number of individual composite, reflective, interaction_term, or higher_composite constructs:

mobi_mm <- constructs(
  composite("Image",         multi_items("IMAG", 1:5), weights = mode_B),
  composite("Expectation",   multi_items("CUEX", 1:3), weights = regression_weights),
  composite("Quality",       multi_items("PERQ", 1:7), weights = mode_A),
  composite("Value",         multi_items("PERV", 1:2), weights = correlation_weights),
  reflective("Satisfaction", multi_items("CUSA", 1:3)),
  reflective("Complaints",   single_item("CUSCO")),
  higher_composite("HOC", c("Value", "Satisfaction"), orthogonal, mode_A),
  interaction_term(iv = "Image", moderator = "Expectation", method =  orthogonal, weights = mode_A),
  reflective("Loyalty",      multi_items("CUSL", 1:3))
)

We are storing the measurement model in the mobi_mm object for later use.

Note that neither a dataset nor a structural model is specified in the measurement model stage, so we can reuse the measurement model object mobi_mm across different datasets and structural models.

Describe individual constructs with composite() or reflective()

composite() or reflective() describe a construct and its items.

For example, we can use composite() to describe mode A (correlation weights) for the “Expectation” construct with manifest variables CUEX1, CUEX2, and CUEX3:

composite("Expectation", multi_items("CUEX", 1:3), weights = mode_A)
# is equivalent to:
composite("Expectation", multi_items("CUEX", 1:3), weights = correlation_weights)

We can describe composite “Image” using mode B (regression weights) with manifest variables IMAG1, IMAG2, IMAG3, IMAG4 and IMAG5:

composite("Image", multi_items("IMAG", 1:5), weights = mode_B)
# is equivalent to:
composite("Image", multi_items("IMAG", 1:5), weights = regression_weights)

Alternatively, we can use reflective() to describe the reflective, common-factor measurement of the “Satisfaction” construct with manifest variables CUSA1, CUSA2, and CUSA3:

reflective("Satisfaction", multi_items("CUSA", 1:3))

Specifying construct measurement items

SEMinR strives to make specification of measurement items shorter and cleaner using multi_items() or single_item()

  • multi_items() creates a vector of multiple measurement items with similar names
  • single_item() describe a single measurement item

We can describe the manifest variables: IMAG1, IMAG2, IMAG3, IMAG4 and IMAG5:

multi_items("IMAG", 1:5)
# which is equivalent to the R vector:
c("IMAG1", "IMAG2", "IMAG3", "IMAG4", "IMAG5")

multi_items() is used in conjunction with composite() or reflective() to describe a composite and common-factor construct respectively.

We can describe a single manifest variable CUSCO:

single_item("CUSCO")
# which is equivalent to the R character string:
"CUSCO"

Note that a single-item constructs can be defined as either composite mode A or reflective common-factor, but single-item constructs are essentially composites whose construct scores are determined.

Interaction terms

Creating interaction terms by hand can be a time-consuming and error-prone. SEMinR provides high-level functions for simply creating interactions between constructs.

Apply different estimation methods for interactions with orthogonal, product_indicator, and two_stage:

Interaction terms are described in the measurement model function constructs() using the following methods:

  • orthogonal describes a single interaction composite generated by the orthogonalization method of Henseler and Chin (2010).
  • product_indicator describes a single interaction composite as generated by the scaled product-indicator method as described by Henseler and Chin (2010).
  • two_stage describes a single interaction composite as generated by the two stage method as described by Henseler and Chin (2010).

For these methods the standard deviation of the interaction term is adjusted as noted above.

For example, we can describe the following interactions between antecedent and moderator: * “Image” + “Expectation”

interaction_term(iv = "Image", moderator = "Expectation", method =  orthogonal, weights = mode_A)
interaction_term(iv = "Image", moderator = "Expectation", method =  product_indicator, weights = mode_A)
interaction_term(iv = "Image", moderator = "Expectation", method =  two_stage, weights = mode_A)

Note that these functions themselves return functions that are not resolved until processed in the estimate_pls() function for model estimation. Note that recent studies show PLS models must adjust the standard deviation of the interaction term because: “In general, the product of two standardized variables does not equal the standardized product of these variables” (Henseler and Chin 2010). SEMinR automatically adjusts for this providing highly accurate model estimations. Important Note: SEMinR syntax uses an asterix “" as a naming convention for the interaction construct. Thus, the "Image" + "Expectation" interaction is called "ImageExpectation” in the structural model below. Please refrain from using an asterix "*" in the naming of non-interaction constructs.

Structural model description

SEMinR makes for human-readable and explicit structural model specification using these functions:

Create structural model with relationships()

relationships() compiles the structural model source-target matrix from the user specified structural path descriptions described in the parameters.

For example, we can describe a structural model for the mobi data:

mobi_sm <- relationships(
  paths(from = "Image",        to = c("Expectation", "Satisfaction", "Loyalty")),
  paths(from = "Expectation",  to = c("Quality", "Value", "Satisfaction")),
  paths(from = "Quality",      to = c("Value", "Satisfaction")),
  paths(from = "Value",        to = c("Satisfaction")),
  paths(from = "Satisfaction", to = c("Complaints", "Loyalty")),
  paths(from = "Complaints",   to = "Loyalty")
)

Note that neither a dataset nor a measurement model is specified in the structural model stage, so we can reuse the structural model object mobi_sm across different datasets and measurement models.

Describe structural paths with paths()

paths() describe single or multiple structural paths between sets of constructs.

For example, we can define paths from a single antecedent construct to a single outcome construct:

# "Image" -> "Expectation"
paths(from = "Image", to = "Expectation")

Or paths from a single antecedent to multiple outcomes:

# "Image" -> "Expectation"
# "Image" -> "Satisfaction"
paths(from = "Image", to = c("Expectation", "Satisfaction"))

Or paths from multiple antecedents to a single outcome:

# "Image" -> "Satisfaction"
# "Expectation" -> "Satisfaction"
paths(from = c("Image", "Expectation"), to = "Satisfaction")

Or paths from multiple antecedents to a common set of outcomes:

# "Expectation" -> "Value"
# "Expectation" -> "Satisfaction"
# "Quality" -> "Value"
# "Quality" -> "Satisfaction"
paths(from = c("Expectation", "Quality"), to = c("Value", "Satisfaction"))

Even the most complicated structural models become quick and easy to specify or modify.

PLS SEM Model Estimation

SEMinR can estimate a full SEM model described by the measurement and structural models above:

This function takes the following parameters:

For example, we can estimate a simple PLS SEM model adapted from the structural and measurement model with interactions described thus far:

# define measurement model
mobi_mm <- constructs(
  composite("Image",        multi_items("IMAG", 1:5)),
  composite("Expectation",  multi_items("CUEX", 1:3)),
  composite("Value",        multi_items("PERV", 1:2)),
  composite("Satisfaction", multi_items("CUSA", 1:3)),
  interaction_term(iv = "Image", moderator = "Expectation", method =  orthogonal, weights = mode_A),
  interaction_term(iv = "Image", moderator = "Value", method =  orthogonal, weights = mode_A)
)

# define structural model
# note: interactions cobnstruct should be named by its main constructs joined by a '*'
mobi_sm <- relationships(
  paths(to = "Satisfaction",
        from = c("Image", "Expectation", "Value",
                 "Image*Expectation", "Image*Value"))
)

mobi_pls <- estimate_pls(data = mobi,
                         measurement_model = mobi_mm,
                         structural_model = mobi_sm,
                         inner_weights = path_weighting)
#> Generating the seminr model
#> All 250 observations are valid.

Consistent PLS (PLSc) for common-factors

Dijkstra and Henseler (2015) offer an adjustment to generate consistent weight and path estimates of common factors estimated using PLSPM. SEMinR automatically adjusts for consistent estimates of coefficients for common-factors defined using reflective().

Note: SEMinR does adjust for PLSc on models with interactions involving common-factors. Models with interactions can be estimated as PLS consistent, but are subject to some bias as per Becker et al. (2018). It is not uncommon for bootstrapping PLSc models to result in errors due the calculation of the adjustment.

Bootstrapping the model for significance

SEMinR can conduct high performance bootstrapping.

This function takes the following parameters:

For example, we can bootstrap the model described above:

# use 1000 bootstraps and utilize 2 parallel cores
boot_mobi_pls <- bootstrap_model(seminr_model = mobi_pls,
                                 nboot = 1000,
                                 cores = 2)
#> Bootstrapping model using seminr...
#> SEMinR Model successfully bootstrapped
  1. bootstrap_model() returns an object of class boot_seminr_model which contains the following accessible objects:
    • boot_seminr_model$boot_paths an array of the nboot estimated bootstrap sample path coefficient matrices
    • boot_seminr_model$boot_loadings an array of the nboot estimated bootstrap sample item loadings matrices
    • boot_seminr_model$boot_weights an array of the nboot estimated bootstrap sample item weights matrices
    • boot_seminr_model$boot_HTMT an array of the nboot estimated bootstrap sample model HTMT matrices
    • boot_seminr_model$paths_descriptives a matrix of the bootstrap path coefficients and standard deviations
    • boot_seminr_model$loadings_descriptives a matrix of the bootstrap item loadings and standard deviations
    • boot_seminr_model$weights_descriptives a matrix of the bootstrap item weights and standard deviations
    • boot_seminr_model$HTMT_descriptives a matrix of the bootstrap model HTMT and standard deviations

Notably, bootstrapping can also be meaningfully applied to models containing interaction terms and readjusts the interaction term (Henseler and Chin 2010) for every sub-sample. This leads to slightly increased processing times, but provides accurate estimations.

Reporting the PLS SEM Model

Reporting the estimated seminr_model

There are multiple ways of reporting the estimated model. The estimate_pls() function returns an object of class seminr_model. This can be passed directly to the base R function summary(). This can be used in two primary ways:

  1. summary(seminr_model) to report \(R^{2}\), adjusted \(R^{2}\), path coefficients for the structural model, and the construct reliability metrics \(rho_{C}\) (Dillon and Goldstein 1987), AVE (Fornell and Larcker 1981), and \(rho_{A}\) (Dijkstra and Henseler 2015)
summary(mobi_pls)
#> 
#>  Total Iterations: 8
#> Path Coefficients:
#>                   Satisfaction
#> R^2                      0.627
#> AdjR^2                   0.619
#> Image                    0.455
#> Expectation              0.165
#> Value                    0.309
#> Image*Expectation       -0.143
#> Image*Value             -0.058
#> 
#> Reliability:
#>                     rhoC   AVE rhoA
#> Image             0.8183 0.478    1
#> Expectation       0.7332 0.481    1
#> Value             0.9179 0.848    1
#> Image*Expectation 0.8006 0.255    1
#> Image*Value       0.0439 0.226    1
#> Satisfaction      0.8715 0.693    1
  1. model_summary <- summary(seminr_model) returns an object of class summary.seminr_model which contains the following accessible objects:
    • model_summary$iterations reports the number of iterations to converge on a stable model
    • model_summary$paths reports the matrix of path coefficients, \(R^{2}\), and adjusted \(R^{2}\)
    • model_summary$reliability reports composite reliability (\(rho_{C}\)), average variance extracted (AVE), and \(rho_{A}\)
    • model_summary$cross_loadings reports all possible loadings between contructs and items
    • model_summary$loadings reports the estimated loadings of the measurement model
    • model_summary$weights reports the estimated weights of the measurement model
    • model_summary$composite_scores reports the construct scores of composites
    • model_summary$vif_items reports the Variance Inflation Factor (VIF) for the measurement model
    • model_summary$vif_antecedents report the Variance Inflation Factor (VIF) for the structural model
    • model_summary$fSquare reports the effect sizes (\(f^{2}\)) for the structural model
    • model_summary$htmt reports the HTMT for the structural model
    • model_summary$descriptives reports the descriptive statistics and correlations for both items and constructs

Please note that common-factor scores are indeterminable and therefore construct scores for common factors are not reported (Hair et al., 2011).

Reporting the bootstrapped boot_seminr_model

As with the estimated model, there are multiple ways of reporting the bootstrapped model. The bootstrap_model() function returns an object of class boot_seminr_model. This can be passed directly to the base R function summary(). This can be used in two primary ways:

  1. summary(boot_seminr_model) to report t-values and p-values for the structural paths
summary(boot_mobi_pls)
#> 
#>  Bootstrap resamples: 1000
#> 
#> Bootstrapped Structural Paths:
#>                                     Original Est. Bootstrap Mean
#> Image  ->  Satisfaction                     0.455          0.466
#> Expectation  ->  Satisfaction               0.165          0.163
#> Value  ->  Satisfaction                     0.309          0.295
#> Image*Expectation  ->  Satisfaction        -0.143         -0.133
#> Image*Value  ->  Satisfaction              -0.058         -0.005
#>                                     Bootstrap SD T Stat. 2.5% CI 97.5% CI
#> Image  ->  Satisfaction                    0.054   8.411   0.355    0.570
#> Expectation  ->  Satisfaction              0.059   2.791   0.049    0.273
#> Value  ->  Satisfaction                    0.062   5.018   0.178    0.412
#> Image*Expectation  ->  Satisfaction        0.123  -1.162  -0.261    0.220
#> Image*Value  ->  Satisfaction              0.090  -0.642  -0.148    0.144
#> 
#> Bootstrapped Weights:
#>                                    Original Est. Bootstrap Mean
#> IMAG1  ->  Image                           0.332          0.331
#> IMAG2  ->  Image                           0.254          0.252
#> IMAG3  ->  Image                           0.199          0.197
#> IMAG4  ->  Image                           0.331          0.331
#> IMAG5  ->  Image                           0.311          0.310
#> CUEX1  ->  Expectation                     0.506          0.503
#> CUEX2  ->  Expectation                     0.499          0.496
#> CUEX3  ->  Expectation                     0.436          0.435
#> PERV1  ->  Value                           0.477          0.477
#> PERV2  ->  Value                           0.606          0.606
#> CUSA1  ->  Satisfaction                    0.390          0.385
#> CUSA2  ->  Satisfaction                    0.373          0.380
#> CUSA3  ->  Satisfaction                    0.437          0.436
#> IMAG1*CUEX1  ->  Image*Expectation         0.233          0.157
#> IMAG1*CUEX2  ->  Image*Expectation         0.144          0.095
#> IMAG1*CUEX3  ->  Image*Expectation         0.430          0.283
#> IMAG2*CUEX1  ->  Image*Expectation         0.341          0.212
#> IMAG2*CUEX2  ->  Image*Expectation        -0.038         -0.014
#> IMAG2*CUEX3  ->  Image*Expectation         0.107          0.053
#> IMAG3*CUEX1  ->  Image*Expectation         0.125          0.091
#> IMAG3*CUEX2  ->  Image*Expectation         0.085          0.066
#> IMAG3*CUEX3  ->  Image*Expectation         0.050          0.040
#> IMAG4*CUEX1  ->  Image*Expectation         0.101          0.081
#> IMAG4*CUEX2  ->  Image*Expectation         0.020          0.023
#> IMAG4*CUEX3  ->  Image*Expectation         0.091          0.066
#> IMAG5*CUEX1  ->  Image*Expectation        -0.227         -0.124
#> IMAG5*CUEX2  ->  Image*Expectation        -0.246         -0.147
#> IMAG5*CUEX3  ->  Image*Expectation         0.082          0.061
#> IMAG1*PERV1  ->  Image*Value              -0.405          0.077
#> IMAG1*PERV2  ->  Image*Value               0.016          0.159
#> IMAG2*PERV1  ->  Image*Value              -0.010          0.034
#> IMAG2*PERV2  ->  Image*Value               0.242          0.067
#> IMAG3*PERV1  ->  Image*Value               0.016          0.101
#> IMAG3*PERV2  ->  Image*Value              -0.097          0.096
#> IMAG4*PERV1  ->  Image*Value              -0.191          0.073
#> IMAG4*PERV2  ->  Image*Value              -0.179          0.096
#> IMAG5*PERV1  ->  Image*Value               0.428          0.081
#> IMAG5*PERV2  ->  Image*Value               0.507          0.081
#>                                    Bootstrap SD T Stat. 2.5% CI 97.5% CI
#> IMAG1  ->  Image                          0.024  13.864   0.288    0.382
#> IMAG2  ->  Image                          0.031   8.060   0.191    0.316
#> IMAG3  ->  Image                          0.034   5.899   0.129    0.260
#> IMAG4  ->  Image                          0.027  12.075   0.279    0.387
#> IMAG5  ->  Image                          0.028  11.070   0.260    0.367
#> CUEX1  ->  Expectation                    0.060   8.431   0.381    0.621
#> CUEX2  ->  Expectation                    0.075   6.621   0.353    0.645
#> CUEX3  ->  Expectation                    0.078   5.577   0.289    0.583
#> PERV1  ->  Value                          0.022  21.868   0.427    0.515
#> PERV2  ->  Value                          0.028  21.562   0.556    0.671
#> CUSA1  ->  Satisfaction                   0.018  21.953   0.349    0.419
#> CUSA2  ->  Satisfaction                   0.017  21.636   0.347    0.414
#> CUSA3  ->  Satisfaction                   0.021  20.648   0.400    0.480
#> IMAG1*CUEX1  ->  Image*Expectation        0.126   1.853  -0.182    0.339
#> IMAG1*CUEX2  ->  Image*Expectation        0.108   1.332  -0.140    0.275
#> IMAG1*CUEX3  ->  Image*Expectation        0.245   1.755  -0.449    0.579
#> IMAG2*CUEX1  ->  Image*Expectation        0.218   1.562  -0.384    0.543
#> IMAG2*CUEX2  ->  Image*Expectation        0.142  -0.268  -0.303    0.306
#> IMAG2*CUEX3  ->  Image*Expectation        0.149   0.720  -0.269    0.323
#> IMAG3*CUEX1  ->  Image*Expectation        0.134   0.935  -0.181    0.334
#> IMAG3*CUEX2  ->  Image*Expectation        0.154   0.554  -0.242    0.346
#> IMAG3*CUEX3  ->  Image*Expectation        0.132   0.381  -0.233    0.273
#> IMAG4*CUEX1  ->  Image*Expectation        0.102   0.995  -0.126    0.263
#> IMAG4*CUEX2  ->  Image*Expectation        0.119   0.166  -0.226    0.241
#> IMAG4*CUEX3  ->  Image*Expectation        0.129   0.702  -0.221    0.300
#> IMAG5*CUEX1  ->  Image*Expectation        0.237  -0.959  -0.504    0.527
#> IMAG5*CUEX2  ->  Image*Expectation        0.200  -1.228  -0.449    0.398
#> IMAG5*CUEX3  ->  Image*Expectation        0.125   0.654  -0.213    0.281
#> IMAG1*PERV1  ->  Image*Value              0.276  -1.471  -0.476    0.577
#> IMAG1*PERV2  ->  Image*Value              0.193   0.082  -0.212    0.554
#> IMAG2*PERV1  ->  Image*Value              0.195  -0.049  -0.386    0.457
#> IMAG2*PERV2  ->  Image*Value              0.212   1.140  -0.334    0.465
#> IMAG3*PERV1  ->  Image*Value              0.121   0.135  -0.161    0.309
#> IMAG3*PERV2  ->  Image*Value              0.165  -0.588  -0.268    0.365
#> IMAG4*PERV1  ->  Image*Value              0.167  -1.148  -0.276    0.325
#> IMAG4*PERV2  ->  Image*Value              0.179  -1.005  -0.281    0.388
#> IMAG5*PERV1  ->  Image*Value              0.248   1.727  -0.376    0.473
#> IMAG5*PERV2  ->  Image*Value              0.292   1.740  -0.474    0.553
#> 
#> Bootstrapped Loadings:
#>                                    Original Est. Bootstrap Mean
#> IMAG1  ->  Image                           0.763          0.761
#> IMAG2  ->  Image                           0.599          0.597
#> IMAG3  ->  Image                           0.561          0.558
#> IMAG4  ->  Image                           0.769          0.771
#> IMAG5  ->  Image                           0.736          0.736
#> CUEX1  ->  Expectation                     0.761          0.756
#> CUEX2  ->  Expectation                     0.710          0.703
#> CUEX3  ->  Expectation                     0.598          0.594
#> PERV1  ->  Value                           0.901          0.901
#> PERV2  ->  Value                           0.940          0.940
#> CUSA1  ->  Satisfaction                    0.806          0.802
#> CUSA2  ->  Satisfaction                    0.843          0.845
#> CUSA3  ->  Satisfaction                    0.849          0.849
#> IMAG1*CUEX1  ->  Image*Expectation         0.740          0.512
#> IMAG1*CUEX2  ->  Image*Expectation         0.562          0.388
#> IMAG1*CUEX3  ->  Image*Expectation         0.852          0.584
#> IMAG2*CUEX1  ->  Image*Expectation         0.693          0.492
#> IMAG2*CUEX2  ->  Image*Expectation         0.363          0.250
#> IMAG2*CUEX3  ->  Image*Expectation         0.558          0.351
#> IMAG3*CUEX1  ->  Image*Expectation         0.299          0.255
#> IMAG3*CUEX2  ->  Image*Expectation         0.185          0.158
#> IMAG3*CUEX3  ->  Image*Expectation         0.393          0.284
#> IMAG4*CUEX1  ->  Image*Expectation         0.553          0.408
#> IMAG4*CUEX2  ->  Image*Expectation         0.324          0.250
#> IMAG4*CUEX3  ->  Image*Expectation         0.579          0.401
#> IMAG5*CUEX1  ->  Image*Expectation         0.150          0.130
#> IMAG5*CUEX2  ->  Image*Expectation        -0.059         -0.033
#> IMAG5*CUEX3  ->  Image*Expectation         0.509          0.329
#> IMAG1*PERV1  ->  Image*Value              -0.333          0.469
#> IMAG1*PERV2  ->  Image*Value              -0.161          0.535
#> IMAG2*PERV1  ->  Image*Value               0.388          0.230
#> IMAG2*PERV2  ->  Image*Value               0.464          0.240
#> IMAG3*PERV1  ->  Image*Value              -0.199          0.482
#> IMAG3*PERV2  ->  Image*Value              -0.339          0.448
#> IMAG4*PERV1  ->  Image*Value              -0.423          0.459
#> IMAG4*PERV2  ->  Image*Value              -0.394          0.497
#> IMAG5*PERV1  ->  Image*Value               0.778          0.358
#> IMAG5*PERV2  ->  Image*Value               0.816          0.367
#>                                    Bootstrap SD T Stat. 2.5% CI 97.5% CI
#> IMAG1  ->  Image                          0.036  21.387   0.680    0.818
#> IMAG2  ->  Image                          0.059  10.129   0.467    0.702
#> IMAG3  ->  Image                          0.065   8.690   0.417    0.666
#> IMAG4  ->  Image                          0.043  17.988   0.673    0.838
#> IMAG5  ->  Image                          0.035  21.207   0.661    0.800
#> CUEX1  ->  Expectation                    0.055  13.958   0.616    0.839
#> CUEX2  ->  Expectation                    0.081   8.727   0.526    0.833
#> CUEX3  ->  Expectation                    0.083   7.237   0.411    0.726
#> PERV1  ->  Value                          0.021  43.935   0.853    0.934
#> PERV2  ->  Value                          0.007 127.764   0.925    0.953
#> CUSA1  ->  Satisfaction                   0.029  27.997   0.739    0.851
#> CUSA2  ->  Satisfaction                   0.023  36.778   0.794    0.883
#> CUSA3  ->  Satisfaction                   0.019  45.345   0.806    0.880
#> IMAG1*CUEX1  ->  Image*Expectation        0.296   2.502  -0.267    0.917
#> IMAG1*CUEX2  ->  Image*Expectation        0.299   1.880  -0.257    0.857
#> IMAG1*CUEX3  ->  Image*Expectation        0.359   2.371  -0.507    0.944
#> IMAG2*CUEX1  ->  Image*Expectation        0.324   2.141  -0.417    0.880
#> IMAG2*CUEX2  ->  Image*Expectation        0.291   1.250  -0.358    0.739
#> IMAG2*CUEX3  ->  Image*Expectation        0.320   1.743  -0.422    0.808
#> IMAG3*CUEX1  ->  Image*Expectation        0.283   1.055  -0.360    0.711
#> IMAG3*CUEX2  ->  Image*Expectation        0.310   0.597  -0.460    0.674
#> IMAG3*CUEX3  ->  Image*Expectation        0.252   1.559  -0.281    0.672
#> IMAG4*CUEX1  ->  Image*Expectation        0.270   2.044  -0.159    0.829
#> IMAG4*CUEX2  ->  Image*Expectation        0.304   1.066  -0.379    0.749
#> IMAG4*CUEX3  ->  Image*Expectation        0.282   2.055  -0.275    0.807
#> IMAG5*CUEX1  ->  Image*Expectation        0.299   0.500  -0.462    0.712
#> IMAG5*CUEX2  ->  Image*Expectation        0.326  -0.180  -0.574    0.697
#> IMAG5*CUEX3  ->  Image*Expectation        0.253   2.009  -0.298    0.705
#> IMAG1*PERV1  ->  Image*Value              0.444  -0.751  -0.564    1.017
#> IMAG1*PERV2  ->  Image*Value              0.407  -0.396  -0.445    1.017
#> IMAG2*PERV1  ->  Image*Value              0.377   1.029  -0.490    0.854
#> IMAG2*PERV2  ->  Image*Value              0.412   1.126  -0.532    0.884
#> IMAG3*PERV1  ->  Image*Value              0.375  -0.531  -0.401    0.944
#> IMAG3*PERV2  ->  Image*Value              0.423  -0.803  -0.534    0.974
#> IMAG4*PERV1  ->  Image*Value              0.450  -0.941  -0.576    0.995
#> IMAG4*PERV2  ->  Image*Value              0.471  -0.835  -0.603    1.024
#> IMAG5*PERV1  ->  Image*Value              0.485   1.604  -0.588    1.003
#> IMAG5*PERV2  ->  Image*Value              0.519   1.571  -0.631    1.018
#> 
#> Bootstrapped HTMT:
#>                                     Original Est. Bootstrap Mean
#> Image  ->  Expectation                      0.888          0.903
#> Image  ->  Value                            0.652          0.656
#> Image  ->  Image*Expectation                0.000          0.000
#> Image  ->  Image*Value                      0.000          0.000
#> Image  ->  Satisfaction                     0.910          0.913
#> Expectation  ->  Value                      0.589          0.594
#> Expectation  ->  Image*Expectation          0.000          0.000
#> Expectation  ->  Image*Value                0.177          0.290
#> Expectation  ->  Satisfaction               0.865          0.878
#> Value  ->  Image*Expectation                0.100          0.150
#> Value  ->  Image*Value                      0.000          0.000
#> Value  ->  Satisfaction                     0.741          0.742
#> Image*Expectation  ->  Image*Value          0.647          0.678
#> Image*Expectation  ->  Satisfaction         0.140          0.181
#> Image*Value  ->  Satisfaction               0.102          0.154
#>                                     Bootstrap SD 2.5% CI 97.5% CI
#> Image  ->  Expectation                     0.105   0.701    1.131
#> Image  ->  Value                           0.069   0.507    0.779
#> Image  ->  Image*Expectation               0.000   0.000    0.000
#> Image  ->  Image*Value                     0.000   0.000    0.000
#> Image  ->  Satisfaction                    0.036   0.842    0.979
#> Expectation  ->  Value                     0.120   0.369    0.831
#> Expectation  ->  Image*Expectation         0.000   0.000    0.000
#> Expectation  ->  Image*Value               0.075   0.173    0.456
#> Expectation  ->  Satisfaction              0.099   0.688    1.083
#> Value  ->  Image*Expectation               0.035   0.092    0.226
#> Value  ->  Image*Value                     0.000   0.000    0.000
#> Value  ->  Satisfaction                    0.073   0.585    0.872
#> Image*Expectation  ->  Image*Value         0.089   0.521    0.844
#> Image*Expectation  ->  Satisfaction        0.041   0.112    0.270
#> Image*Value  ->  Satisfaction              0.040   0.093    0.243
  1. boot_model_summary <- summary(boot_seminr_model) returns an object of class summary.boot_seminr_model which contains the following accessible objects:
    • boot_model_summary$nboot reports the number of bootstraps performed
    • model_summary$bootstrapped_paths reports a matrix of direct paths and their standard deviation, t_values, and confidence intervals.
    • model_summary$bootstrapped_weights reports a matrix of measurement model weights and their standard deviation, t_values, and confidence intervals.
    • model_summary$bootstrapped_loadings reports a matrix of measurement model loadings and their standard deviation, t_values, and confidence intervals.
    • model_summary$bootstrapped_HTMT reports a matrix of HTMT values and their standard deviation, t_values, and confidence intervals.

Reporting confidence intervals for direct and mediated bootstrapped structural paths with confidence_interval()

The summary(boot_seminr_model) function will return t_values and confidence intervals for direct structural paths. However, the confidence_interval() function can be used to evaluate the confidence intervals for specific paths - direct and mediated (Zhao et al., 2010) - in a boot_seminr_model object returned by the bootstrap_model() function.

This function takes the following parameters:

  • boot_seminr_model: a bootstrapped SEMinR model returned by bootstrap_model()
  • from: the antecedent construct for the structural path
  • to: the outcome construct for the structural path
  • through: the mediator construct, if the path is mediated (default is NULL)
  • alpha the required level of alpha (default is 0.05)

and returns a specific confidence interval using the percentile method as per Henseler et al. (2014).

mobi_mm <- constructs(
composite("Image",        multi_items("IMAG", 1:5)),
composite("Expectation",  multi_items("CUEX", 1:3)),
composite("Quality",      multi_items("PERQ", 1:7)),
composite("Value",        multi_items("PERV", 1:2)),
composite("Satisfaction", multi_items("CUSA", 1:3)),
composite("Complaints",   single_item("CUSCO")),
composite("Loyalty",      multi_items("CUSL", 1:3))
)
# Creating structural model
mobi_sm <- relationships(
 paths(from = "Image",        to = c("Expectation", "Satisfaction", "Loyalty")),
 paths(from = "Expectation",  to = c("Quality", "Value", "Satisfaction")),
 paths(from = "Quality",      to = c("Value", "Satisfaction")),
 paths(from = "Value",        to = c("Satisfaction")),
 paths(from = "Satisfaction", to = c("Complaints", "Loyalty")),
 paths(from = "Complaints",   to = "Loyalty")
)
# Estimating the model
mobi_pls <- estimate_pls(data = mobi,
                        measurement_model = mobi_mm,
                        structural_model = mobi_sm)
#> Generating the seminr model
#> All 250 observations are valid.
# Load data, assemble model, and bootstrap
boot_seminr_model <- bootstrap_model(seminr_model = mobi_pls,
                                    nboot = 50, cores = 2, seed = NULL)
#> Bootstrapping model using seminr...
#> SEMinR Model successfully bootstrapped

# Calculate the 5% confidence interval for mediated path Image -> Expectation -> Satisfaction
confidence_interval(boot_seminr_model = boot_seminr_model,
                   from = "Image",
                   through = "Expectation",
                   to = "Satisfaction",
                   alpha = 0.05)
#>        2.5%       97.5% 
#> -0.02966531  0.08262033

# Calculate the 10% confidence interval for direct path Image -> Satisfaction
confidence_interval(boot_seminr_model = boot_seminr_model,
                   from = "Image",
                   to = "Satisfaction",
                   alpha = 0.10)
#>        5%       95% 
#> 0.1216592 0.2719053

Reporting data descriptive statistics and construct descriptive statistics with summary(seminr_model)

The summary(seminr_model) function will return four matrices: model_summary <- summary(seminr_model) returns an object of class summary.seminr_model which contains the following four descriptive statistics matrices: + model_summary$descriptives$statistics$items reports the descriptive statistics for items + model_summary$descriptives$correlations$items reports the correlation matrix for items + model_summary$descriptives$statistics$constructs reports the descriptive statistics for constructs + model_summary$descriptives$correlations$constructs reports the correlation matrix for constructs

model_summary <- summary(mobi_pls)
model_summary$descriptives$statistics$items
#>       No. Missing Mean Median Min Max Std.Dev. Kurtosis Skewness
#> CUEX1   1       0 7.58      8   1  10     1.62     3.86   -0.667
#> CUEX2   2       0 7.53      8   1  10     1.79     4.48   -0.804
#> CUEX3   3       0 7.42      8   1  10     2.10     3.64   -0.854
#> CUSA1   4       0 7.99      8   4  10     1.23     3.18   -0.222
#> CUSA2   5       0 7.13      7   1  10     1.77     3.59   -0.550
#> CUSA3   6       0 7.32      7   1  10     1.75     3.99   -0.671
#> CUSCO   7       0 7.07      7   1  10     2.27     3.26   -0.714
#> CUSL1   8       0 7.45      8   1  10     2.66     3.10   -1.001
#> CUSL2   9       0 4.99      4   1  10     2.84     2.11    0.548
#> CUSL3  10       0 7.67      8   1  10     2.22     3.89   -1.066
#> IMAG1  11       0 7.64      8   1  10     1.70     4.73   -0.907
#> IMAG2  12       0 7.78      8   1  10     1.69     3.99   -0.798
#> IMAG3  13       0 6.74      7   1  10     2.13     3.69   -0.798
#> IMAG4  14       0 7.59      8   1  10     1.84     4.36   -0.929
#> IMAG5  15       0 7.93      8   1  10     1.56     5.73   -1.076
#> PERQ1  16       0 7.94      8   2  10     1.42     4.21   -0.725
#> PERQ2  17       0 7.19      7   1  10     1.89     3.76   -0.824
#> PERQ3  18       0 7.70      8   1  10     1.82     3.86   -0.912
#> PERQ4  19       0 7.92      8   1  10     1.65     4.83   -1.077
#> PERQ5  20       0 7.87      8   3  10     1.45     3.59   -0.681
#> PERQ6  21       0 7.78      8   1  10     1.63     4.83   -0.980
#> PERQ7  22       0 7.59      8   1  10     1.84     4.09   -0.965
#> PERV1  23       0 6.16      6   1  10     2.18     2.81   -0.400
#> PERV2  24       0 6.92      7   1  10     1.84     4.00   -0.648
model_summary$descriptives$correlations$items
#>        CUEX1 CUEX2  CUEX3  CUSA1  CUSA2 CUSA3 CUSCO  CUSL1   CUSL2 CUSL3
#> CUEX1 1.0000 0.326 0.2138 0.3247 0.2994 0.306 0.183 0.2333  0.0259 0.246
#> CUEX2 0.3258 1.000 0.1072 0.3697 0.2703 0.279 0.225 0.2468  0.1157 0.295
#> CUEX3 0.2138 0.107 1.0000 0.3317 0.2547 0.221 0.126 0.1258  0.0553 0.200
#> CUSA1 0.3247 0.370 0.3317 1.0000 0.5392 0.490 0.334 0.3433  0.0435 0.521
#> CUSA2 0.2994 0.270 0.2547 0.5392 1.0000 0.592 0.416 0.3547  0.0869 0.494
#> CUSA3 0.3064 0.279 0.2214 0.4900 0.5924 1.000 0.547 0.4317  0.1295 0.630
#> CUSCO 0.1831 0.225 0.1258 0.3338 0.4160 0.547 1.000 0.2373  0.1220 0.448
#> CUSL1 0.2333 0.247 0.1258 0.3433 0.3547 0.432 0.237 1.0000  0.0465 0.542
#> CUSL2 0.0259 0.116 0.0553 0.0435 0.0869 0.130 0.122 0.0465  1.0000 0.101
#> CUSL3 0.2457 0.295 0.1999 0.5209 0.4939 0.630 0.448 0.5417  0.1014 1.000
#> IMAG1 0.2421 0.277 0.2091 0.4518 0.3808 0.528 0.423 0.2361  0.0166 0.373
#> IMAG2 0.2860 0.203 0.3014 0.4058 0.2711 0.367 0.188 0.2183  0.0145 0.309
#> IMAG3 0.2197 0.249 0.1175 0.2187 0.3204 0.287 0.207 0.2543  0.0917 0.276
#> IMAG4 0.2229 0.304 0.2475 0.4397 0.4338 0.491 0.440 0.3687  0.1588 0.414
#> IMAG5 0.2574 0.364 0.1204 0.4427 0.3874 0.451 0.337 0.3994  0.0580 0.463
#> PERQ1 0.3556 0.256 0.4621 0.6042 0.5662 0.536 0.380 0.3574  0.0177 0.474
#> PERQ2 0.3040 0.166 0.1834 0.4416 0.3619 0.420 0.300 0.2534 -0.1282 0.371
#> PERQ3 0.3745 0.268 0.2514 0.4594 0.5514 0.591 0.472 0.3117  0.1398 0.477
#> PERQ4 0.2642 0.312 0.2369 0.5179 0.5079 0.480 0.379 0.2593  0.0161 0.377
#> PERQ5 0.3537 0.285 0.2242 0.4270 0.4400 0.441 0.389 0.3040  0.0678 0.350
#> PERQ6 0.3031 0.327 0.2973 0.4620 0.4790 0.435 0.418 0.2524  0.0411 0.339
#> PERQ7 0.3548 0.234 0.2706 0.4905 0.6072 0.639 0.465 0.3377  0.1257 0.429
#> PERV1 0.2647 0.136 0.2436 0.3287 0.3866 0.487 0.287 0.3483  0.1843 0.379
#> PERV2 0.2771 0.190 0.2611 0.4201 0.5071 0.605 0.360 0.4071  0.0827 0.518
#>        IMAG1  IMAG2  IMAG3 IMAG4 IMAG5  PERQ1  PERQ2 PERQ3  PERQ4  PERQ5
#> CUEX1 0.2421 0.2860 0.2197 0.223 0.257 0.3556  0.304 0.374 0.2642 0.3537
#> CUEX2 0.2766 0.2035 0.2491 0.304 0.364 0.2560  0.166 0.268 0.3122 0.2852
#> CUEX3 0.2091 0.3014 0.1175 0.248 0.120 0.4621  0.183 0.251 0.2369 0.2242
#> CUSA1 0.4518 0.4058 0.2187 0.440 0.443 0.6042  0.442 0.459 0.5179 0.4270
#> CUSA2 0.3808 0.2711 0.3204 0.434 0.387 0.5662  0.362 0.551 0.5079 0.4400
#> CUSA3 0.5279 0.3670 0.2871 0.491 0.451 0.5359  0.420 0.591 0.4797 0.4415
#> CUSCO 0.4229 0.1881 0.2066 0.440 0.337 0.3801  0.300 0.472 0.3790 0.3890
#> CUSL1 0.2361 0.2183 0.2543 0.369 0.399 0.3574  0.253 0.312 0.2593 0.3040
#> CUSL2 0.0166 0.0145 0.0917 0.159 0.058 0.0177 -0.128 0.140 0.0161 0.0678
#> CUSL3 0.3728 0.3087 0.2758 0.414 0.463 0.4742  0.371 0.477 0.3771 0.3505
#> IMAG1 1.0000 0.3895 0.2626 0.445 0.429 0.4752  0.319 0.449 0.4154 0.3747
#> IMAG2 0.3895 1.0000 0.1305 0.298 0.295 0.4486  0.587 0.287 0.3666 0.3521
#> IMAG3 0.2626 0.1305 1.0000 0.414 0.337 0.2934  0.115 0.326 0.2026 0.3342
#> IMAG4 0.4450 0.2977 0.4139 1.000 0.427 0.4943  0.205 0.551 0.3464 0.4754
#> IMAG5 0.4291 0.2954 0.3371 0.427 1.000 0.4572  0.273 0.512 0.3631 0.5391
#> PERQ1 0.4752 0.4486 0.2934 0.494 0.457 1.0000  0.507 0.524 0.5317 0.5194
#> PERQ2 0.3188 0.5871 0.1148 0.205 0.273 0.5074  1.000 0.344 0.4641 0.3786
#> PERQ3 0.4487 0.2868 0.3255 0.551 0.512 0.5238  0.344 1.000 0.5214 0.5724
#> PERQ4 0.4154 0.3666 0.2026 0.346 0.363 0.5317  0.464 0.521 1.0000 0.5460
#> PERQ5 0.3747 0.3521 0.3342 0.475 0.539 0.5194  0.379 0.572 0.5460 1.0000
#> PERQ6 0.5100 0.4479 0.2354 0.379 0.377 0.5752  0.467 0.491 0.6181 0.4931
#> PERQ7 0.4693 0.2331 0.3943 0.525 0.388 0.5597  0.380 0.643 0.4503 0.5095
#> PERV1 0.3452 0.2208 0.2752 0.343 0.187 0.3444  0.210 0.397 0.3344 0.3721
#> PERV2 0.3827 0.2795 0.3422 0.516 0.300 0.5042  0.343 0.469 0.3883 0.4744
#>        PERQ6 PERQ7 PERV1  PERV2
#> CUEX1 0.3031 0.355 0.265 0.2771
#> CUEX2 0.3268 0.234 0.136 0.1899
#> CUEX3 0.2973 0.271 0.244 0.2611
#> CUSA1 0.4620 0.490 0.329 0.4201
#> CUSA2 0.4790 0.607 0.387 0.5071
#> CUSA3 0.4354 0.639 0.487 0.6047
#> CUSCO 0.4180 0.465 0.287 0.3598
#> CUSL1 0.2524 0.338 0.348 0.4071
#> CUSL2 0.0411 0.126 0.184 0.0827
#> CUSL3 0.3392 0.429 0.379 0.5178
#> IMAG1 0.5100 0.469 0.345 0.3827
#> IMAG2 0.4479 0.233 0.221 0.2795
#> IMAG3 0.2354 0.394 0.275 0.3422
#> IMAG4 0.3785 0.525 0.343 0.5164
#> IMAG5 0.3769 0.388 0.187 0.3003
#> PERQ1 0.5752 0.560 0.344 0.5042
#> PERQ2 0.4674 0.380 0.210 0.3435
#> PERQ3 0.4912 0.643 0.397 0.4686
#> PERQ4 0.6181 0.450 0.334 0.3883
#> PERQ5 0.4931 0.510 0.372 0.4744
#> PERQ6 1.0000 0.501 0.347 0.4043
#> PERQ7 0.5014 1.000 0.472 0.5420
#> PERV1 0.3473 0.472 1.000 0.7001
#> PERV2 0.4043 0.542 0.700 1.0000
model_summary$descriptives$statistics$constructs
#>              No. Missing      Mean  Median   Min  Max Std.Dev. Kurtosis
#> Image          1       0 -6.81e-17  0.0522 -3.45 1.95        1     3.27
#> Expectation    2       0 -1.26e-16 -0.0431 -3.29 1.98        1     3.20
#> Quality        3       0  2.59e-17  0.0314 -3.62 1.79        1     3.74
#> Value          4       0 -5.52e-17  0.2128 -3.07 1.85        1     3.59
#> Satisfaction   5       0 -1.29e-16  0.0924 -3.11 1.91        1     3.22
#> Complaints     6       0  1.45e-16 -0.0299 -2.67 1.29        1     3.26
#> Loyalty        7       0 -6.29e-17  0.2336 -3.20 1.33        1     3.84
#>              Skewness
#> Image          -0.404
#> Expectation    -0.170
#> Quality        -0.715
#> Value          -0.577
#> Satisfaction   -0.458
#> Complaints     -0.714
#> Loyalty        -1.010
model_summary$descriptives$correlations$constructs
#>              Image Expectation Quality Value Satisfaction Complaints
#> Image        1.000       0.505   0.749 0.509        0.693      0.475
#> Expectation  0.505       1.000   0.557 0.361        0.508      0.258
#> Quality      0.749       0.557   1.000 0.586        0.795      0.532
#> Value        0.509       0.361   0.586 1.000        0.608      0.355
#> Satisfaction 0.693       0.508   0.795 0.608        1.000      0.528
#> Complaints   0.475       0.258   0.532 0.355        0.528      1.000
#> Loyalty      0.564       0.380   0.538 0.529        0.656      0.416
#>              Loyalty
#> Image          0.564
#> Expectation    0.380
#> Quality        0.538
#> Value          0.529
#> Satisfaction   0.656
#> Complaints     0.416
#> Loyalty        1.000

References