카테고리 없음

박중희 박사의 plspm(pls구조방정식)분석 2 - 확인적 요인분석 절차에 따른 내용확인하기 - 지표 타당도 , 신뢰도, 집중타당도, 판별타당도

박중희 2024. 6. 15. 07:44

박중희 박사의 plspm(pls구조방정식)분석 2 - 확인적 요인분석 절차에 따른 내용확인하기 

 

이번에는 분석된 내용에 대해 상세하게 살펴보는 시간을 갖도록 해보자. 

plspm 분석

library(jjstat)
library(plspm)
data(satisfaction)
sat_path = plspm_paths(
  row_names = c("IMAG","EXPE","QUAL","VAL","SAT","LOY"),
  relationship = list(
    path(from="IMAG", to=c("EXPE","SAT","LOY")),
    path("EXPE", c("QUAL","VAL","SAT")),
    path("QUAL", c("VAL","SAT")),
    path("VAL",c("SAT")),
    path("SAT","LOY"))
     )
 sat_path    

# blokcs 
sat_blocks1 <- plspm_blocks(
  IMAG = item(paste0("imag",1:5)),
  EXPE = item(paste0("expe", 1:5)),
  QUAL = item( paste0("qual", 1:5)),
  VAL = item(paste0("val", 1:4)),
  SAT = item(paste0("sat", 1:4)),
  LOY = item(paste0("loy", 1:4))
)

sat_blocks1

# vector of modes (reflective indicators):auto
sat_mod = rep("A", 6)


#기존방식 
satpls_boot = plspm(satisfaction, 
                    path_matrix = sat_path, 
                    blocks = sat_blocks1, 
                    scaled = FALSE, boot.val=TRUE)
#jjstat
satpls_boot = plspm_sem(satisfaction, sat_path, sat_blocks1, scaled = FALSE,
                   boot.val =TRUE, br=100)

분석을 하는 경우, 처음부터 bootstrap을 하는게 좋다. 

 

1. 지표 타당도 보기 

outer_model에 기존적인 데이터가 존재한다. 

satpls_boot$outer_model
    name block     weight   loading communality redundancy
1  imag1  IMAG 0.09824185 0.7093265   0.5031441  0.0000000
2  imag2  IMAG 0.15747286 0.8773078   0.7696690  0.0000000
3  imag3  IMAG 0.15672212 0.8417485   0.7085406  0.0000000
4  imag4  IMAG 0.07657586 0.5691934   0.3239812  0.0000000
5  imag5  IMAG 0.18433024 0.7784668   0.6060106  0.0000000
6  expe1  EXPE 0.10623016 0.7658006   0.5864505  0.1965745
7  expe2  EXPE 0.14069312 0.8374190   0.7012706  0.2350615
8  expe3  EXPE 0.11878317 0.7598206   0.5773273  0.1935165
9  expe4  EXPE 0.09945148 0.7183452   0.5160199  0.1729666
10 expe5  EXPE 0.13837438 0.8372760   0.7010311  0.2349812
11 qual1  QUAL 0.10660655 0.7814693   0.6106943  0.4395095
12 qual2  QUAL 0.13459490 0.8815583   0.7771451  0.5593022
13 qual3  QUAL 0.11714165 0.7940762   0.6305569  0.4538044
14 qual4  QUAL 0.09561846 0.7889819   0.6224925  0.4480005
15 qual5  QUAL 0.11570787 0.8074465   0.6519699  0.4692151
16  val1   VAL 0.17496081 0.8648220   0.7479171  0.4413342
17  val2   VAL 0.11766979 0.7962390   0.6339965  0.3741114
18  val3   VAL 0.12078895 0.7500647   0.5625970  0.3319797
19  val4   VAL 0.16652602 0.8444831   0.7131517  0.4208197
20  sat1   SAT 0.16636655 0.9197980   0.8460283  0.5984136
21  sat2   SAT 0.16265980 0.9160302   0.8391114  0.5935211
22  sat3   SAT 0.12109136 0.8258786   0.6820755  0.4824463
23  sat4   SAT 0.13207908 0.8175253   0.6683477  0.4727363
24  loy1   LOY 0.15862463 0.9065871   0.8219001  0.4191054
25  loy2   LOY 0.08172810 0.6711014   0.4503771  0.2296574
26  loy3   LOY 0.16166459 0.9049736   0.8189773  0.4176150
27  loy4   LOY 0.08066909 0.6818742   0.4649525  0.2370898

