NicholasDanks / seminr

Natural-feeling domain-specific language for building PLS structural equation models
1 stars 0 forks source link

Applying weights (mode_A) to composite instead of reflective? #1

Open GreyMerchant opened 4 years ago

GreyMerchant commented 4 years ago

Hello there,

Thank you for this great package! So the code below runs as I expected. I do however want to be able to run the reflective with weights = mode_A but I see that is only available for the composite(). Is there some way I can do this on reflective at all?

Essentially, I am trying to match seminr as closely as possible to actual SmartPLS.


library(seminr)

mobi_mm <- constructs(
  reflective("Image",         multi_items("IMAG", 1:5)), #correlation weight
  reflective("Expectation",   multi_items("CUEX", 1:3)),
  reflective("Quality",       multi_items("PERQ", 1:7)),
  reflective("Value",         multi_items("PERV", 1:2)),
  reflective("Satisfaction", multi_items("CUSA", 1:3)),
  reflective("Complaints",   single_item("CUSCO")),
  reflective("Loyalty",      multi_items("CUSL", 1:3))
)

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")
)

mobi_pls <- estimate_pls(data = mobi,
                         measurement_model = mobi_mm,
                         structural_model = mobi_sm,
                         inner_weights = path_weighting)

summary(mobi_pls)

mobi_pls$outer_loadings
NicholasDanks commented 4 years ago

Hi GreyMerchant

Thanks for the interest. In PLS composites can only be measured as mode_a or mode_b. PLS does not allow for truly reflective constructs as estimated in cb-sem. (A posthoc adjustment can be made, and is for reflective() constructs in order to reproduce results for cb-sem using pls) However, if you wish to change your model spec to have mode_a composites, you can simply replace the reflective() function with the composite() function in constructs().

Please note that composites() takes an additional parameter weights which is default set to mode_A.

Once the model is estimated, you can use mobi_pls$outer_loadings and mobi_pls$outer_weights to access the relevant parameters.

SmartPLS uses “reflective” and mode A interchangeably. We disagree slightly with this formulation. However SEMinR will produce the same estimated parameters using composites(..., weights = mode_A) as SmartPLS does using reflective.

I hope this helps. Do let me know if you need any further details.

Kind regards, Nick

Get Outlook for iOShttps://aka.ms/o0ukef


From: GreyMerchant notifications@github.com Sent: Tuesday, May 5, 2020 10:35:01 PM To: NicholasDanks/seminr seminr@noreply.github.com Cc: Subscribed subscribed@noreply.github.com Subject: [NicholasDanks/seminr] Applying weights (mode_A) to composite instead of reflective? (#1)

Hello there,

Thank you for this great package! So the code below runs as I expected. I do however want to be able to run the reflective with weights = mode_A but I see that is only available for the composite(). Is there some way I can do this on reflective at all?

Essentially, I am trying to match seminr as closely as possible to actual SmartPLS.

library(seminr)

mobi_mm <- constructs( reflective("Image", multi_items("IMAG", 1:5)), #correlation weight reflective("Expectation", multi_items("CUEX", 1:3)), reflective("Quality", multi_items("PERQ", 1:7)), reflective("Value", multi_items("PERV", 1:2)), reflective("Satisfaction", multi_items("CUSA", 1:3)), reflective("Complaints", single_item("CUSCO")), reflective("Loyalty", multi_items("CUSL", 1:3)) )

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") )

mobi_pls <- estimate_pls(data = mobi, measurement_model = mobi_mm, structural_model = mobi_sm, inner_weights = path_weighting)

summary(mobi_pls)

mobi_pls$outer_loadings

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHubhttps://github.com/NicholasDanks/seminr/issues/1, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AECEM47YNGOIJBHCVJZZQH3RQAPZLANCNFSM4MZUDXBQ.

GreyMerchant commented 4 years ago

Hi,

Thanks so much for your reply. I have also picked up on this "SmartPLS uses “reflective” and mode A interchangeably" and it makes it very confusing throughout trying to get runs to match.

I was able to match SEMinR with composites(..., weights = mode_A) against SmartPLS reflective with mode A per latent factor.

library(seminr)

# Composite run (latent -> items) -----------------------------------------

mobi_mm <- constructs(
  composite("Image",         multi_items("IMAG", 1:5), weights = mode_A), #correlation weight
  composite("Expectation",   multi_items("CUEX", 1:3), weights = mode_A),#
  composite("Quality",       multi_items("PERQ", 1:7), weights = mode_A),
  composite("Value",         multi_items("PERV", 1:2), weights = mode_A),
  composite("Satisfaction", multi_items("CUSA", 1:3), weights = mode_A),
  composite("Complaints",   single_item("CUSCO"), weights = mode_A),
  composite("Loyalty",      multi_items("CUSL", 1:3), weights = mode_A)
)

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")
)

mobi_pls <- estimate_pls(data = mobi,
                         measurement_model = mobi_mm,
                         structural_model = mobi_sm,
                         inner_weights = path_weighting)

summary(mobi_pls)

mobi_pls$outer_loadings

image

The below is what I am trying to match. How would I go about matching it? How would one do the adjustment? And or know how they are performing it? Cb-sem? Covariate based sem?

image