Chương này tập trung vào sử dụng của phân tích nhân tố khẳng định CFA nhằm đánh giá các thang đo cũng như mô hình đo lường. Phân tích CFA một bước then chốt trong SEM nhằm đánh giá chất lượng và cấu trúc của các biến tiềm ẩn trước khi kiểm định mô hình cấu trúc. Thông qua kỹ thuật CFA, chương trình bày cách xác định mối quan hệ giữa các chỉ báo và nhân tố, kiểm tra độ tin cậy, giá trị hội tụ, giá trị phân biệt và xử lý sai số đo lường. Ngoài ra chương này cũng trình bày một số lựa chọn cho trình bày kết quả nghiên cứu một cách phù hợp.

Giới thiệu về CFA

Phân tích nhân tố khẳng định (Confirmatory Factor Analysis – CFA) là một kỹ thuật thống kê dùng để kiểm tra xem các chỉ báo (indicators/items) có thực sự đo lường đúng các biến hay khái niệm tiềm ẩn (constructs) hay không, đồng thời đánh giá xem các biến hay khái niệm tiềm ẩn đó có phân biệt rõ ràng với nhau hay không. Trong CFA, một biến tiềm ẩn thường được gọi là nhân tố (factor). Vì vậy, mỗi khi dùng từ factor, ta đang nói đến một khái niệm không quan sát được trực tiếp, nhưng ta cố gắng đo lường thông qua các chỉ báo. Để minh họa hãy xem xét mô hình CFA có sơ đồ sau:

Trong sơ đồ này, ba biến tiềm ẩn Adaptive Behavior (kí hiệu AB), Customer Delight (kí hiệu CD) và Word of Mouth (kí hiệu WM) được biểu diễn bằng ba hình tròn (hoặc hình oval), còn mỗi chỉ báo (indicator, hoặc item) được biểu diễn bằng hình vuông hoặc hình chữ nhật. Trong ví dụ này thì có nghĩa là, ví dụ, biến tiềm ẩn CD được đo lường gián tiếp thông qua ba items (indicators) là delight1, delight2 và delight3. Mối quan hệ từ biến tiềm ẩn và các chỉ báo được thể hiện bằng mũi tên một chiều được ước lượng bằng một hệ số thống kê gọi là tải nhân tố (factor loading), còn gọi là hệ số tải nhân tố trong một số tài liệu khác. Các tải nhân tố này đóng vai trò tương tự như hệ số hồi quy, và có thể được biểu diễn theo dạng chuẩn hóa hoặc chưa chuẩn hóa. Những chỉ báo “phản ánh” biến tiềm ẩn được gọi là chỉ báo phản xạ (reflective indicators). Hầu hết chỉ báo đều chứa một phần sai số đo lường, nghĩa là có một phần biến thiên không được giải thích bởi biến tiềm ẩn. Phần sai số này được gọi là phương sai độc nhất (unique variance). Sai số này có hai dạng:

  • Sai số ngẫu nhiên (random error): biến thiên không dự đoán được, xuất hiện do các yếu tố ngẫu nhiên và được xem như “nhiễu”.

  • Sai số hệ thống (systematic error): sai lệch xảy ra có tính quy luật, ví dụ việc làm khảo sát online so với giấy có thể khiến người trả lời phản ứng theo một khuynh hướng nhất định. Đây là dạng sai số mang tính “thiên lệch”.

Khi một biến tiềm ẩn chỉ có duy nhất một chỉ báo, mô hình buộc phải đặt giá trị trung bình và phương sai của sai số đo lường bằng 0, tức là giả định chỉ báo hoàn toàn không có sai số – một giả định thường không tồn tại trong thực tế.

Trong CFA, ta cũng cần xem xét phần hiệp phương sai chưa đo lường (unmeasured covariance) giữa các biến tiềm ẩn. Điều này được thực hiện bằng cách vẽ mũi tên hai chiều giữa tất cả các biến tiềm ẩn độc lập. Covariance thể hiện xu hướng biến thiên giữa hai biến tiềm ẩn. Cụ thể:

  • Covariance > 0: khi construct A tăng thì construct B cũng có xu hướng tăng.

  • Covariance < 0: khi A tăng thì B có xu hướng giảm.

  • Covariance ≈ 0: hai construct gần như độc lập, không có mối liên hệ tuyến tính đáng kể.

Trong mô hình CFA, các biến tiềm ẩn được xem là ngoại sinh.

Sự khác biệt giữa CFA và EFA

Phân tích nhân tố khám phá (Exploratory Factor Analysis EFA) là phân tích thống kê hữu ích khi ta cần rút gọn một tập hợp lớn các chỉ báo và muốn xem liệu những chỉ báo này có đang đo lường nhiều hơn một khái niệm hay không. EFA thường được dùng như bước đầu để xác định xem một chỉ báo có phù hợp với một biến tiềm ẩn nhất định hay không. Trong EFA, nhà nghiên cứu không biết trước chỉ báo thuộc về nhân tố nào; thay vào đó, EFA sẽ để cho mọi chỉ báo được tự do tải lên mọi nhân tố. Chính vì vậy, có thể xuất hiện hiện tượng cross-loading, tức là một chỉ báo có thể có hệ số tải lớn lên nhiều hơn một nhân tố. Điều này cho thấy chỉ báo đó có thể không đại diện tốt cho khái niệm mà ta mong muốn đo lường.