이 데이터를 읽어낼 때 bootsrap자료에서 유의성을 읽어내야 한다. 여기에는 부트스트랩을 한 후에 유의성 결과를 나타낸 자료가 존재한다. 즉 outer_model은 자료를 참고하고, 이 자료를 가지고 결과를 해석해야 한다. 

satpls_boot$boot$loadings
            Original Mean.Boot  Std.Error  perc.025  perc.975
IMAG-imag1 0.7093265 0.7112835 0.05997047 0.5827275 0.8125350
IMAG-imag2 0.8773078 0.8794255 0.02316630 0.8346611 0.9191875
IMAG-imag3 0.8417485 0.8461899 0.02309483 0.7983916 0.8899895
IMAG-imag4 0.5691934 0.5645118 0.07482547 0.4268511 0.6861092
IMAG-imag5 0.7784668 0.7769827 0.03884854 0.7025188 0.8437503
EXPE-expe1 0.7658006 0.7620351 0.03843760 0.6829260 0.8289232
EXPE-expe2 0.8374190 0.8383622 0.03180743 0.7628965 0.8799651
EXPE-expe3 0.7598206 0.7603930 0.04730352 0.6738331 0.8420231
EXPE-expe4 0.7183452 0.7201013 0.04558238 0.6394090 0.7998848
EXPE-expe5 0.8372760 0.8365196 0.03076629 0.7717362 0.8885502
QUAL-qual1 0.7814693 0.7760495 0.05139641 0.6586684 0.8589364
QUAL-qual2 0.8815583 0.8822318 0.02039976 0.8303468 0.9122042
QUAL-qual3 0.7940762 0.7968264 0.03313298 0.7337120 0.8546859
QUAL-qual4 0.7889819 0.7907407 0.04038055 0.7163623 0.8620497
QUAL-qual5 0.8074465 0.8068448 0.03476964 0.7334409 0.8686611
VAL-val1   0.8648220 0.8679047 0.02219615 0.8185336 0.9032435
VAL-val2   0.7962390 0.7936317 0.04951894 0.7031816 0.8723172
VAL-val3   0.7500647 0.7515582 0.05413578 0.6412801 0.8504239
VAL-val4   0.8444831 0.8488003 0.02674019 0.7861876 0.8950562
SAT-sat1   0.9197980 0.9218834 0.01086510 0.8973247 0.9401112
SAT-sat2   0.9160302 0.9186984 0.01160600 0.8928956 0.9360853
SAT-sat3   0.8258786 0.8228912 0.03826963 0.7338941 0.8790461
SAT-sat4   0.8175253 0.8129248 0.04068026 0.7293272 0.8796842
LOY-loy1   0.9065871 0.9068745 0.02173569 0.8709948 0.9444481
LOY-loy2   0.6711014 0.6737767 0.06065240 0.5562956 0.7755798
LOY-loy3   0.9049736 0.9062130 0.01750031 0.8738859 0.9437071
LOY-loy4   0.6818742 0.6702005 0.07950579 0.5327388 0.7965025

 

#jjstat에서 이 부분을 쉽게 찾아내기 위해서 만든 함수가 plspm_loadings()함수이다. dall()함수는 데이터프레임으로 출력하는 함수이다. data.frame()라고 지정해도 된다. 

이 결과에는 t값과 유의성을 표시했고, 신뢰구간을 더 보기 좋게 정리했다 

satpls_boot%>% plspm_loadings()%>%dall()
     측정항목 비표준화계수 Boot.평균 표준오차         t     신뢰구간95
