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/

GIỚI THIỆU

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

Load các gói cần thiết và nhập liệu

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)

1. Lọc các biến quan sát (items)

d1 <-  d %>% select(-c("STT",  "FAM", "Formation",
                       "Work",  "Year",
                       "BI1",     "BIRecode", "BI4"))

2. Tìm hiểu hàm resid() hay residuals()

?resid

3. Giới thiệu hàm funCFA_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à:

Đị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 )
}

4. Áp dụng vào model CFA và giả sử cutoff = 2

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 ~~.

  1. Áp dụng hàm funCFA_resid() cho model cfa.model3 đã có điều chỉnh
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
  1. Áp dụng hàm funCFA_resid() cho model cfa.model4b đã có điều chỉnh
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!