## ----echo=FALSE, out.width='25%'---------------------------------------------- knitr::include_graphics('SEMinR_logo.jpg') ## ---- echo = FALSE, message = FALSE------------------------------------------- knitr::opts_chunk$set(collapse = TRUE, comment = "#>") library(seminr) ## ---- eval=FALSE-------------------------------------------------------------- # # Distinguish and mix composite measurement (used in PLS-PM) # # or reflective (common-factor) measurement (used in CBSEM, CFA, and PLSc) # # - We will first use composites in PLS-PM analysis # # - Later we will convert the omposites into reflectives for CFA/CBSEM (step 3) # measurements <- 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") # ) ## ---- eval=FALSE-------------------------------------------------------------- # # Quickly create multiple paths "from" and "to" sets of constructs # structure <- relationships( # paths(from = c("Image", "Expectation", "Image*Expectation"), to = "Value"), # paths(from = "Value", to = "Satisfaction") # ) ## ---- eval=FALSE-------------------------------------------------------------- # # Estimate using PLS-PM from model parts defined earlier # pls_model <- estimate_pls(data = mobi, # measurement_model = measurements, # structural_model = structure) # summary(pls_model) # # # note: PLS requires seperate bootstrapping for PLS path estimates # # SEMinR uses multi-core parallel processing to speed up bootstrapping # boot_estimates <- bootstrap_model(pls_model, nboot = 1000, cores = 2) # summary(boot_estimates) # # # Alternatively, we could estimate our model using CBSEM, which uses the Lavaan package # # We often wish to conduct a CFA of our measurement model prior to CBSEM # # note: we must convert composites in our measurement model into reflective constructs for CFA/CBSEM # cfa_model <- estimate_cfa(data = mobi, as.reflective(measurements)) # summary(cfa_model) # # cbsem_model <- estimate_cbsem(data = mobi, as.reflective(measurements), structure) # summary(cbsem_model) # # # note: the Lavaan syntax and Lavaan fitted model can be extracted for your own specific needs # cbsem_model$lavaan_syntax # cbsem_model$lavaan_model ## ---- eval=FALSE-------------------------------------------------------------- # install.packages("seminr") ## ---- eval=FALSE-------------------------------------------------------------- # library(seminr) ## ---- eval=FALSE-------------------------------------------------------------- # survey_data <- read.csv("mobi_survey_data.csv") ## ----------------------------------------------------------------------------- dim(mobi) head(mobi) ## ---- eval=FALSE-------------------------------------------------------------- # measurements <- 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)) # ) ## ---- eval=FALSE-------------------------------------------------------------- # composite("Expectation", multi_items("CUEX", 1:3), weights = mode_A) # # is equivalent to: # composite("Expectation", multi_items("CUEX", 1:3), weights = correlation_weights) ## ---- eval=FALSE-------------------------------------------------------------- # composite("Image", multi_items("IMAG", 1:5), weights = mode_B) # # is equivalent to: # composite("Image", multi_items("IMAG", 1:5), weights = regression_weights) ## ---- eval = FALSE------------------------------------------------------------ # reflective("Satisfaction", multi_items("CUSA", 1:3)) ## ---- eval = FALSE------------------------------------------------------------ # # Coerce a composite into reflective form # img_composite <- composite("Image", multi_items("IMAG", 1:5)) # img_reflective <- as.reflective(img_composite) # # # Coerce all constructs of a measurement model into composite form # mobi_composites <- constructs( # composite("Image", multi_items("IMAG", 1:5)), # composite("Expectation", multi_items("CUEX", 1:3)), # reflective("Complaints", single_item("CUSCO")) # ) # mobi_reflective <- as.reflective(mobi_composites) ## ---- eval=FALSE-------------------------------------------------------------- # multi_items("IMAG", 1:5) # # which is equivalent to the R vector: # c("IMAG1", "IMAG2", "IMAG3", "IMAG4", "IMAG5") ## ---- eval=FALSE-------------------------------------------------------------- # multi_items("IMAG", c(1, 3:5)) # # which is equivalent to the R vector: # c("IMAG1", "IMAG3", "IMAG4", "IMAG5") ## ---- eval=FALSE-------------------------------------------------------------- # single_item("CUSCO") # # which is equivalent to the R character string: # "CUSCO" ## ---- eval=FALSE-------------------------------------------------------------- # # The following specifies that items PERQ1 and PERQ2 covary with each other, both covary with IMAG1 # mobi_am <- associations( # item_errors("PERQ1", "PERQ2"), # item_errors(c("PERQ1", "PERQ2"), "IMAG1") # ) ## ---- eval = FALSE------------------------------------------------------------ # # By default, interaction terms are computed using two stage procedures # interaction_term(iv = "Image", moderator = "Expectation") # # # You can also explicitly specify how to create the interaction term # interaction_term(iv = "Image", moderator = "Expectation", method = two_stage) # interaction_term(iv = "Image", moderator = "Expectation", method = product_indicator) # interaction_term(iv = "Image", moderator = "Expectation", method = orthogonal) ## ---- eval=FALSE-------------------------------------------------------------- # 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") # ) ## ---- eval=FALSE-------------------------------------------------------------- # # "Image" -> "Expectation" # paths(from = "Image", to = "Expectation") ## ---- eval=FALSE-------------------------------------------------------------- # # "Image" -> "Expectation" # # "Image" -> "Satisfaction" # paths(from = "Image", to = c("Expectation", "Satisfaction")) ## ---- eval=FALSE-------------------------------------------------------------- # # "Image" -> "Satisfaction" # # "Expectation" -> "Satisfaction" # paths(from = c("Image", "Expectation"), to = "Satisfaction") ## ---- eval=FALSE-------------------------------------------------------------- # # "Expectation" -> "Value" # # "Expectation" -> "Satisfaction" # # "Quality" -> "Value" # # "Quality" -> "Satisfaction" # paths(from = c("Expectation", "Quality"), to = c("Value", "Satisfaction")) ## ----------------------------------------------------------------------------- # 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"), interaction_term(iv = "Image", moderator = "Value") ) # 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 ) mobi_cfa <- estimate_cfa( data = mobi, measurement_model = as.reflective(mobi_mm) ) mobi_cbsem <- estimate_cbsem( data = mobi, measurement_model = as.reflective(mobi_mm), structural_model = mobi_sm ) ## ----------------------------------------------------------------------------- # use 1000 bootstraps and utilize 2 parallel cores boot_mobi_pls <- bootstrap_model(seminr_model = mobi_pls, nboot = 1000, cores = 2) ## ----------------------------------------------------------------------------- summary(mobi_pls) ## ---- eval = FALSE------------------------------------------------------------ # summary(boot_mobi_pls) ## ----------------------------------------------------------------------------- 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) # Load data, assemble model, and bootstrap boot_seminr_model <- bootstrap_model(seminr_model = mobi_pls, nboot = 50, cores = 2, seed = NULL) # Calculate the 5% confidence interval for mediated path Image -> Expectation -> Satisfaction specific_effect_significance(boot_seminr_model = boot_seminr_model, from = "Image", through = c("Expectation", "Satisfaction"), to = "Complaints", alpha = 0.05) # Calculate the 10% confidence interval for direct path Image -> Satisfaction specific_effect_significance(boot_seminr_model = boot_seminr_model, from = "Image", to = "Satisfaction", alpha = 0.10) ## ---- eval=FALSE-------------------------------------------------------------- # model_summary <- summary(mobi_pls) # model_summary$descriptives$statistics$items # model_summary$descriptives$correlations$items # model_summary$descriptives$statistics$constructs # model_summary$descriptives$correlations$constructs ## ----------------------------------------------------------------------------- # generate a small model for creating the plot mobi_mm <- constructs( composite("Image", multi_items("IMAG", 1:3)), composite("Value", multi_items("PERV", 1:2)), higher_composite("Satisfaction", dimensions = c("Image","Value"), method = two_stage), composite("Quality", multi_items("PERQ", 1:3), weights = mode_B), composite("Complaints", single_item("CUSCO")), reflective("Loyalty", multi_items("CUSL", 1:3)) ) mobi_sm <- relationships( paths(from = c("Quality"), to = "Satisfaction"), paths(from = "Satisfaction", to = c("Complaints", "Loyalty")) ) pls_model <- estimate_pls( data = mobi, measurement_model = mobi_mm, structural_model = mobi_sm ) boot_estimates <- bootstrap_model(pls_model, nboot = 100, cores = 1) ## ----include = FALSE, eval = FALSE-------------------------------------------- # pl <- plot(boot_estimates, title = "Bootstrapped Model") # save_plot("myfigure.png", width = 2400, plot = pl) ## ----echo=FALSE, out.width='75%'---------------------------------------------- knitr::include_graphics('myfigure.png')