1  IMAG-imag1        0.709     0.711    0.060 11.850*** [0.583, 0.813]
2  IMAG-imag2        0.877     0.879    0.023 38.217*** [0.835, 0.919]
3  IMAG-imag3        0.842     0.846    0.023 36.783*** [0.798, 0.890]
4  IMAG-imag4        0.569     0.565    0.075  7.533*** [0.427, 0.686]
5  IMAG-imag5        0.778     0.777    0.039 19.923*** [0.703, 0.844]
6  EXPE-expe1        0.766     0.762    0.038 20.053*** [0.683, 0.829]
7  EXPE-expe2        0.837     0.838    0.032 26.188*** [0.763, 0.880]
8  EXPE-expe3        0.760     0.760    0.047 16.170*** [0.674, 0.842]
9  EXPE-expe4        0.718     0.720    0.046 15.652*** [0.639, 0.800]
10 EXPE-expe5        0.837     0.837    0.031 27.000*** [0.772, 0.889]
11 QUAL-qual1        0.781     0.776    0.051 15.216*** [0.659, 0.859]
12 QUAL-qual2        0.882     0.882    0.020 44.100*** [0.830, 0.912]
13 QUAL-qual3        0.794     0.797    0.033 24.152*** [0.734, 0.855]
14 QUAL-qual4        0.789     0.791    0.040 19.775*** [0.716, 0.862]
15 QUAL-qual5        0.807     0.807    0.035 23.057*** [0.733, 0.869]
16   VAL-val1        0.865     0.868    0.022 39.455*** [0.819, 0.903]
17   VAL-val2        0.796     0.794    0.050 15.880*** [0.703, 0.872]
18   VAL-val3        0.750     0.752    0.054 13.926*** [0.641, 0.850]
19   VAL-val4        0.844     0.849    0.027 31.444*** [0.786, 0.895]
20   SAT-sat1        0.920     0.922    0.011 83.818*** [0.897, 0.940]
21   SAT-sat2        0.916     0.919    0.012 76.583*** [0.893, 0.936]
22   SAT-sat3        0.826     0.823    0.038 21.658*** [0.734, 0.879]
23   SAT-sat4        0.818     0.813    0.041 19.829*** [0.729, 0.880]
24   LOY-loy1        0.907     0.907    0.022 41.227*** [0.871, 0.944]
25   LOY-loy2        0.671     0.674    0.061 11.049*** [0.556, 0.776]
26   LOY-loy3        0.905     0.906    0.018 50.333*** [0.874, 0.944]
27   LOY-loy4        0.682     0.670    0.080  8.375*** [0.533, 0.797]

 

 

다음과 같이 플롯을 그리는 함수명령을 통해서 시각적으로 더 쉽게 확인할 수 있다. 

satpls_boot%>% plspm_loadings_plot()

가능한 0.7이상을 사용하는게 좋고, 최소허용은 0.5까지 가능하다.
변수를 지울 때에는 통계적 값보다는 가능한 이론에 근거해서 지우는게 좋다. 아무리 pls구조방정식이 탐색적이라 해도, 중요한 것은 이미 가지고 있는 이론이기 때문이다. 

 

2. 내적일관성 신뢰도 및 집중타당도

이번에는 내적일과선을 나타내는 크론바흐 알파와 복합 신뢰도(CR)와 집중 타당성을 나타내는 AVE를 확인하자. plspm_CRAVE()함수를 통해서 추출해낼 수 있다. 여기에는 필요한 3가지를 한번에 나타낸다. 

satpls_boot%>%plspm_CRAVE()
  Latent Cronbach CR(DG.rho)   AVE
1   IMAG    0.830      0.882 0.582
2   EXPE    0.847      0.891 0.616
3   QUAL    0.871      0.907 0.659
4    VAL    0.836      0.890 0.664
5    SAT    0.894      0.927 0.759
6    LOY    0.819      0.881 0.639

 

unidim을 통한 내적일관성 신뢰도 추출