Ngược lại trong phân tích CFA, nhà nghiên cứu phải xác định trước chỉ báo nào đo lường nhân tố nào, và mỗi chỉ báo chỉ được phép tải lên đúng nhân tố đó. Một điểm khác biệt nữa là EFA thường được thực hiện dựa trên ma trận tương quan, điều này đôi khi gây khó khăn khi so sánh các tham số giữa nhiều mẫu khác nhau. CFA thì sử dụng ma trận hiệp phương sai, phù hợp hơn cho các phân tích so sánh giữa các nhóm. Ngoài ra, EFA còn sử dụng các kỹ thuật xoay nhân tố (rotation) nhằm cải thiện cấu trúc tải nhân tố hoặc giảm hiện tượng cross-loading, trong khi CFA không cần đến kĩ thuật rotation, bởi vì cấu trúc quan hệ giữa chỉ báo và nhân tố đã được xác định từ trước.

Ý nghĩa của hệ số tải

Trong CFA, hệ số tải nhân tố (Factor Loading) cho biết mức độ mà một biến tiềm ẩn tác động trực tiếp lên các chỉ báo của nó. Ví dụ, nếu hệ số tải chưa chuẩn hóa của Customer Delight → Delight1 bằng 2.0, thì điều đó có nghĩa là: khi điểm của Customer Delight tăng 1 đơn vị, thì chỉ báo Delight1 dự kiến tăng 2 đơn vị. Mặc dù các hệ số chưa chuẩn hóa có thể mang lại một số ý nghĩa về đơn vị đo, chúng hiếm khi được báo cáo trong kết quả CFA.

Thay vào đó, các nghiên cứu gần như luôn sử dụng hệ số tải chuẩn hóa (Standardized Loading), vì việc chuẩn hóa đưa mọi tải nhân tố về thang đo từ 0 đến 1, giúp so sánh trọng số giữa các chỉ báo trở nên dễ dàng hơn. Khi ta bình phương hệ số tải chuẩn hóa, ta nhận được phương sai được giải thích (R²) của từng chỉ báo. Thước đo thống kê này phản ánh mức độ mà biến tiềm ẩn giải thích được biến thiên trong chỉ báo. Ví dụ, nếu hệ số tải chuẩn hóa là 0.80, thì:

\[R^2 = \text{(Standardized Factor Loading)}^2 = (0.80)^2 = 0.64\] Nghĩa là biến tiềm ẩn giải thích được 64% phương sau của chỉ báo. Thông thường, một chỉ báo được cho là đạt yêu cầu nếu hệ số tải nhân tố chuẩn hóa lớn hơn 0.7 (hay \(R^2 \ge 0.50\)).

Biết hệ số tải nhân tố chuẩn hóa, ngoài tính toán được \(R^2\) chúng ta cũng còn có thể tính được sai số đo lường (measurement error) theo công thức sau:

\[\text{Measurement Error} = 1 - R^2\]

Từ công thức này có thể thấy một chỉ báo mà có sai số đo lường thấp thì phương sai giải thích (hay hệ số tải nhân tố chuẩn hóa) sẽ cao và ngược lại.

Các thống kê đánh giá độ phù hợp

Một trong những ưu điểm quan trọng của phân tích CFA (cung như SEM) là nó cho phép ta kiểm tra xem mô hình có khớp (fit) với dữ liệu hay không. Khi nói mô hình “fit”, ta muốn nói rằng ma trận hiệp phương sai ước lượng từ mô hình gần với ma trận hiệp phương sai của dữ liệu thực tế. Ngược lại, nếu mô hình “không fit”, điều đó cho thấy cấu trúc mô hình mà ta đặt ra không phù hợp với dữ liệu.

Kiểm định độ phù hợp mô hình (model fit) nhằm đánh giá mức độ mà toàn bộ cấu trúc mô hình phản ánh được dữ liệu, chứ không phải từng phần riêng lẻ. Vì vậy, một mô hình có chỉ số fit tốt không có nghĩa là mọi quan hệ hoặc biến trong mô hình đều tốt — nó chỉ cho biết tổng thể mô hình phù hợp với dữ liệu.

Tuy nhiên, khi đánh giá độ phù hợp, cần lưu ý rằng mô hình có ít chỉ báo cho mỗi nhân tố thường sẽ dễ đạt fit cao hơn mô hình phức tạp. Do đó, mô hình càng nhiều biến và quan hệ thì việc đạt được độ phù hợp cao càng khó khăn hơn.

Các thư viện của R sử dụng cho phân tích CFA (hay SEM) cung cấp rất nhiều chỉ số kiểm định độ phù hợp tới hơn 30 chỉ số thống kê khác nhau. Tuy nhiên chỉ có một số chỉ số quan trọng trong số này được lựa chọn để báo cáo và thảo luận:

Kiểm định Chi-Square (Model Chi-Square Test) thường được gọi là kiểm định “goodness of fit”, nhưng trên thực tế nó lại hoạt động như một thước đo đánh giá mức độ không phù hợp (badness of fit). Nghĩa là, nếu chi-square không có ý nghĩa thống kê, ta xem đó là dấu hiệu mô hình phù hợp với dữ liệu. Ngược lại, nếu chi-square có ý nghĩa (p < .05), điều này cho thấy ma trận hiệp phương sai ước lượng từ mô hình khác biệt đáng kể so với ma trận hiệp phương sai quan sát được, tức mô hình không fit.

