Phân tích hiệp phương sai – ANCOVA
Hướng dẫn thực hành phân tích hiệp phương sai với SPSS

Tóm tắt: Phân tích hiệp phương sai (ANCOVA) là phương pháp mở rộng của phân tích phương sai một chiều, cho phép kiểm soát thống kê các biến nhiễu trong thực hành kinh tế lượng. Bài viết hướng dẫn chi tiết cách thực hiện ANCOVA trong SPSS, từ thiết lập mô hình đến diễn giải kết quả và kiểm chứng các giả thuyết cần thiết cho phân tích chính xác.
Giới thiệu về phân tích hiệp phương sai
Nội dung chính
- Giới thiệu về phân tích hiệp phương sai
- Giả thiết của phân tích hiệp phương sai
- Dữ liệu mẫu và ví dụ thực tế
- Hướng dẫn thực hành chi tiết
- Đọc và diễn giải kết quả
- Kiểm chứng giả thuyết
- Lưu ý quan trọng trong thực hành
- Ứng dụng trong nghiên cứu kinh tế
- Tổng kết
- Phụ lục: Code syntax cho các phần mềm thống kê
- Tài liệu tham khảo
- Kiểm chứng sự khác nhau về giá trị trung bình giữa hai hay nhiều nhóm độc lập
- Kiểm soát thống kê đối với biến nhiễu (confounding variable)
- Tăng độ chính xác của phân tích bằng cách loại bỏ biến động không mong muốn
- Cải thiện sức mạnh thống kê của kiểm định
Ví dụ minh họa về ứng dụng ANCOVA
Để hiểu rõ hơn về ý nghĩa của phương pháp phân tích hiệp phương sai, chúng ta tìm hiểu thông qua ví dụ thực tế sau:
Tình huống nghiên cứu: Bạn muốn đánh giá hiệu quả của hai chương trình cai thuốc lá A và B. Bạn chọn ngẫu nhiên 150 người hút thuốc và phân chia thành ba nhóm:
- Nhóm kiểm soát: 50 người hút thuốc như thường lệ
- Nhóm điều trị A: 50 người tham gia chương trình điều trị A
- Nhóm điều trị B: 50 người tham gia chương trình điều trị B
Bạn đo lường số lượng thuốc lá được hút ở hai thời điểm: trước và sau khi thực hiện chương trình can thiệp.
Ví dụ thứ hai – Nghiên cứu về cholesterol:
Một nhà nghiên cứu quan tâm đến việc xác định chương trình tập luyện cường độ thấp hay cường độ cao hiệu quả hơn trong việc giảm nồng độ cholesterol ở nam giới tuổi trung niên. Cả hai chương trình đều được thiết kế trong 6 tuần với cùng lượng calo tiêu hao mỗi ngày.
Trong trường hợp này:
- Biến phụ thuộc: Nồng độ cholesterol sau can thiệp (After)
- Biến độc lập: Loại chương trình tập luyện (Group)
- Hiệp biến: Nồng độ cholesterol trước can thiệp (Before)
Xem thêm: Kiểm định tham số (Parametric tests)
Giả thiết của phân tích hiệp phương sai
Để sử dụng phân tích hiệp phương sai trong thực hành kinh tế lượng, dữ liệu phải thỏa mãn các giả thiết sau:
- Tính chất biến: Biến phụ thuộc và hiệp biến phải là biến liên tục (dạng khoảng, tỷ lệ)
- Biến độc lập: Là biến danh mục (từ 2 mức trở lên) với giá trị dạng số hoặc chuỗi
- Tính độc lập: Các quan sát trong mỗi nhóm và giữa các nhóm độc lập với nhau
- Không có điểm dị biệt: Dữ liệu không chứa các điểm dị biệt (outliers)
- Phân phối chuẩn: Biến phụ thuộc ở mỗi nhóm có phân phối chuẩn hoặc xấp xỉ chuẩn
- Đồng nhất phương sai: Có sự đồng nhất về phương sai của biến phụ thuộc (kiểm định Levene)
- Mối quan hệ tuyến tính: Hiệp biến có quan hệ tuyến tính với biến phụ thuộc ở các mức của biến độc lập
- Đồng nhất hệ số ước lượng: Không có sự tương tác giữa hiệp biến và các biến giải thích
Dữ liệu mẫu và ví dụ thực tế
Trong hướng dẫn này, chúng ta sử dụng bộ dữ liệu nghiên cứu về hiệu quả của các chương trình tập luyện trong việc giảm cholesterol.
Tải dữ liệu ANCOVAMô tả dữ liệu:
- After: Nồng độ cholesterol sau can thiệp (mg/dL) – biến phụ thuộc
- Group: Loại chương trình (1 = đối chứng, 2 = cường độ thấp, 3 = cường độ cao) – biến độc lập
- Before: Nồng độ cholesterol trước can thiệp (mg/dL) – hiệp biến
Hướng dẫn thực hành chi tiết
Trong SPSS, điều hướng đến menu phân tích hiệp phương sai:
Analyze → General Linear Model → Univariate…
Bước 2: Thiết lập biến phân tích
Cửa sổ Univariate mở ra, thực hiện các thao tác sau:
- Đưa biến After vào khung Dependent Variable:
- Đưa biến Group vào khung Fixed Factor(s):
- Đưa biến Before vào khung Covariate(s):
Bước 3: Cấu hình Contrasts
Click nút Contrasts để thiết lập so sánh giữa các nhóm:
- Chọn Simple từ menu dropdown tại mục Contrast:
- Chọn First tại mục Reference Category để sử dụng nhóm đối chứng làm tham chiếu
Click Continue để quay về cửa sổ chính.
Bước 4: Thiết lập tùy chọn hiển thị
Click nút Options… để cấu hình các tùy chọn bổ sung:
- Chuyển biến Group vào khung Display Means for:
- Chọn Compare main effects và chọn Bonferroni từ menu điều chỉnh
- Chọn Descriptive statistics, Parameter estimates và Homogeneity tests
Click Continue để quay về.
Bước 5: Thực thi phân tích
Click OK để bắt đầu phân tích hiệp phương sai.
Đọc và diễn giải kết quả
Thống kê mô tả
Bảng Descriptive Statistics tóm tắt nồng độ cholesterol sau can thiệp theo từng nhóm:
Kết quả cho thấy xu hướng giảm cholesterol: nhóm tập luyện cường độ cao có mức cholesterol thấp nhất, tiếp theo là nhóm cường độ thấp, và cao nhất là nhóm đối chứng.
So sánh ANOVA và ANCOVA
Để minh họa ưu điểm của ANCOVA, chúng ta so sánh kết quả với phân tích phương sai một chiều thông thường:
Kết quả ANOVA thông thường: Biến Group không có ý nghĩa thống kê (Sig = 0.158), cho thấy không có sự khác biệt về cholesterol giữa các nhóm.
Kết quả ANCOVA: Sau khi kiểm soát nồng độ cholesterol ban đầu, biến Group trở nên có ý nghĩa thống kê (Sig = 0.039 < 0.05). Điều này chứng tỏ tầm quan trọng của việc kiểm soát biến nhiễu trong thực hành kinh tế lượng.
Ước lượng tham số
Bảng Parameter Estimates cung cấp thông tin chi tiết về hệ số ước lượng:
Diễn giải:
- Nhóm tập luyện cường độ cao có cholesterol thấp hơn đáng kể so với nhóm đối chứng
- Có mối quan hệ tích cực giữa cholesterol ban đầu và cholesterol sau can thiệp
- Những người có cholesterol ban đầu cao thường vẫn có cholesterol cao sau can thiệp
So sánh từng cặp nhóm
Bảng Pairwise Comparisons hiển thị sự khác biệt cụ thể giữa các nhóm:
Ở mức ý nghĩa 5%, kết quả cho thấy nhóm đối chứng có cholesterol cao hơn có ý nghĩa so với nhóm tập luyện cường độ cao. Tuy nhiên, chưa có bằng chứng đủ mạnh về sự khác biệt giữa nhóm cường độ thấp và các nhóm khác.
Kiểm chứng giả thuyết
Kiểm tra đồng nhất phương sai
Kiểm định Levene với giả thuyết H0: phương sai của biến phụ thuộc bằng nhau giữa các nhóm.Với Sig = 0.105 > 0.05, chúng ta chấp nhận giả thuyết H0, nghĩa là có sự đồng nhất về phương sai.
Kiểm tra tính tuyến tính
Bảng Univariate Tests kiểm tra mối quan hệ tuyến tính giữa hiệp biến và biến phụ thuộc:
Với Sig = 0.039 < 0.05, có bằng chứng về mối quan hệ tuyến tính có ý nghĩa giữa hiệp biến và biến phụ thuộc.
Kiểm tra đồng nhất hệ số ước lượng
Để kiểm tra giả thuyết này, cần thiết lập nút Model… với các bước:
- Chọn Custom
- Thêm biến Group vào Model
- Thêm biến Before vào Model
- Thêm biến tương tác Group*Before vào Model
Kết quả sau khi chạy lại:
Group*Before
có ý nghĩa thống kê (Sig = 0.001), cho thấy giả thuyết về sự đồng nhất hệ số ước lượng bị vi phạm. Điều này có thể ảnh hưởng đến độ tin cậy của kết quả ANCOVA.Lưu ý quan trọng trong thực hành
- Lựa chọn hiệp biến: Hiệp biến nên có tương quan mạnh với biến phụ thuộc nhưng không tương quan với biến độc lập
- Số lượng hiệp biến: Không nên sử dụng quá nhiều hiệp biến so với kích thước mẫu
- Kiểm tra giả thuyết: Phải kiểm tra đầy đủ các giả thuyết trước khi diễn giải kết quả
- Diễn giải thận trọng: Khi vi phạm giả thuyết đồng nhất hệ số, cần cân nhắc sử dụng phương pháp khác
- Sử dụng hiệp biến không phù hợp hoặc có tương quan cao với biến độc lập
- Bỏ qua kiểm tra giả thuyết về tương tác
- Diễn giải nhân quả khi chỉ có bằng chứng tương quan
- Không kiểm tra tính tuyến tính của mối quan hệ hiệp biến-biến phụ thuộc
Ứng dụng trong nghiên cứu kinh tế
ANCOVA có nhiều ứng dụng quan trọng trong thực hành kinh tế lượng:
- Nghiên cứu chính sách: Đánh giá hiệu quả can thiệp trong khi kiểm soát các yếu tố nền
- Phân tích thị trường: So sánh hiệu quả marketing giữa các nhóm khách hàng
- Nghiên cứu giáo dục: Đánh giá phương pháp giảng dạy với kiểm soát năng lực ban đầu
- Y tế công cộng: So sánh hiệu quả điều trị với kiểm soát tình trạng sức khỏe ban đầu
Tổng kết
Phân tích hiệp phương sai là công cụ mạnh mẽ trong thực hành kinh tế lượng, cho phép nhà nghiên cứu kiểm soát các biến nhiễu để có được kết quả chính xác hơn. Thông qua hướng dẫn này, chúng ta đã nắm vững:
- Quy trình thực hiện ANCOVA trong SPSS từ A đến Z
- Cách thiết lập và diễn giải các thành phần của mô hình
- Phương pháp kiểm chứng các giả thuyết quan trọng
- Cách nhận biết và xử lý các vi phạm giả thuyết
- Ứng dụng thực tế trong nghiên cứu kinh tế và xã hội
Key Points:
- ANCOVA kết hợp ưu điểm của ANOVA và hồi quy tuyến tính
- Kiểm soát biến nhiễu giúp tăng độ chính xác và sức mạnh thống kê
- Giả thuyết đồng nhất hệ số là quan trọng nhất và thường bị bỏ qua
- Hiệp biến phù hợp phải tương quan với biến phụ thuộc nhưng không với biến độc lập
- Kết quả chỉ đáng tin cậy khi tất cả giả thuyết được thỏa mãn
Việc thành thạo ANCOVA sẽ giúp các nhà nghiên cứu có công cụ phân tích mạnh mẽ để đưa ra những kết luận chính xác và đáng tin cậy trong thực hành kinh tế lượng.
1. Khái niệm sự tương tác không bao giờ tồn tại giữa các biến giải thích và biến phụ thuộc hoặc giữa các mức giá trị của cùng một biến giải thích.
Phụ lục: Code syntax cho các phần mềm thống kê
SPSS Syntax
SPSS Syntax (.sps)
* Phân tích hiệp phương sai (ANCOVA) với SPSS
* Tác giả: Hướng dẫn thực hành kinh tế lượng
* Thống kê mô tả cơ bản
DESCRIPTIVES VARIABLES=After Before BY Group
/STATISTICS=MEAN STDDEV MIN MAX.
* Phân tích hiệp phương sai chính
UNIANOVA After BY Group WITH Before
/METHOD=SSTYPE(3)
/INTERCEPT=INCLUDE
/PRINT=DESCRIPTIVE PARAMETER HOMOGENEITY
/CRITERIA=ALPHA(.05)
/DESIGN=Group Before.
* So sánh từng cặp với điều chỉnh Bonferroni
UNIANOVA After BY Group WITH Before
/EMMEANS=TABLES(Group) WITH(Before=MEAN) COMPARE ADJ(BONFERRONI)
/PRINT=DESCRIPTIVE PARAMETER.
* Kiểm tra giả thuyết đồng nhất hệ số (tương tác)
UNIANOVA After BY Group WITH Before
/METHOD=SSTYPE(3)
/INTERCEPT=INCLUDE
/PRINT=PARAMETER
/CRITERIA=ALPHA(.05)
/DESIGN=Group Before Group*Before.
* Kiểm tra tính tuyến tính bằng đồ thị scatter
GRAPH
/SCATTERPLOT(BIVAR)=Before WITH After BY Group
/MISSING=LISTWISE.
* Kiểm tra phân phối chuẩn của residuals
UNIANOVA After BY Group WITH Before
/SAVE=RESID
/PRINT=DESCRIPTIVE.
EXAMINE VARIABLES=RES_1
/PLOT NPPLOT
/STATISTICS DESCRIPTIVES
/CINTERVAL 95
/MISSING LISTWISE
/NOTOTAL.
Stata Commands
Stata Commands (.do)
* Phân tích hiệp phương sai (ANCOVA) trong Stata
* Sử dụng General Linear Model
* Tải và mô tả dữ liệu
use "ancova_data.dta", clear
describe After Before Group
summarize After Before, detail
* Thống kê mô tả theo nhóm
bysort Group: summarize After Before
* Kiểm tra tương quan giữa các biến
corr After Before
bysort Group: corr After Before
* Thực hiện ANCOVA
anova After Group Before
* Mô hình tương đương với regress
regress After i.Group Before
* So sánh các nhóm (post-hoc)
margins i.Group, at(Before=`r(mean)')
marginsplot
* Kiểm tra giả thuyết đồng nhất hệ số (interaction)
regress After i.Group##c.Before
test 2.Group#c.Before 3.Group#c.Before
* Kiểm tra đồng nhất phương sai (Levene test)
robvar After, by(Group)
* Vẽ đồ thị scatter để kiểm tra tính tuyến tính
scatter After Before, by(Group) || lfit After Before, by(Group)
* Kiểm tra phân phối chuẩn của residuals
regress After i.Group Before
predict residuals, residuals
histogram residuals, normal
qnorm residuals
* Kiểm tra điểm dị biệt
regress After i.Group Before
predict leverage, leverage
predict cook, cooksd
list if cook > 4/e(N)
* Estimated marginal means
margins Group, at(Before=`r(mean)')
R Script
R Script (.R)
# Phân tích hiệp phương sai (ANCOVA) với R
# Sử dụng các gói car, emmeans và ggplot2
# Tải các thư viện cần thiết
library(car)
library(emmeans)
library(ggplot2)
library(dplyr)
library(broom)
# Đọc dữ liệu
data <- read.csv("ancova_data.csv")
data$Group <- as.factor(data$Group) str(data) # Thống kê mô tả summary(data) data %>%
group_by(Group) %>%
summarise(
n = n(),
mean_after = mean(After),
sd_after = sd(After),
mean_before = mean(Before),
sd_before = sd(Before)
)
# Vẽ đồ thị khám phá dữ liệu
ggplot(data, aes(x = Before, y = After, color = Group)) +
geom_point() +
geom_smooth(method = "lm") +
labs(title = "Mối quan hệ giữa Before và After theo Group")
# Boxplot để kiểm tra outliers
ggplot(data, aes(x = Group, y = After)) +
geom_boxplot() +
labs(title = "Phân phối After theo Group")
# Thực hiện ANCOVA
ancova_model <- aov(After ~ Group + Before, data = data)
summary(ancova_model)
# Mô hình tương đương với lm
lm_model <- lm(After ~ Group + Before, data = data)
summary(lm_model)
# Kiểm tra các giả thuyết
# 1. Đồng nhất phương sai (Levene test)
leveneTest(After ~ Group, data = data)
# 2. Phân phối chuẩn của residuals
shapiro.test(residuals(ancova_model))
# 3. Tính tuyến tính - vẽ đồ thị residuals vs fitted
plot(ancova_model, which = 1)
# 4. Q-Q plot cho phân phối chuẩn
plot(ancova_model, which = 2)
# 5. Kiểm tra điểm dị biệt
plot(ancova_model, which = 4)
# Kiểm tra giả thuyết đồng nhất hệ số (interaction)
interaction_model <- lm(After ~ Group * Before, data = data)
anova(lm_model, interaction_model)
# Estimated Marginal Means
emm <- emmeans(ancova_model, ~ Group)
print(emm)
# So sánh từng cặp với điều chỉnh Bonferroni
pairwise <- pairs(emm, adjust = "bonferroni")
print(pairwise)
# Vẽ đồ thị estimated marginal means
plot(emm) +
labs(title = "Estimated Marginal Means với 95% CI")
# Tính effect size (eta squared)
effectsize::eta_squared(ancova_model)
# Báo cáo kết quả chi tiết
anova_table <- anova(ancova_model)
print(anova_table)
# Confidence intervals cho các hệ số
confint(lm_model)
Python Script
Python Script (.py)
# Phân tích hiệp phương sai (ANCOVA) với Python
# Sử dụng scipy, statsmodels và seaborn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
from statsmodels.stats.multicomp import pairwise_tukeyhsd
from statsmodels.stats.diagnostic import het_breuschpagan
import statsmodels.api as sm
# Đọc dữ liệu
data = pd.read_csv('ancova_data.csv')
data['Group'] = data['Group'].astype('category')
print(data.info())
print(data.describe())
# Thống kê mô tả theo nhóm
desc_stats = data.groupby('Group').agg({
'After': ['count', 'mean', 'std'],
'Before': ['mean', 'std']
}).round(3)
print("Thống kê mô tả theo nhóm:")
print(desc_stats)
# Visualization
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# Scatter plot cho mối quan hệ Before vs After
sns.scatterplot(data=data, x='Before', y='After', hue='Group', ax=axes[0,0])
sns.regplot(data=data, x='Before', y='After', scatter=False, ax=axes[0,0])
axes[0,0].set_title('Mối quan hệ Before vs After')
# Box plot cho After theo Group
sns.boxplot(data=data, x='Group', y='After', ax=axes[0,1])
axes[0,1].set_title('Phân phối After theo Group')
# Histogram cho Before
sns.histplot(data=data, x='Before', hue='Group', ax=axes[1,0])
axes[1,0].set_title('Phân phối Before theo Group')
# Correlation matrix
corr_matrix = data[['After', 'Before']].corr()
sns.heatmap(corr_matrix, annot=True, ax=axes[1,1])
axes[1,1].set_title('Ma trận tương quan')
plt.tight_layout()
plt.show()
# Thực hiện ANCOVA
model = ols('After ~ C(Group) + Before', data=data).fit()
anova_table = anova_lm(model, typ=2)
print("\nKết quả ANCOVA:")
print(anova_table)
# Tóm tắt mô hình
print("\nTóm tắt mô hình:")
print(model.summary())
# Kiểm tra các giả thuyết
print("\n=== KIỂM TRA GIẢ THUYẾT ===")
# 1. Kiểm tra đồng nhất phương sai (Levene test)
from scipy.stats import levene
groups = [group['After'].values for name, group in data.groupby('Group')]
levene_stat, levene_p = levene(*groups)
print(f"Levene test: statistic = {levene_stat:.4f}, p-value = {levene_p:.4f}")
# 2. Kiểm tra phân phối chuẩn của residuals
residuals = model.resid
shapiro_stat, shapiro_p = stats.shapiro(residuals)
print(f"Shapiro-Wilk test: statistic = {shapiro_stat:.4f}, p-value = {shapiro_p:.4f}")
# 3. Vẽ đồ thị diagnostic
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# Residuals vs Fitted
fitted = model.fittedvalues
axes[0,0].scatter(fitted, residuals)
axes[0,0].axhline(y=0, color='red', linestyle='--')
axes[0,0].set_xlabel('Fitted values')
axes[0,0].set_ylabel('Residuals')
axes[0,0].set_title('Residuals vs Fitted')
# Q-Q plot
stats.probplot(residuals, dist="norm", plot=axes[0,1])
axes[0,1].set_title('Q-Q Plot')
# Histogram của residuals
axes[1,0].hist(residuals, bins=20, edgecolor='black')
axes[1,0].set_xlabel('Residuals')
axes[1,0].set_ylabel('Frequency')
axes[1,0].set_title('Histogram of Residuals')
# Scale-Location plot
axes[1,1].scatter(fitted, np.sqrt(np.abs(residuals)))
axes[1,1].set_xlabel('Fitted values')
axes[1,1].set_ylabel('√|Residuals|')
axes[1,1].set_title('Scale-Location Plot')
plt.tight_layout()
plt.show()
# 4. Kiểm tra tương tác (đồng nhất hệ số)
interaction_model = ols('After ~ C(Group) * Before', data=data).fit()
interaction_anova = anova_lm(interaction_model, typ=2)
print("\nKiểm tra tương tác:")
print(interaction_anova)
# So sánh mô hình có và không có tương tác
print("\nSo sánh mô hình:")
print(anova_lm(model, interaction_model))
# Estimated Marginal Means (thủ công)
mean_before = data['Before'].mean()
group_means = []
for group in data['Group'].cat.categories:
# Tính predicted value cho mỗi group tại mean của Before
temp_data = pd.DataFrame({
'Group': [group],
'Before': [mean_before]
})
temp_data['Group'] = temp_data['Group'].astype('category')
predicted = model.predict(temp_data)
group_means.append(predicted[0])
emm_df = pd.DataFrame({
'Group': data['Group'].cat.categories,
'EMM': group_means
})
print("\nEstimated Marginal Means:")
print(emm_df)
# Post-hoc comparisons (Bonferroni)
# Tính confidence intervals cho EMM
conf_int = model.conf_int()
print("\nConfidence Intervals:")
print(conf_int)
# Effect size (eta squared)
ss_effect = anova_table.loc['C(Group)', 'sum_sq']
ss_total = anova_table['sum_sq'].sum()
eta_squared = ss_effect / ss_total
print(f"\nEta squared cho Group: {eta_squared:.4f}")
# Tóm tắt kết quả
print("\n=== TÓM TẮT KẾT QUẢ ===")
print(f"F-statistic cho Group: {anova_table.loc['C(Group)', 'F']:.4f}")
print(f"p-value cho Group: {anova_table.loc['C(Group)', 'PR(>F)']:.4f}")
print(f"R-squared: {model.rsquared:.4f}")
print(f"Adjusted R-squared: {model.rsquared_adj:.4f}")
Tài liệu tham khảo
- Field, A. (2018). Discovering Statistics Using IBM SPSS Statistics (5th ed.). SAGE Publications.
- Hair, J. F., Black, W. C., Babin, B. J., & Anderson, R. E. (2019). Multivariate Data Analysis (8th ed.). Cengage Learning.
- IBM Corporation. (2023). IBM SPSS Statistics Documentation – General Linear Model. Retrieved from IBM Knowledge Center.
- Montgomery, D. C. (2017). Design and Analysis of Experiments (9th ed.). John Wiley & Sons.
- Tabachnick, B. G., & Fidell, L. S. (2019). Using Multivariate Statistics (7th ed.). Pearson.
- Rutherford, A. (2011). ANOVA and ANCOVA: A GLM Approach (2nd ed.). John Wiley & Sons.