크론바흐 알파, DG.rho는 CR(복합신뢰도)를 나타내고, eig.1st와 2nd는 주성분 분석의 두개의 주요 값이다. 여기에서 내적일관성에 대한 2개의 값을 얻을 수 있다. 크론바흐 알파, DG.rho는 CR(복합신뢰도)는 모두0.7이상이 되어야 한다. 

 satpls_boot$unidim
     Mode MVs   C.alpha    DG.rho  eig.1st   eig.2nd
IMAG    A   5 0.8302267 0.8822033 3.017810 0.7776358
EXPE    A   5 0.8465841 0.8908554 3.102314 0.6105467
QUAL    A   5 0.8713250 0.9068997 3.305987 0.5677773
VAL     A   4 0.8357228 0.8904442 2.681531 0.6006842
SAT     A   4 0.8940109 0.9267006 3.039999 0.4220001
LOY     A   4 0.8194216 0.8813711 2.604721 0.5734549

inner_summary에는 AVE가 나타난다. 집중타당도는 AVE가 0.5이상이 되는지 확인한다. 

중요한 것은 R2로 설명력이고, 블록단위의 커뮤널리티가 나타난다. 이 값은 AVE와 같은 값이다. redundacny와 같은 중복성은 다른 변수와의 중복성을 나타내는 것이다. 이 값이 크게 다른 변수의 영향의 큰 것이다. 

 satpls_boot$inner_summary
           Type        R2 Block_Communality Mean_Redundancy       AVE
IMAG  Exogenous 0.0000000         0.5822691       0.0000000 0.5822691
EXPE Endogenous 0.3351937         0.6164199       0.2066200 0.6164199
QUAL Endogenous 0.7196882         0.6585717       0.4739663 0.6585717
VAL  Endogenous 0.5900844         0.6644156       0.3920612 0.6644156
SAT  Endogenous 0.7073209         0.7588907       0.5367793 0.7588907
LOY  Endogenous 0.5099226         0.6390517       0.3258669 0.6390517

 

 

3. 판별타당도 

3.1. htmt

판별타당도는 plspm_htmt를 이용하여 먼저 구할 수 있다. 0.9미만에는 *표시가 있고, 최소한 1보다는 작아야 한다. 

현재의 값은 htmt2의 보정을 적용한 값이다. 

plspm_htmt(satisfaction, sat_blocks1)
       IMAG   EXPE   QUAL    VAL    SAT LOY
IMAG
EXPE 0.627*
QUAL 0.681*  0.965
VAL  0.809* 0.775* 0.874*
SAT  0.748* 0.694* 0.778*  0.920
LOY  0.716* 0.523* 0.675* 0.786* 0.714*

cut=1로 조절하여 유의성 표시를 바꿀 수 있다.  0.85미만이면 아주 좋고, 0.9이상은 적합하며, 1미만까지 허용할 수 있다. 

plspm_htmt(satisfaction, sat_blocks1, cut=1)
       IMAG   EXPE   QUAL    VAL    SAT LOY
IMAG
EXPE 0.627*
QUAL 0.681* 0.965*
VAL  0.809* 0.775* 0.874*
SAT  0.748* 0.694* 0.778* 0.920*
LOY  0.716* 0.523* 0.675* 0.786* 0.714*

sig=F로 두면 *표시는 사라진다. 

plspm_htmt(satisfaction, sat_blocks1, sig=F)
      IMAG  EXPE  QUAL   VAL   SAT LOY
IMAG
EXPE 0.627
QUAL 0.681 0.965
VAL  0.809 0.775 0.874
SAT  0.748 0.694 0.778 0.920
LOY  0.716 0.523 0.675 0.786 0.714

만약에 semTools의 htmt를 사용하려면, 입력되는 값은 lavaan syntax형태가 되어야 한다. jjstat에서는 plspm_blocks2lav()함수를 이용하여 lavaan의 신텍스로 바꾸는 것이 가능하고, 이를 이용하여 htmt를 구할 수 있다. 

 plspm_blocks2lav(sat_blocks1)%>%cat()

