1 Introduction

Here, the R data set …..

## # A tibble: 200 x 15
##    Respondent_ID Gender IncomeDummy Safe1 ComCon1 Affordable1 Frequency1 People1
##    <chr>          <dbl>       <dbl> <dbl>   <dbl>       <dbl>      <dbl>   <dbl>
##  1 1                  1           0     2       2           2          3       4
##  2 2                  1           0     2       1           2          1       3
##  3 3                  1           0     3       3           1          1       3
##  4 4                  0           0     3       3           3          3       2
##  5 5                  1           0     2       2           4          3       4
##  6 6                  1           0     4       1           1          3       3
##  7 7                  1           0     3       3           2          3       3
##  8 8                  0           0     4       3           3          3       3
##  9 9                  0           0     1       1           2          3       2
## 10 10                 1           1     2       1           3          2       3
## # ... with 190 more rows, and 7 more variables: PubOpinion1 <dbl>,
## #   SMedia1 <dbl>, Access1 <dbl>, Money1 <dbl>, Capable1 <dbl>,
## #   PTUse_Intention <dbl>, Trips_per_Month <dbl>

2 Loading packages

There are several packages used in this example:

  • Package stats is used for statistical calculations (Linear regression, …)
  • Package lavaan is used for SEM.
  • Package readr is used to read data from CSV file.
  • Package semPlot is used for viewing SEM model in graphic.
library(stats)
library(lavaan)
library(readr)
library(semPlot)

3 Data & Cleaning Data

3.1 Data reading

Loading data set **** into R’s workspace and assigning it to df_all (for convenience):

df_all <- read_csv("SEM_Data.csv",
                    col_types = cols(Respondent_ID = col_character(),
                                    .default = col_number()),
                   na = "empty",
                   skip_empty_rows = TRUE)

3.2 Data multiplication

df_all_model_binary <- df_all
         
df_all_model_binary$PTUse_Intention_dum = ifelse(df_all_model_binary$PTUse_Intention < 3, 0, 1)
  
df_all_model_binary
## # A tibble: 200 x 16
##    Respondent_ID Gender IncomeDummy Safe1 ComCon1 Affordable1 Frequency1 People1
##    <chr>          <dbl>       <dbl> <dbl>   <dbl>       <dbl>      <dbl>   <dbl>
##  1 1                  1           0     2       2           2          3       4
##  2 2                  1           0     2       1           2          1       3
##  3 3                  1           0     3       3           1          1       3
##  4 4                  0           0     3       3           3          3       2
##  5 5                  1           0     2       2           4          3       4
##  6 6                  1           0     4       1           1          3       3
##  7 7                  1           0     3       3           2          3       3
##  8 8                  0           0     4       3           3          3       3
##  9 9                  0           0     1       1           2          3       2
## 10 10                 1           1     2       1           3          2       3
## # ... with 190 more rows, and 8 more variables: PubOpinion1 <dbl>,
## #   SMedia1 <dbl>, Access1 <dbl>, Money1 <dbl>, Capable1 <dbl>,
## #   PTUse_Intention <dbl>, Trips_per_Month <dbl>, PTUse_Intention_dum <dbl>

4 SEM Model estimation (with estimated variable is a binary and observed variables are continuous)

Considering the following latent variables & assuming that no covariance exists among variables:

  • Attitude
  • Subjective Norm
  • Perceived Behavioral Control

STEP 1: Defining the SEM model syntax

modelSEM_syntax <- '# Measurement models,
                   Attitude          =~ 1*Safe1 + ComCon1 + Affordable1 + Frequency1
                   SubNorm           =~ 1*People1 + PubOpinion1 + SMedia1
                   PBC               =~ 1*Access1 + Money1 + Capable1
                 
                   #Structural part of the model (linear regressions)
                   PTUse_Intention_dum ~ Attitude + SubNorm + PBC
                  '

STEP 2: Estimating the defined SEM model

fitSEM <- lavaan::sem(model = modelSEM_syntax, 
                      data = df_all_model_binary,
                      orthogonal = T, #If TRUE, all covariances among latent variables are set to zero.
                      )

STEP 3: Displaying the defined SEM model result

  • Summary of SEM model result
