박중희 박사의 plspm(pls구조방정식)분석 2 - 확인적 요인분석 절차에 따른 내용확인하기 - 지표 타당도 , 신뢰도, 집중타당도, 판별타당도
박중희 박사의 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구조방정식의 분석을 알아보았다.