Tuy nhiên, chi-square có nhiều hạn chế. Thứ nhất, càng gần mô hình just-identified (mô hình có đúng số lượng tham số cần thiết), chi-square càng dễ cho kết quả fit tốt — điều này gây bất lợi cho các mô hình phức tạp với nhiều tham số. Thứ hai, chi-square rất nhạy với kích thước mẫu: trong các mẫu lớn, chỉ cần khác biệt rất nhỏ giữa mô hình và dữ liệu cũng có thể làm cho chi-square trở nên có ý nghĩa thống kê và khiến mô hình bị đánh giá là không phù hợp.

Do vậy một thống kê khác có thể được sử dụng thay thế là chi-square tương đối (relative chi-square), được tính bằng:

\[\text{Relative Chi-square} = \frac{\chi^2}{df}\] Thống kê này có ưu điểm là loại bỏ phần nào ảnh hưởng của kích thước mẫu. Theo Kline (2011), giá trị dưới 3 được xem là chấp nhận được; một số tác giả cho rằng dưới 5 vẫn hợp lý (Schumacker & Lomax, 2004). Ngược lại, cũng có quan điểm cho rằng giá trị dưới 1 lại phản ánh tình trạng mô hình “overfitting”, tức mô hình có vẻ phù hợp quá mức so với dữ liệu, từ đó tạo ra nghi ngờ về chất lượng (Byrne, 1989).

Do Chi-Square Test có nhiều hạn chế, Collier (2020) nhấn mạnh rằng khi báo cáo model fit, luôn cần trình bày chi-square kèm theo degrees of freedom, vì đây vẫn là chỉ số cơ bản và quan trọng trong CFA (và cả SEM).

Chỉ số phù hợp so sánh (Comparative Fit Index – CFI). Chỉ số này so sánh ma trận hiệp phương sai được dự đoán bởi mô hình của bạn với ma trận hiệp phương sai quan sát được của null model. CFI có giá trị từ 0 đến 1. Giá trị CFI gần 1 cho thấy mức độ phù hợp tốt. Ngưỡng chấp nhận được cho CFI là > .90 (Bentler và Bonett, 1980) — điều này cho thấy 90% sự đồng biến trong dữ liệu có thể được mô hình tái tạo. CFI không bị ảnh hưởng bởi kích thước mẫu và là một chỉ số phù hợp được khuyến nghị báo cáo.

Chỉ số phù hợp tăng cường (Incremental Fit Index – IFI). IFI nên đạt .90 hoặc cao hơn để được xem là phù hợp. IFI tương đối độc lập với kích thước mẫu và là một chỉ số thường được báo cáo.

Chỉ số phù hợp chuẩn hóa (Normed Fit Index – NFI). Mức phù hợp chấp nhận được căn cứ vào NFI là trên .90. Lưu ý rằng NFI có thể đánh giá thấp mức độ phù hợp khi mẫu nhỏ và không phản ánh tính tinh gọn của mô hình (mô hình càng có nhiều tham số thì NFI càng lớn).

Chỉ số Tucker Lewis (Tucker Lewis Index – TLI). Chỉ số này còn được gọi là Non-Normed Fit Index. Tương tự các chỉ số khác, giá trị trên .90 được xem là mức độ phù hợp chấp nhận được.

Chỉ số phù hợp tương đối (Relative Fit Index – RFI). RFI gần 1 cho thấy mức độ phù hợp hoàn hảo. Mức phù hợp chấp nhận được là .90 trở lên.

Root Mean Square Error of Approximation (RMSEA). Đây là một kiểm định mức độ không phù hợp (badness of fit) và được tính theo công thức sau:

\[\text{RMSEA} = \sqrt{ \frac{\chi^2 - df}{df (N - 1)} }\]

Thống kê này nếu có giá trị gần 0 cho thấy mức độ phù hợp tốt nhất. Mô hình được xem là phù hợp tốt nếu RMSEA dưới .05. Mức phù hợp được xem là chấp nhận được nếu RMSEA bằng .08 hoặc thấp hơn — các giá trị trên .10 cho thấy mức độ phù hợp kém (MacCallum et al., 1996). Các thư viện phân tích CFA/AMOS của R cũng sẽ cung cấp khoảng tin cậy 90% cho giá trị RMSEA. Thay vì chỉ xem xét một ước lượng duy nhất, việc xem xét khoảng tin cậy sẽ cung cấp thêm thông tin về mức độ chấp nhận được của mô hình đối với dữ liệu.

Khi giá trị RMSEA bằng .06, mô hình ban đầu có thể được xem là đạt mức độ phù hợp chấp nhận được. Tuy nhiên, nếu khi xem xét khoảng tin cậy cho thấy cận dưới là .04 và cận trên là .16 thì điều này sẽ chỉ ra rằng mức độ phù hợp thực tế không tích cực như đánh giá ban đầu nếu dựa trên một giá trị RMSEA đơn lẻ. Khoảng tin cậy rộng như vậy phản ánh khả năng ước lượng RMSEA không phải là thước đo chính xác về mức độ phù hợp mô hình. Ngược lại, nếu khoảng tin cậy hẹp xung quanh ước lượng ban đầu, có thể kết luận rằng giá trị RMSEA thể hiện mức độ chính xác cao hơn trong việc đánh giá sự phù hợp của mô hình.