IMAG =~ imag1 + imag2 + imag3 + imag4 + imag5
EXPE =~ expe1 + expe2 + expe3 + expe4 + expe5
QUAL =~ qual1 + qual2 + qual3 + qual4 + qual5
VAL =~ val1 + val2 + val3 + val4
SAT =~ sat1 + sat2 + sat3 + sat4
LOY =~ loy1 + loy2 + loy3 + loy4

그러나, 유의성 표시나 기타 여러가지를 점검하는 것은 jjstat가 더 편리하다. 

 semTools::htmt(plspm_blocks2lav(sat_blocks1), 
+                satisfaction, htmt2 = TRUE)
      IMAG  EXPE  QUAL   VAL   SAT   LOY
IMAG 1.000
EXPE 0.627 1.000
QUAL 0.681 0.965 1.000
VAL  0.809 0.775 0.874 1.000
SAT  0.748 0.694 0.778 0.920 1.000
LOY  0.716 0.523 0.675 0.786 0.714 1.000

3.2. Fornell and Locker(1981) 

plspm_fl()함수를 활용하며 포넬과 락커의 방법을 적용할 수 있다. 이 방법은 roburst해서 대체로 통과가 안되는 경우가 많다. 그래서 htmt를 사용하기도 한다. 그러나, 가장 널리 쓰이는 방법이라는 면에서 중요하다. 

satpls_boot%>%plspm_fl
      IMAG  EXPE  QUAL   VAL   SAT LOY   Max sqrt_AVE sig
IMAG                                   0.000    0.763   *
EXPE 0.579                             0.579    0.785   *
QUAL 0.634 0.848                       0.848    0.812  ns
VAL  0.705 0.679 0.766                 0.766    0.815   *
SAT  0.692 0.618 0.699 0.823           0.823    0.871   *
LOY  0.618 0.485 0.609 0.694 0.686     0.694    0.799   *

분석된 결과의 scores의 값들을 보자. 

 satpls_boot$scores  %>% head()
         IMAG      EXPE       QUAL         VAL         SAT        LOY
1 -0.06448267 0.3442433 -0.5254008 -0.07103969 -0.20583024  0.1664431
2  0.83858784 0.7974660  0.3971273  0.44321149  0.36908558  0.4924859
3  0.47542512 0.5531210  0.1642778  0.56088128  0.83019100  0.8117161
4  0.42690176 0.1281051 -0.6892055 -0.81127296 -0.05045141 -0.7969487
5  1.04176442 0.4492096  0.7255953  1.21587873  0.53174538  0.7348195
6  0.27894142 0.6914954 -0.2088824 -0.29482532 -0.20212349  0.1714641

cor함수를 적용하면 잠재변수의 상관계수를 구할 수 있다. 

satpls_boot$scores  %>% cor()
          IMAG      EXPE      QUAL       VAL       SAT       LOY
IMAG 1.0000000 0.5789591 0.6337309 0.7051837 0.6921229 0.6180822
EXPE 0.5789591 1.0000000 0.8483444 0.6795146 0.6175365 0.4849719
QUAL 0.6337309 0.8483444 1.0000000 0.7661369 0.6985213 0.6090614
VAL  0.7051837 0.6795146 0.7661369 1.0000000 0.8225862 0.6936091
SAT  0.6921229 0.6175365 0.6985213 0.8225862 1.0000000 0.6859166
LOY  0.6180822 0.4849719 0.6090614 0.6936091 0.6859166 1.0000000

우리가 포넬과 락커의 방법을 적용하기 위해서 lower매트릭스로 바꾼 것이다. 아래처럼 나타난 자료에 AVE의 제곱근을 취해서 비교해주면 된다. 

 satpls_boot$scores  %>% cor() %>%lowerMat(diag="", fill="")%>%dall()
      IMAG  EXPE  QUAL   VAL   SAT LOY
IMAG
EXPE 0.579
QUAL 0.634 0.848
VAL  0.705  0.68 0.766
SAT  0.692 0.618 0.699 0.823
LOY  0.618 0.485 0.609 0.694 0.686

 

여기까지 확인적 요인분석절차에 맞춘 pls구조방정식의 분석을 알아보았다.