summary(fitSEM, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-8 ended normally after 39 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        24
##                                                       
##   Number of observations                           200
##                                                       
## Model Test User Model:
##                                                       
##   Test statistic                               247.040
##   Degrees of freedom                                42
##   P-value (Chi-square)                           0.000
## 
## Model Test Baseline Model:
## 
##   Test statistic                               951.252
##   Degrees of freedom                                55
##   P-value                                        0.000
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.771
##   Tucker-Lewis Index (TLI)                       0.700
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -1921.836
##   Loglikelihood unrestricted model (H1)      -1798.316
##                                                       
##   Akaike (AIC)                                3891.671
##   Bayesian (BIC)                              3970.831
##   Sample-size adjusted Bayesian (BIC)         3894.796
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.156
##   90 Percent confidence interval - lower         0.138
##   90 Percent confidence interval - upper         0.175
##   P-value RMSEA <= 0.05                          0.000
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.261
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Expected
##   Information saturated (h1) model          Structured
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   Attitude =~                                                           
##     Safe1             1.000                               0.600    0.749
##     ComCon1           1.096    0.107   10.208    0.000    0.658    0.807
##     Affordable1       0.881    0.103    8.536    0.000    0.528    0.655
##     Frequency1        0.934    0.106    8.823    0.000    0.560    0.677
##   SubNorm =~                                                            
##     People1           1.000                               0.476    0.695
##     PubOpinion1       1.351    0.134   10.119    0.000    0.643    0.951
##     SMedia1           1.016    0.100   10.139    0.000    0.483    0.768
##   PBC =~                                                                
##     Access1           1.000                               0.485    0.651
##     Money1            1.117    0.184    6.078    0.000    0.542    0.802
##     Capable1          0.632    0.100    6.312    0.000    0.307    0.589
## 
## Regressions:
##                         Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   PTUse_Intention_dum ~                                                      
##     Attitude               0.456    0.058    7.827    0.000    0.273    0.592
##     SubNorm               -0.140    0.060   -2.324    0.020   -0.066   -0.144
##     PBC                   -0.087    0.065   -1.347    0.178   -0.042   -0.092
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   Attitude ~~                                                           
##     SubNorm           0.000                               0.000    0.000
##     PBC               0.000                               0.000    0.000
##   SubNorm ~~                                                            
##     PBC               0.000                               0.000    0.000
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .Safe1             0.281    0.038    7.457    0.000    0.281    0.438
##    .ComCon1           0.232    0.037    6.332    0.000    0.232    0.349
##    .Affordable1       0.372    0.044    8.542    0.000    0.372    0.571
##    .Frequency1        0.370    0.044    8.347    0.000    0.370    0.541
##    .People1           0.241    0.029    8.470    0.000    0.241    0.516
##    .PubOpinion1       0.043    0.028    1.560    0.119    0.043    0.095
##    .SMedia1           0.162    0.022    7.204    0.000    0.162    0.409
##    .Access1           0.319    0.047    6.806    0.000    0.319    0.576
##    .Money1            0.162    0.046    3.554    0.000    0.162    0.356
##    .Capable1          0.177    0.022    7.894    0.000    0.177    0.653
##    .PTUs_Intntn_dm    0.132    0.015    8.853    0.000    0.132    0.620
##     Attitude          0.360    0.063    5.728    0.000    1.000    1.000
##     SubNorm           0.226    0.043    5.282    0.000    1.000    1.000
##     PBC               0.235    0.057    4.136    0.000    1.000    1.000
  • Viewing the SEM model result
semPaths(object = fitSEM,
         layout = 'tree2',
         intercepts = F,
         what = "std",
         whatLabels = 'std',
         combineGroups = F,
         rotation = 4,
         thresholds = F,
         residuals = F,
         nCharNodes = 4,
         curve = T,
         intStyle = 'multi',
         shapeLat = 'ellipse',
         optimizeLatRes = T,
         style = "lisrel",
         ask = F,
         sizeLat = 10,
         sizeMan = 6,
         sizeInt = 10
         )

LS0tDQp0aXRsZTogIkxpbmVhciBSZWdyZXNzaW9uICYgU0VNIE1vZGVsIChUcmFuc3BvcnRhdGlvbiBQbGFubmluZyAtIDJuZCB0ZXJtIG9mIEFZMjAyMSkiDQphdXRob3I6ICJIb25nIE5ndXllbiINCmRhdGU6ICI2LzI4LzIwMjEiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgICMgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgaGlnaGxpZ2h0OiB6ZW5idXJuDQogICAgIyBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiAiZmxhdGx5Ig0KICAgIHRvY19mbG9hdDogVFJVRQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQoNCmBgYA0KDQojIyAxIEludHJvZHVjdGlvbg0KDQpIZXJlLCB0aGUgUiBkYXRhIHNldCAuLi4uLg0KYGBge3IsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KHJlYWRyKQ0KZGZfYWxsIDwtIHJlYWRfY3N2KCJTRU1fRGF0YS5jc3YiLA0KICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKFJlc3BvbmRlbnRfSUQgPSBjb2xfY2hhcmFjdGVyKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IGNvbF9udW1iZXIoKSksDQogICAgICAgICAgICAgICAgICAgbmEgPSAiZW1wdHkiLA0KICAgICAgICAgICAgICAgICAgIHNraXBfZW1wdHlfcm93cyA9IFRSVUUpDQpkZl9hbGwNCmBgYA0KDQoNCiMjIDIgTG9hZGluZyBwYWNrYWdlcw0KDQpUaGVyZSBhcmUgc2V2ZXJhbCBwYWNrYWdlcyB1c2VkIGluIHRoaXMgZXhhbXBsZToNCg0KLSAgIFBhY2thZ2UgKnN0YXRzKiBpcyB1c2VkIGZvciBzdGF0aXN0aWNhbCBjYWxjdWxhdGlvbnMgKExpbmVhciByZWdyZXNzaW9uLCAuLi4pDQotICAgUGFja2FnZSAqbGF2YWFuKiBpcyB1c2VkIGZvciBTRU0uDQotICAgUGFja2FnZSAqcmVhZHIqIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gQ1NWIGZpbGUuDQotICAgUGFja2FnZSAqc2VtUGxvdCogaXMgdXNlZCBmb3Igdmlld2luZyBTRU0gbW9kZWwgaW4gZ3JhcGhpYy4NCg0KYGBge3IgcGFja2FnZSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkoc3RhdHMpDQpsaWJyYXJ5KGxhdmFhbikNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHNlbVBsb3QpDQpgYGANCg0KIyMgMyBEYXRhICYgQ2xlYW5pbmcgRGF0YQ0KDQojIyMgMy4xIERhdGEgcmVhZGluZw0KDQpMb2FkaW5nIGRhdGEgc2V0IGAqKioqYCAgaW50byBSJ3Mgd29ya3NwYWNlIGFuZCBhc3NpZ25pbmcgaXQgdG8gYGRmX2FsbGAgKGZvciBjb252ZW5pZW5jZSk6DQoNCmBgYHtyLCB3YXJuaW5nPUYsIG1lc3NhZ2U9Rn0NCmRmX2FsbCA8LSByZWFkX2NzdigiU0VNX0RhdGEuY3N2IiwNCiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyhSZXNwb25kZW50X0lEID0gY29sX2NoYXJhY3RlcigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBjb2xfbnVtYmVyKCkpLA0KICAgICAgICAgICAgICAgICAgIG5hID0gImVtcHR5IiwNCiAgICAgICAgICAgICAgICAgICBza2lwX2VtcHR5X3Jvd3MgPSBUUlVFKQ0KYGBgDQoNCiMjIyAzLjIgRGF0YSBtdWx0aXBsaWNhdGlvbg0KDQpgYGB7ciwgd2FybmluZz1GLCBtZXNzYWdlPUZ9DQoNCmRmX2FsbF9tb2RlbF9iaW5hcnkgPC0gZGZfYWxsDQogICAgICAgICANCmRmX2FsbF9tb2RlbF9iaW5hcnkkUFRVc2VfSW50ZW50aW9uX2R1bSA9IGlmZWxzZShkZl9hbGxfbW9kZWxfYmluYXJ5JFBUVXNlX0ludGVudGlvbiA8IDMsIDAsIDEpDQogIA0KZGZfYWxsX21vZGVsX2JpbmFyeQ0KYGBgDQoNCg0KIyMgNCBTRU0gTW9kZWwgZXN0aW1hdGlvbiAod2l0aCBlc3RpbWF0ZWQgdmFyaWFibGUgaXMgYSBgYmluYXJ5YCBhbmQgb2JzZXJ2ZWQgdmFyaWFibGVzIGFyZSBgY29udGludW91c2ApDQoNCkNvbnNpZGVyaW5nIHRoZSBmb2xsb3dpbmcgbGF0ZW50IHZhcmlhYmxlcyAmIGFzc3VtaW5nIHRoYXQgKioqbm8gY292YXJpYW5jZSBleGlzdHMgYW1vbmcgdmFyaWFibGVzKioqOg0KDQotICAgYEF0dGl0dWRlYA0KLSAgIGBTdWJqZWN0aXZlIE5vcm1gDQotICAgYFBlcmNlaXZlZCBCZWhhdmlvcmFsIENvbnRyb2xgDQoNCiMjIyBTVEVQIDE6IERlZmluaW5nIHRoZSBTRU0gbW9kZWwgc3ludGF4DQpgYGB7ciwgZWNobz1UUlVFfQ0KbW9kZWxTRU1fc3ludGF4IDwtICcjIE1lYXN1cmVtZW50IG1vZGVscywNCiAgICAgICAgICAgICAgICAgICBBdHRpdHVkZSAgICAgICAgICA9fiAxKlNhZmUxICsgQ29tQ29uMSArIEFmZm9yZGFibGUxICsgRnJlcXVlbmN5MQ0KICAgICAgICAgICAgICAgICAgIFN1Yk5vcm0gICAgICAgICAgID1+IDEqUGVvcGxlMSArIFB1Yk9waW5pb24xICsgU01lZGlhMQ0KICAgICAgICAgICAgICAgICAgIFBCQyAgICAgICAgICAgICAgID1+IDEqQWNjZXNzMSArIE1vbmV5MSArIENhcGFibGUxDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICNTdHJ1Y3R1cmFsIHBhcnQgb2YgdGhlIG1vZGVsIChsaW5lYXIgcmVncmVzc2lvbnMpDQogICAgICAgICAgICAgICAgICAgUFRVc2VfSW50ZW50aW9uX2R1bSB+IEF0dGl0dWRlICsgU3ViTm9ybSArIFBCQw0KICAgICAgICAgICAgICAgICAgJw0KYGBgDQojIyMgU1RFUCAyOiBFc3RpbWF0aW5nIHRoZSBkZWZpbmVkIFNFTSBtb2RlbA0KYGBge3IsIGVjaG89VFJVRX0NCmZpdFNFTSA8LSBsYXZhYW46OnNlbShtb2RlbCA9IG1vZGVsU0VNX3N5bnRheCwgDQogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2FsbF9tb2RlbF9iaW5hcnksDQogICAgICAgICAgICAgICAgICAgICAgb3J0aG9nb25hbCA9IFQsICNJZiBUUlVFLCBhbGwgY292YXJpYW5jZXMgYW1vbmcgbGF0ZW50IHZhcmlhYmxlcyBhcmUgc2V0IHRvIHplcm8uDQogICAgICAgICAgICAgICAgICAgICAgKQ0KYGBgDQojIyMgU1RFUCAzOiBEaXNwbGF5aW5nIHRoZSBkZWZpbmVkIFNFTSBtb2RlbCByZXN1bHQNCi0gU3VtbWFyeSBvZiBTRU0gbW9kZWwgcmVzdWx0DQpgYGB7ciwgZWNobz1UUlVFfQ0Kc3VtbWFyeShmaXRTRU0sIGZpdC5tZWFzdXJlcyA9IFRSVUUsIHN0YW5kYXJkaXplZCA9IFRSVUUpDQpgYGANCi0gVmlld2luZyB0aGUgU0VNIG1vZGVsIHJlc3VsdA0KYGBge3IsIGVjaG89VFJVRX0NCnNlbVBhdGhzKG9iamVjdCA9IGZpdFNFTSwNCiAgICAgICAgIGxheW91dCA9ICd0cmVlMicsDQogICAgICAgICBpbnRlcmNlcHRzID0gRiwNCiAgICAgICAgIHdoYXQgPSAic3RkIiwNCiAgICAgICAgIHdoYXRMYWJlbHMgPSAnc3RkJywNCiAgICAgICAgIGNvbWJpbmVHcm91cHMgPSBGLA0KICAgICAgICAgcm90YXRpb24gPSA0LA0KICAgICAgICAgdGhyZXNob2xkcyA9IEYsDQogICAgICAgICByZXNpZHVhbHMgPSBGLA0KICAgICAgICAgbkNoYXJOb2RlcyA9IDQsDQogICAgICAgICBjdXJ2ZSA9IFQsDQogICAgICAgICBpbnRTdHlsZSA9ICdtdWx0aScsDQogICAgICAgICBzaGFwZUxhdCA9ICdlbGxpcHNlJywNCiAgICAgICAgIG9wdGltaXplTGF0UmVzID0gVCwNCiAgICAgICAgIHN0eWxlID0gImxpc3JlbCIsDQogICAgICAgICBhc2sgPSBGLA0KICAgICAgICAgc2l6ZUxhdCA9IDEwLA0KICAgICAgICAgc2l6ZU1hbiA9IDYsDQogICAgICAgICBzaXplSW50ID0gMTANCiAgICAgICAgICkNCg0KYGBgDQo=