Bài viết này giới thiệu cho các bạn phương pháp điều chỉnh mô hình độ phù hợp của mô hình CFA qua hàm residual.
Chúng ta sẽ sử dụng 1 hàm tự code, tên là funCFA_resid(), dựa trên hàm resid() trong gói lavaans, để tự động tìm ra các mối cần nối của từng nhân tố tiềm ẩn. Các bạn sẽ sử dụng hàm funCFA_resid() nhiều lần với các model khác nhau đến khi đạt được mô hình hợp lý.
Tài liệu phục vụ HỘI THẢO THỐNG KÊ TRONG KHOA HỌC XÃ HỘI VỚI PHẦN MỀM MÃ NGUỒN MỞ R Chi tiết tại: https://sites.google.com/view/tkud https://viasm.edu.vn/
Dữ liệu sử dụng trong hướng dẫn này là của PGS.TS Trần Văn Trang (Đại học Thương mại).
Bài báo gốc lấy tại: http://tckhtm.tmu.edu.vn/vi/news/cac-so-tap-chi/tap-chi-khoa-hoc-thuong-mai-so-141-153.html
Dữ liệu tải tại google diver: https://drive.google.com/drive/folders/1Npip6h8WyZjI9JGf5wonnU_scBUYj4sP?usp=sharing
setwd("D:/Tap huan VIASM/HoiThao_KHXH_2021/Projects/Y_Dinh_Hanh_Vi")
library(foreign)
require(tidyverse)
require(lavaan)
d <- read.spss("Case study Behavior Intention.sav",
use.value.label=TRUE, to.data.frame=TRUE)
d1 <- d %>% select(-c("STT", "FAM", "Formation",
"Work", "Year",
"BI1", "BIRecode", "BI4"))
?resid
Đây là hàm tự viết code, không thuộc gói lệnh nào và được định nghĩa như dưới này.
Sử dụng: Hàm có hai tham số đầu vào là:
modelCFA: Là kết quả ước lượng sau khi dùng hàm cfa() trong lavaan
cutoff_resid: Là giá trị cutoff và dương (>0) để quyết định nối
Hàm sẽ trả ra các cặp items có thể nối trong từng nhân tố tiềm ẩn. Các giá trị NA nghĩa là không cần nối.
Các cặp items cần nối sẽ được đưa vào model CFA với kí hiệu ~~, tức (Covariance).
Định nghĩa hàm như dưới này
#----------------By Huong Trinh (TMU), 29_8_2021
# For: https://viasm.edu.vn/hdkh/hoi-thao-thong-ke-trong-khoa-hoc-xa-hoi-voi-phan-mem-ma-nguon-mo-r
funCFA_resid <- function(modelCFA, cutoff_resid )
{
# modelCFA: A CFA mode, after using cfa function in Lavaan
# cutoff_resid: a positive value
#Find auto latents
Varlatent <- standardizedSolution(modelCFA) %>%
filter(op == "=~") %>%
select(lhs) %>%
unique()
nVl <- length(Varlatent$lhs)
# Find items
VarItems <- list()
for ( i in Varlatent$lhs)
{
VarItems[[i]] <- standardizedSolution(modelCFA) %>%
filter(op == "=~" & lhs == i) %>% select(rhs) %>% unique()
}
resid_CFA <- data.frame(resid(modelCFA , type="normalized")$cov)
#to find items to connect
Resid_Final <- list()
for (i in Varlatent$lhs)
{
i_var <- VarItems[[i]]$rhs
residtempt <- resid_CFA[i_var, i_var]
residtempt[ - cutoff_resid < residtempt& residtempt < cutoff_resid] <- NA
Resid_Final[[i]] <- residtempt
}
return(Resid_Final )
}
cfa.model2 <- ' BEINTEN =~ BI2 + BI3 + BI5 + BI6
RELA =~ REL1 + REL2 + REL3+ REL4
EDUC =~ EDU1 + EDU2 + EDU3 + EDU4 + EDU5 + EDU6 + EDU7 + EDU8
GOVE =~ GOV1 + GOV2 + GOV3 + GOV4 + GOV5
ENDO =~ END1 + END2 + END3 + END4 + END5 ' #No END1 in the Trang (2020)
cfa.d2 <- cfa(cfa.model2, data = d1)
resid_d2 <- funCFA_resid (cfa.d2, 2)
Xem các cặp items cần nối
resid_d2
## $BEINTEN
## BI2 BI3 BI5 BI6
## BI2 NA 2.054075 NA NA
## BI3 2.054075 NA NA NA
## BI5 NA NA NA NA
## BI6 NA NA NA NA
##
## $RELA
## REL1 REL2 REL3 REL4
## REL1 NA NA NA -2.439863
## REL2 NA NA NA NA
## REL3 NA NA NA 3.980846
## REL4 -2.439863 NA 3.980846 NA
##
## $EDUC
## EDU1 EDU2 EDU3 EDU4 EDU5 EDU6 EDU7 EDU8
## EDU1 NA 2.954814 NA NA NA NA NA NA
## EDU2 2.954814 NA 2.680577 NA NA -2.195772 NA NA
## EDU3 NA 2.680577 NA NA NA NA NA NA
## EDU4 NA NA NA NA NA NA NA NA
## EDU5 NA NA NA NA NA 2.083965 NA NA
## EDU6 NA -2.195772 NA NA 2.083965 NA NA NA
## EDU7 NA NA NA NA NA NA NA 2.937337
## EDU8 NA NA NA NA NA NA 2.937337 NA
##
## $GOVE
## GOV1 GOV2 GOV3 GOV4 GOV5
## GOV1 NA NA NA NA NA
## GOV2 NA NA NA NA NA
## GOV3 NA NA NA NA NA
## GOV4 NA NA NA NA 2.898269
## GOV5 NA NA NA 2.898269 NA
##
## $ENDO
## END1 END2 END3 END4 END5
## END1 NA NA NA NA -2.562995
## END2 NA NA NA NA NA
## END3 NA NA NA NA NA
## END4 NA NA NA NA 3.669234
## END5 -2.562995 NA NA 3.669234 NA
Các cặp items cần nối sẽ được đưa vào model CFA với mục # Covariance, tức sử dụng ~~.
cfa.model3 <- ' BEINTEN =~ BI2 + BI3 + BI5 + BI6
RELA =~ REL1 + REL2 + REL3+ REL4
EDUC =~ EDU1 + EDU2 + EDU3 + EDU4 + EDU5 + EDU6 + EDU7 + EDU8
GOVE =~ GOV1 + GOV2 + GOV3 + GOV4 + GOV5
ENDO =~ END1 + END2 + END3 + END4 + END5
# Covariance
BI2 ~~ BI3
REL4 ~~ REL1 + REL3
EDU2 ~~ EDU1 + EDU3 + EDU6
EDU5 ~~ EDU6
EDU7 ~~ EDU8
GOV4 ~~ GOV5
END5 ~~ END1 + END4 '
cfa.d3 <- cfa(cfa.model3, data = d1)
resid_d3 <- funCFA_resid (cfa.d3, 2)
resid_d3
## $BEINTEN
## BI2 BI3 BI5 BI6
## BI2 NA NA NA NA
## BI3 NA NA NA NA
## BI5 NA NA NA NA
## BI6 NA NA NA NA
##
## $RELA
## REL1 REL2 REL3 REL4
## REL1 NA NA NA NA
## REL2 NA NA NA NA
## REL3 NA NA NA NA
## REL4 NA NA NA NA
##
## $EDUC
## EDU1 EDU2 EDU3 EDU4 EDU5 EDU6 EDU7 EDU8
## EDU1 NA NA NA NA NA NA NA NA
## EDU2 NA NA NA NA NA NA NA NA
## EDU3 NA NA NA NA NA NA NA NA
## EDU4 NA NA NA NA NA NA NA NA
## EDU5 NA NA NA NA NA NA NA NA
## EDU6 NA NA NA NA NA NA NA NA
## EDU7 NA NA NA NA NA NA NA NA
## EDU8 NA NA NA NA NA NA NA NA
##
## $GOVE
## GOV1 GOV2 GOV3 GOV4 GOV5
## GOV1 NA NA NA NA NA
## GOV2 NA NA NA NA NA
## GOV3 NA NA NA NA NA
## GOV4 NA NA NA NA NA
## GOV5 NA NA NA NA NA
##
## $ENDO
## END1 END2 END3 END4 END5
## END1 NA NA NA NA NA
## END2 NA NA NA NA NA
## END3 NA NA NA NA NA
## END4 NA NA NA NA NA
## END5 NA NA NA NA NA
cfa.model4a <- ' BEINTEN =~ BI2 + BI3 + BI5 + BI6
RELA =~ REL1 + REL2 + REL3+ REL4
EDUC =~ EDU1 + EDU2 + EDU3 + EDU4 + EDU5 + EDU6 + EDU7 + EDU8
GOVE =~ GOV1 + GOV2 + GOV3 + GOV4 + GOV5
ENDO =~ END2 + END3 + END4 + END5
# Covariance
BI2 ~~ BI3
REL4 ~~ REL1 + REL3
EDU2 ~~ EDU1 + EDU3 + EDU6
EDU5 ~~ EDU6
EDU7 ~~ EDU8
GOV4 ~~ GOV5
END5 ~~ END4 '
cfa.d4a <- cfa(cfa.model4a, data = d1)
resid_d4a <- funCFA_resid (cfa.d4a, 2)
resid_d4a
## $BEINTEN
## BI2 BI3 BI5 BI6
## BI2 NA NA NA NA
## BI3 NA NA NA NA
## BI5 NA NA NA NA
## BI6 NA NA NA NA
##
## $RELA
## REL1 REL2 REL3 REL4
## REL1 NA NA NA NA
## REL2 NA NA NA NA
## REL3 NA NA NA NA
## REL4 NA NA NA NA
##
## $EDUC
## EDU1 EDU2 EDU3 EDU4 EDU5 EDU6 EDU7 EDU8
## EDU1 NA NA NA NA NA NA NA NA
## EDU2 NA NA NA NA NA NA NA NA
## EDU3 NA NA NA NA NA NA NA NA
## EDU4 NA NA NA NA NA NA NA NA
## EDU5 NA NA NA NA NA NA NA NA
## EDU6 NA NA NA NA NA NA NA NA
## EDU7 NA NA NA NA NA NA NA NA
## EDU8 NA NA NA NA NA NA NA NA
##
## $GOVE
## GOV1 GOV2 GOV3 GOV4 GOV5
## GOV1 NA NA NA NA NA
## GOV2 NA NA NA NA NA
## GOV3 NA NA NA NA NA
## GOV4 NA NA NA NA NA
## GOV5 NA NA NA NA NA
##
## $ENDO
## END2 END3 END4 END5
## END2 NA NA NA NA
## END3 NA NA NA NA
## END4 NA NA NA NA
## END5 NA NA NA NA
Trân trọng cảm ơn!