Standardized Root Mean Square Residual (SRMR). Chỉ số này phản ánh sai khác trung bình giữa các hiệp phương sai được dự đoán và các hiệp phương sai quan sát trong mô hình, dựa trên các phần dư đã được chuẩn hóa. Tương tự như RMSEA, SRMR là một kiểm định nhằm đánh giá mức độ không phù hợp, trong đó giá trị càng lớn thể hiện mức độ phù hợp càng kém. Giá trị SRMR bằng .05 trở xuống được xem là mức phù hợp tốt, và giá trị từ .05 đến .09 được xem là phù hợp ở mức chấp nhận được (MacCallum et al., 1996).

Goodness-of-Fit Index và Adjusted Goodness-of-Fit Index (GFI/AGFI). Khác với các chỉ số khác sử dụng để đánh giá mức độ phù hợp của mô hình với dữ liệu, hai thống kê GFI và AGFI được thiết kế như một lựa chọn nhằm xem xét tỷ lệ phương sai được mô hình ước lượng thu giữ trong ma trận hiệp phương sai. Mặc dù từng phổ biến trong giai đoạn đầu, các chỉ số này sau đó được xác định là kém ổn định do quá nhạy với kích thước mẫu (Sharma et al., 2005). Đồng thời, chúng cũng không nhạy bén trong việc phát hiện các mô hình bị chỉ định sai. Do đó, quan điểm chung ngày càng được chấp nhận phổ biến là nên tránh sử dụng các chỉ số này trong đánh giá mô hình (Hu & Bentler, 1999).

Những tranh luận về vấn đề đánh giá độ phù hợp

Đến tận thời điểm hiện tại, vẫn không có sự đồng thuận về các ngưỡng (cutoff criteria) nên được chọn cho các chỉ số để đánh giá độ phù hợp của mô hình. Nghiên cứu được trích dẫn rộng rãi nhất là Bentler và Bonett (1980) khuyến nghị rằng các chỉ số phù hợp mô hình như CFI, TLI, NFI và IFI cần đạt trên 0.90. Khuyến nghị nhanh chóng trở nên phổ biến, mặc dù các học giả như Hu và Bentler (1999) cho rằng ngưỡng .90 là quá “thoáng” và rằng các chỉ số cần đạt trên .95 để được xem là mô hình phù hợp tốt. Sau đó, Marsh et al. (2004) lập luận chống lại tiêu chí nghiêm ngặt của Hu và Bentler, đồng thời đề xuất sử dụng nhiều chỉ số khác nhau tùy theo kích thước mẫu, bộ ước lượng hoặc phân phối dữ liệu. Do vậy, không tồn tại một quy tắc vàng duy nhất áp dụng chung cho mọi trường hợp liên quan đến đánh giá độ phù hợp mô hình. Các tiêu chí được nêu trong phần này dựa trên các nghiên cứu hiện có và cung cấp định hướng về mức độ nào được xem là chấp nhận được trong vấn đề đánh giá độ phù hợp của mô hình.

Mặt khác, ngay cả khi mô hình có một số chỉ số thống kê đánh giá độ phù hợp vượt qua ngưỡng .90 thì sự thận trọng vẫn cần thiết khi tuyên bố rằng mô hình đó là “tốt”. Kline (2011) lưu ý rằng dù một mô hình được xem là có mức độ phù hợp chấp nhận được không đồng nghĩa rằng mô hình đó là đúng. Một mô hình “fit tốt” vẫn có thể giải thích kém các mối quan hệ trong mô hình.

Cần nhấn mạnh rằng các chỉ số phù hợp mô hình vẫn là một bước quan trọng trong phân tích CFA. Nếu ma trận hiệp phương sai quan sát và ma trận hiệp phương sai ước lượng đủ tương đồng, điều này cung cấp bằng chứng sơ bộ rằng mô hình được chỉ định phù hợp. Tuy nhiên, đây chỉ nên là bước đánh giá ban đầu, đi kèm với việc xem xét các tham số và quan hệ cần được ước lượng trong mô hình.

Phân tích CFA

Chúng ta trở lại với mô hình CFA có diagram ở phần trên bằng ngôn ngữ R. Trước hết cần cài đặt một số gói cần thiết cho phân tích CFA/SEM bằng cách cài đặt như sau:

library(lavaan) # Gói lavaan cho phân tích CFA, EFA, SEM. 
library(lavaanPlot) # Để vẽ các sơ đồ CFA, SEM nếu cần. 
library(haven) # Sử dụng để load dữ liệu định dạng .sav của phần mềm SPSS-AMOS. 
library(dplyr) # Dùng cho xử lí dữ liệu. 
library(readr) # Package cho đọc file csv. 

Sau đó chúng ta load bộ dữ liệu CustomerDelightData_Student.sav (download bộ dữ liệu này tại đây) vào R như sau:

rm(list = ls()) # Làm sạch môi trường R trước khi thực hiện phân tích. 
read_sav("E:\\Project_PLS_SEM\\CustomerDelightData_Student.sav") -> customerDat

Kế tiếp chúng ta định nghĩa rõ mô hình CFA:

# CFA model specification: 

cfa_model <- "AdaptiveBehavior =~ adapt1 + adapt2 + adapt3 + adapt4 + adapt5
              CustomerDelight =~ delight1 + delight2 + delight3
              WordOfMouth =~ WOM1 + WOM2 + WOM3"

# Chuẩn bị dữ liệu cho CFA modeling (bước này có thể không cần thiết
# nếu không cần đến tính toán điểm nhân tố factor score): 

likert_items <- c("adapt1","adapt2","adapt3","adapt4","adapt5",
                  "delight1","delight2","delight3",
                  "WOM1","WOM2","WOM3")

customerDat %>% 
  select(likert_items) %>% 
  mutate_all(as.numeric) -> forCFA

Sử dụng hàm lavan::cfa() của gói lavan để thực hiện phân tích CFA theo cú pháp:

# Thực hiện phân tích CFA: 
fit_cfa <- cfa(model = cfa_model, data = forCFA)

Xem toàn bộ kết quả:

# Kết quả CFA: 
summary(fit_cfa, 
        fit.measures = TRUE, 
        standardized = TRUE,
        rsquare = TRUE) -> resultsCFA

resultsCFA
## lavaan 0.6-19 ended normally after 41 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        25
## 
##   Number of observations                           500
## 
## Model Test User Model:
##                                                       
##   Test statistic                                61.041
##   Degrees of freedom                                41
##   P-value (Chi-square)                           0.023
## 
## Model Test Baseline Model:
## 
##   Test statistic                              4760.823
##   Degrees of freedom                                55
##   P-value                                        0.000
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.996
##   Tucker-Lewis Index (TLI)                       0.994
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -5794.488
##   Loglikelihood unrestricted model (H1)      -5763.968
##                                                       
##   Akaike (AIC)                               11638.977
##   Bayesian (BIC)                             11744.342
##   Sample-size adjusted Bayesian (SABIC)      11664.990
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.031
##   90 Percent confidence interval - lower         0.012
##   90 Percent confidence interval - upper         0.047
##   P-value H_0: RMSEA <= 0.050                    0.978
##   P-value H_0: RMSEA >= 0.080                    0.000
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.023
## 
## 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
##   AdaptiveBehavior =~                                                      
##     adapt1               1.000                               0.921    0.896
##     adapt2               0.976    0.030   32.773    0.000    0.899    0.921
##     adapt3               0.998    0.035   28.842    0.000    0.920    0.873
##     adapt4               0.995    0.034   29.028    0.000    0.917    0.875
##     adapt5               0.929    0.032   28.607    0.000    0.856    0.870
##   CustomerDelight =~                                                       
##     delight1             1.000                               0.700    0.857
##     delight2             1.221    0.046   26.568    0.000    0.855    0.916
##     delight3             1.193    0.050   23.673    0.000    0.836    0.843
##   WordOfMouth =~                                                           
##     WOM1                 1.000                               1.108    0.890
##     WOM2                 1.075    0.042   25.769    0.000    1.191    0.889
##     WOM3                 1.061    0.046   23.097    0.000    1.176    0.819
## 
## Covariances:
##                       Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   AdaptiveBehavior ~~                                                      
##     CustomerDelght       0.446    0.040   11.249    0.000    0.691    0.691
##     WordOfMouth          0.381    0.053    7.154    0.000    0.373    0.373
##   CustomerDelight ~~                                                       
##     WordOfMouth          0.379    0.044    8.688    0.000    0.488    0.488
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .adapt1            0.208    0.017   12.496    0.000    0.208    0.197
##    .adapt2            0.145    0.013   11.285    0.000    0.145    0.152
##    .adapt3            0.264    0.020   13.224    0.000    0.264    0.238
##    .adapt4            0.256    0.019   13.160    0.000    0.256    0.234
##    .adapt5            0.236    0.018   13.302    0.000    0.236    0.244
##    .delight1          0.178    0.015   11.579    0.000    0.178    0.266
##    .delight2          0.141    0.017    8.133    0.000    0.141    0.161
##    .delight3          0.284    0.023   12.105    0.000    0.284    0.289
##    .WOM1              0.321    0.036    8.916    0.000    0.321    0.207
##    .WOM2              0.375    0.042    8.979    0.000    0.375    0.209
##    .WOM3              0.681    0.055   12.340    0.000    0.681    0.330
##     AdaptiveBehavr    0.849    0.066   12.798    0.000    1.000    1.000
##     CustomerDelght    0.491    0.042   11.665    0.000    1.000    1.000
##     WordOfMouth       1.228    0.100   12.234    0.000    1.000    1.000
## 
## R-Square:
##                    Estimate
##     adapt1            0.803
##     adapt2            0.848
##     adapt3            0.762
##     adapt4            0.766
##     adapt5            0.756
##     delight1          0.734
##     delight2          0.839
##     delight3          0.711
##     WOM1              0.793
##     WOM2              0.791
##     WOM3              0.670

Rất nhiều outputs được trình bày. Tuy nhiên chúng ta chỉ sử dụng một số kết quả quan trọng khi trình bày báo cáo mà thôi. Dưới đây là R codes để khai thác những kết quả chính.

Các thống kê đánh giá độ phù hợp. Dưới đây là R codes trích xuất các thống kê đánh giá độ phù hợp của mô hình CFA:

# Danh sách các thước đo thống kê đánh giá độ phù hợp của mô hình: 
fitStatistics <- c("chisq", "df", "cfi", "tli", "nfi", "ifi", "rfi", "rmsea", "srmr")
fitINDEX <- fitMeasures(object = fit_cfa, fit.measures = fitStatistics)

# In ra kết quả dưới dạng bảng cho dễ đọc: 
data.frame(
  FitIndex = fitStatistics, 
  Value = round(fitINDEX, 3)
)
##       FitIndex  Value
## chisq    chisq 61.041
## df          df 41.000
## cfi        cfi  0.996
## tli        tli  0.994
## nfi        nfi  0.987
## ifi        ifi  0.996
## rfi        rfi  0.983
## rmsea    rmsea  0.031
## srmr      srmr  0.023

Các thống kê đánh giá độ phù hợp của mô hình có thấy mức độ phù hợp rất cao với dữ liệu. Cụ thể, chỉ số Chi-square/df đạt 1.49, thấp hơn đáng kể so với các ngưỡng đề xuất là từ 2 đến 3—cho thấy mô hình không chịu ảnh hưởng lớn từ sai số chỉ định và phản ánh tốt cấu trúc lý thuyết đặt ra. Mặc dù kiểm định Chi-square thường nhạy với kích thước mẫu, tỷ lệ chi-square/df thấp củng cố thêm nhận định về tính phù hợp của mô hình.

Nhóm các chỉ số phù hợp so sánh (comparative fit indices) như CFI, TLI, NFI, IFI và RFI đều đạt giá trị rất cao, dao động từ 0.98 đến 0.996. Các giá trị này vượt xa các tiêu chuẩn khắt khe được đề xuất bởi Hu và Bentler (1999), vốn khuyến nghị ngưỡng > .95 nhằm đảm bảo mức độ phù hợp mạnh. Điều này cho thấy mô hình tái tạo được phần lớn cấu trúc đồng biến trong dữ liệu và phản ánh tốt mối quan hệ giả định giữa các biến tiềm ẩn và các chỉ báo.

Các chỉ số đo lường lỗi của mô hình, đặc biệt là RMSEA và SRMR, cũng củng cố đánh giá tích cực về mô hình. RMSEA đạt 0.031, thấp hơn đáng kể so với mức 0.05 thường được xem là phù hợp tốt, trong khi SRMR đạt 0.022, chứng tỏ sai số trung bình giữa ma trận dự đoán và quan sát là rất nhỏ. Sự kết hợp giữa RMSEA thấp và SRMR thấp cho thấy mô hình không chỉ khớp với dữ liệu tổng thể mà còn tái hiện chính xác các mối quan hệ vi mô giữa các biến quan sát.

Đánh giá độ hội tụ và phù hợp của thang đo. Sau khi bước đầu xác định rằng mỗi chỉ báo đều tải đúng lên cấu trúc (construct) mà nó đại diện căn cứ vào hệ số tải nhân tố, và mô hình của bạn đạt mức độ phù hợp chấp nhận được với dữ liệu, bước tiếp theo là đánh giá độ giá trị hội tụ (convergent validity) và độ giá trị phân biệt (discriminant validity) của thang đo. Tóm lược một cách đơn giản: độ giá trị hội tụ xem các chỉ báo có thực sự cùng hướng về đo lường một khái niệm duy nhất hay không; trong khi đó độ giá trị phân biệt xem một cấu trúc có khác biệt rõ ràng và không bị trộn lẫn với các cấu trúc khác hay không.

Phân tích CFA là nền tảng quan trọng để kiểm tra giá trị đo lường, nhưng chỉ dựa vào kết quả CFA thì chưa đủ để kết luận gì về hai tiêu chuẩn hội tụ và phân biệt của thang đo. Vì vậy, khuôn khổ đánh giá do Fornell và Larcker (1981) đề xuất được xem là phương pháp rất hiệu quả và hiện vẫn là cách tiếp cận phổ biến trong nghiên cứu.

Để đánh giá độ giá trị hội tụ, Fornell và Larcker cho rằng cần tính Phương sai trích trung bình – Average Variance Extracted (AVE) cho từng cấu trúc. Cách tính AVE như sau: lấy giá trị \(R^2\) của từng chỉ báo trong cùng một cấu trúc (hay thang đo), cộng tất cả lại, rồi chia cho số lượng chỉ báo. Một cấu trúc (hay thang đo) được xem là đạt độ giá trị hội tụ khi AVE lớn hơn 0.50, nghĩa là hơn một nửa phương sai của chỉ báo được giải thích bởi cấu trúc tiềm ẩn mà nó đo lường. Dưới đây là R codes tính toán AVE cho nhân tố, ví dụ, Positive Word of Mouth:

(0.793 + 0.791 + 0.670) / 3
## [1] 0.7513333

Lặp lại cách tính tương tự cho hai nhân tố còn lại. Một cách khác là tính toán đồng thời AVE cho cả ba nhân tố thành vì lần lượt tính thủ công như sau:

# Extract hệ số tải nhân tố cho các items từ kết quả phân tích CFA đã có: 
resultsCFA$pe %>% filter(op == "r2") -> loadingsFactor

# Load thư viện stringr cho xử lí text: 
library(stringr)

# Tạo cột biến factor: 

loadingsFactor %>% 
  mutate(factorName = case_when(str_detect(lhs, "adapt") ~ "AdaptiveBehavior", 
                                str_detect(lhs, "deli") ~ "CustomerDelight", 
                                TRUE ~ "WordOfMouth")) -> loadingsFactor

# Tính các AVE cho cả ba nhan tố: 

loadingsFactor %>% 
  group_by(factorName) %>% 
  summarise(AVE = mean(est)) -> aveTable

# Join với dữ liệu hệ số tải: 

loadingsFactor %>% left_join(aveTable) -> loadingsFactor

# Kết quả tính toán: 

loadingsFactor %>% 
  select(lhs, factorName, est, AVE) %>% 
  mutate_if(is.numeric, function(x) {round(x, 3)})
##         lhs       factorName   est   AVE
## 1    adapt1 AdaptiveBehavior 0.803 0.787
## 2    adapt2 AdaptiveBehavior 0.848 0.787
## 3    adapt3 AdaptiveBehavior 0.762 0.787
## 4    adapt4 AdaptiveBehavior 0.766 0.787
## 5    adapt5 AdaptiveBehavior 0.756 0.787
## 6  delight1  CustomerDelight 0.734 0.761
## 7  delight2  CustomerDelight 0.839 0.761
## 8  delight3  CustomerDelight 0.711 0.761
## 9      WOM1      WordOfMouth 0.793 0.751
## 10     WOM2      WordOfMouth 0.791 0.751
## 11     WOM3      WordOfMouth 0.670 0.751

Kết quả này khi trình bày trong nghiên cứu cho mục đích đăng bài hay xuất bản nên được trình bày them template sau:

Phương sai chung (shared variance) giữ vai trò then chốt trong đánh giá độ giá trị phân biệt, vì nó cho biết mức độ hai cấu trúc cùng giải thích một phần phương sai chung. Khi phương sai chia sẻ thấp hơn AVE của từng cấu trúc, điều đó cho thấy các cấu trúc là tách biệt, giúp mô hình đo lường đạt giá trị hợp lệ. Để xác định mức độ phương sai chung giữa các cấu trúc hay thang đo, ta lấy bình phương các hệ số tương quan giữa chúng rồi so sánh các giá trị này với AVE của từng cấu trúc - một việc gọi là phân tích tương quan giữa các thang đo (correlation analysis). Căn cứ để tính toán là điểm nhân tố (factor score) của từng nhân tố/thang đo. Việc so sánh này giúp đánh giá độ giá trị phân biệt (discriminant validity). Dưới đây là R codes phân tích tương quan dựa trên điểm nhân tố (factor score):

# Extract ra điểm nhân tố cho từng thang đo: 
fscores <- lavPredict(fit_cfa, method = "Bartlett") %>% as.data.frame()

# Thực hiện correlation analysis: 
fscores %>% cor()
##                  AdaptiveBehavior CustomerDelight WordOfMouth
## AdaptiveBehavior        1.0000000       0.6434032   0.3462717
## CustomerDelight         0.6434032       1.0000000   0.4437443
## WordOfMouth             0.3462717       0.4437443   1.0000000

Kết quả này cho thấy tương quan giữa Adaptive Behavior và Customer Delight là 0.643; do đó, phương sai chung giữa hai cấu trúc này là \(0.643^2 = 0.413\). Giá trị này thấp hơn nhiều so với AVE của Adaptive Behavior (0.787) và Customer Delight (0.761). Điều này cho thấy hai cấu trúc (hay thang đo) này thực sự tách biệt. Tương tự, tương quan giữa Adaptive Behavior và Positive Word of Mouth là 0.34, dẫn tới phương sai là 0.119. Giá trị 0.119 này cũng thấp hơn AVE của cả hai cấu trúc, vì vậy không có dấu hiệu vi phạm giá trị phân biệt.

Cần nhắc lại rằng giữa Covariance và tương quan (Correlation) có liên hệ với nhau theo công thức sau:

\[\rho_{XY} =\frac{\operatorname{Cov}(X,Y)}{\sigma_X \, \sigma_Y}\] Điều này hàm ý rằng vì đã biết điểm nhân tố thì ta cũng biết được độ lệch chuẩn giữa, ví dụ hai nhân tố X và Y do vậy mà có thể tính được Covariance như sau:

\[\operatorname{Cov}(X,Y) = \rho_{XY} \, \sigma_X \, \sigma_Y\]

Để tính Covariance theo công thức trên, ta cần tính tiếp độ lệch chuẩn:

fscores %>% 
  mutate_all(sd) %>% 
  slice(1)
##   AdaptiveBehavior CustomerDelight WordOfMouth
## 1        0.9459691        0.733983    1.165429

Lúc này Covariance giữa AdaptiveBehavior và CustomerDelght sẽ là:

0.643 * 0.946 * 0.734
## [1] 0.4464761

Giá trị 0.446 này thực ra đã được chỉ ra trong output của mô hình CFA. Giá trị này cũng có thể được tính thực tiếp từ các điểm nhân tố như sau:

cov(fscores)
##                  AdaptiveBehavior CustomerDelight WordOfMouth
## AdaptiveBehavior        0.8948576       0.4467311   0.3817507
## CustomerDelight         0.4467311       0.5387311   0.3795812
## WordOfMouth             0.3817507       0.3795812   1.3582252

Trong thực hành, bạn cần kiểm tra toàn bộ các cặp tương quan (hoặc Covariance) và so sánh từng giá trị phương sai chia sẻ với AVE tương ứng. Nếu tất cả các giá trị AVE đều lớn hơn phương sai chung giữa các cấu trúc, điều đó cho thấy thang đo đạt độ giá trị phân biệt. Trong ví dụ này, tất cả các AVE đều lớn hơn phương sai chung, nên mô hình có bằng chứng tốt về độ giá trị phân biệt. Kết quả về phân tích tương quan khi trình bày trong nghiên cứu cho mục đích đăng bài hay xuất bản nên được trình bày như sau:

Hệ số tin cậy tổng hợp CR. Trước đây chúng ta thường đánh giá độ tin cậy của các chỉ báo bằng Cronbach’s alpha, nhưng chỉ đố đánh giá này có một số nhược điểm. Yang và Green (2011) cho rằng Cronbach’s alpha vừa có thể thổi phồng vừa có thể đánh giá thấp độ tin cậy, và không nên hiểu nó như một hệ số phản ánh tính nhất quán nội tại theo nghĩa chặt chẽ, mà chỉ là một ước lượng dựa trên mức độ tương quan giữa các biến quan sát.

Do những hạn chế đó, hệ số tin cậy tổng hợp CR (Composite Reliability) được sử dụng thay thế cho Cronbach’s alpha. CR được tính dựa trên hệ số tải nhân tố chuẩn hóa của các biến quan sát trong mô hình CFA. Để tính CR, bạn cần hệ số tải chuẩn hóa của các chỉ báo trong cùng một cấu trúc. Công thức tổng quát là:

\[CR = \frac{\left(\sum_{i=1}^{k} \lambda_i \right)^2}{\left(\sum_{i=1}^{k} \lambda_i \right)^2 + \sum_{i=1}^{k} \theta_i}\]

Công thức này cho thấy CR phản ánh mức độ các chỉ báo cùng đóng góp vào việc đo lường cấu trúc tiềm ẩn, đồng thời tính đến lượng sai số đo lường còn lại. Đây là lý do CR được đánh giá là thước đo độ tin cậy phù hợp hơn Cronbach’s alpha trong các mô hình SEM hiện đại. Dưới đây là R codes để tính toán CR cho ba thang đo:

# Extract hệ số tải nhân tố chuẩn hóa từ kết quả phân tích CFA: 
resultsCFA$pe -> stdLoadings

stdLoadings %>% 
  select(lhs, rhs, std.all, op) %>% 
  filter(rhs %in% likert_items, op == "=~") -> stdLoadings

# Tính toán các CR theo công thức trên: 

stdLoadings %>% 
  group_by(lhs) %>% 
  summarise(sum_loading = sum(std.all),
            sum_error   = sum(1 - std.all^2),
            CR = (sum_loading^2) / (sum_loading^2 + sum_error))
## # A tibble: 3 × 4
##   lhs              sum_loading sum_error    CR
##   <chr>                  <dbl>     <dbl> <dbl>
## 1 AdaptiveBehavior        4.43     1.06  0.949
## 2 CustomerDelight         2.62     0.717 0.905
## 3 WordOfMouth             2.60     0.746 0.900

Trình bày kết quả của CFA

(Đang viết)

Lưu ý về về loại bỏ items có hệ số tải thấp

(Đang viết)

Giải thích cho hệ số tải lớn hơn 1

(Đang viết)

Measurement Model Invariance Across Groups

(Đang viết)

Tài liệu tham khảo

Bentler, P. M., & Bonett, D. G. (1980). Significance tests and goodness of fit in the analysis of covariance structures. Psychological Bulletin, 88(3), 588–606. https://doi.org/10.1037/0033-2909.88.3.588

Collier, J. E. (2020). Applied structural equation modeling using AMOS: Basic to advanced techniques. Routledge.

Byrne, B. M. (1989). A primer of LISREL: Basic applications and programming for confirmatory factor analytic models. Springer-Verlag.

Kline, R. B. (2011). Principles and practice of structural equation modeling (3rd ed.). Guilford Press.

Hu, L. T., & Bentler, P. M. (1999). Cutoff criteria for fit indexes in covariance structure analysis: Conventional criteria versus new alternatives. Structural Equation Modeling, 6(1), 1–55. https://doi.org/10.1080/10705519909540118

MacCallum, R. C., Browne, M. W., & Sugawara, H. M. (1996). Power analysis and determination of sample size for covariance structure modeling. Psychological Methods, 1(2), 130–149. https://doi.org/10.1037/1082-989X.1.2.130

Schumacker, R. E., & Lomax, R. G. (2004). A beginner’s guide to structural equation modeling (2nd ed.). Lawrence Erlbaum Associates.

Sharma, S., Mukherjee, S., Kumar, A., & Dillon, W. R. (2005). A simulation study to investigate the use of fit indices in structural equation modeling. Journal of Business Research, 58(7), 935–943. https://doi.org/10.1016/j.jbusres.2003.10.007

Fornell, C., & Larcker, D. F. (1981). Evaluating structural equation models with unobservable variables and measurement error. Journal of Marketing Research, 18(1), 39–50.

Yang, Y., & Green, S. B. (2011). Coefficient alpha: A reliability coefficient for the 21st century? Journal of Psychoeducational Assessment, 29(4), 377–392.

Hair, J. F., Black, W. C., Babin, B. J., & Anderson, R. E. (2009). Multivariate data analysis (7th ed.). Pearson Prentice Hall.