KTL cơ bảnPhân tích hồi quy

Hồi quy tuyến tính đa biến

Hướng dẫn thực hành hồi quy tuyến tính đa biến với SPSS

Tóm tắt: Hồi quy tuyến tính đa biến là dạng mở rộng của hồi quy giản đơn, được ứng dụng rộng rãi trong thực hành kinh tế lượng để dự báo và phân tích mối quan hệ giữa nhiều biến. Bài viết hướng dẫn chi tiết cách thực hiện hồi quy đa biến trong SPSS, từ kiểm tra các giả định cần thiết đến diễn giải kết quả, đặc biệt tập trung vào ứng dụng thực tế trong nghiên cứu kinh tế và xã hội.

Giới thiệu về hồi quy tuyến tính đa biến

Hồi quy tuyến tính đa biến là dạng mở rộng của hồi quy tuyến tính giản đơn cho hai hay nhiều biến độc lập. Trong thực hành kinh tế lượng, phương pháp này được sử dụng khi chúng ta muốn dự báo một biến kết quả (biến phụ thuộc) theo giá trị của hai hay nhiều biến giải thích (còn gọi là biến độc lập).

Ví dụ ứng dụng trong kinh tế Việt Nam:

  • Dự báo thu nhập của người lao động theo số năm đi học, số năm kinh nghiệm, tuổi, giới tính và khu vực sinh sống
  • Phân tích các yếu tố ảnh hưởng đến giá bất động sản như diện tích, vị trí, số phòng ngủ, tuổi nhà
  • Nghiên cứu mối quan hệ giữa GDP với đầu tư, xuất khẩu, tiêu dùng và lạm phát
  • Đánh giá tác động của các chính sách kinh tế đến tăng trưởng kinh tế

Tài liệu tham khảo bổ sung:

Các biến trong mô hình hồi quy tuyến tính đa biến phải thỏa mãn tính chất BLUE. Để hiểu rõ hơn về ảnh hưởng của các giả định đến kết quả mô hình, tham khảo bài các khuyết tật của mô hình hồi quy.

Hồi quy tuyến tính đa biến - SPSS
Hồi quy tuyến tính đa biến – SPSS

Tính chất BLUE này được thể hiện cụ thể qua các giả định quan trọng của mô hình được trình bày bên dưới.

Các giả định của hồi quy tuyến tính đa biến

Để sử dụng phương pháp hồi quy tuyến tính đa biến trong thực hành kinh tế lượng, dữ liệu phải thỏa mãn bảy giả định quan trọng sau:

1. Tính chất của biến phụ thuộc

Biến phụ thuộc trong mô hình phải là biến liên tục (có thể dạng tỷ lệ hoặc dạng khoảng).

2. Mối quan hệ tuyến tính

Có mối quan hệ tuyến tính giữa biến phụ thuộc với các biến giải thích của mô hình. Có nhiều cách để kiểm tra mối quan hệ tuyến tính này, một trong số đó là sử dụng đồ thị phân tán giữa hai biến.

Minh họa mối quan hệ tuyến tính giữa biến độc lập và biến phụ thuộc

Nếu dữ liệu có dạng phi tuyến, chúng ta cần thực hiện biến đổi biến thành biến mới qua một dạng hàm phù hợp (như logarit, bình phương, căn bậc hai) sao cho biến mới này thỏa mãn giả định tuyến tính.

3. Không có điểm dị biệt

Dữ liệu không có chứa các điểm dị biệt (outliers). Xem thêm phương pháp phát hiện điểm dị biệt.

Minh họa điểm dị biệt trong dữ liệu hồi quy

4. Sự độc lập của các quan sát

Có sự độc lập giữa các quan sát trong một biến. Sự độc lập giữa các quan sát có thể được kiểm tra qua kiểm định Durbin-Watson về sự tự tương quan.

5. Đồng nhất phương sai

Phương sai của phần dư bằng nhau hay có sự đồng nhất về phương sai của phần dư (homoscedasticity). Sự đồng nhất về phương sai có thể được đánh giá bằng đồ thị phân tán phần dư.

6. Không có đa cộng tuyến

Không có sự đa cộng tuyến (multicollinearity) giữa các biến giải thích. Điều này có nghĩa các biến giải thích trong mô hình không có sự tương quan cao với nhau.

7. Phân phối chuẩn của phần dư

Sai số của phần dư (residuals errors) ở đường thẳng hồi quy có phân phối chuẩn hoặc xấp xỉ phân phối chuẩn. Xem thêm Phân phối chuẩn.

Lưu ý quan trọng: Việc vi phạm các giả định có thể dẫn đến kết quả sai lệch, ước lượng không hiệu quả hoặc kiểm định thống kê không đáng tin cậy. Trong thực hành kinh tế lượng, cần kiểm tra đầy đủ các giả định trước khi diễn giải kết quả.

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ề các yếu tố ảnh hưởng đến khả năng đọc hiểu của trẻ em. Tải dữ liệu hồi quy đa biến

Mô tả dữ liệu:

  • read: Khả năng đọc hiểu của trẻ (điểm số) – biến phụ thuộc
  • age: Tuổi của trẻ (năm) – biến độc lập
  • mem: Khả năng ghi nhớ (điểm số) – biến độc lập
  • iq: Chỉ số IQ (điểm số) – biến độc lập

Câu hỏi nghiên cứu: Tuổi, chỉ số IQ và khả năng ghi nhớ của trẻ có ảnh hưởng đến khả năng đọc hiểu không và mức độ ảnh hưởng như thế nào?

Đây là một ví dụ điển hình trong thực hành kinh tế lượng ứng dụng, tương tự như nghiên cứu các yếu tố ảnh hưởng đến học tập, năng suất lao động, hoặc hiệu quả kinh doanh.

Hướng dẫn thực hành chi tiết

Bước 1: Truy cập menu hồi quy tuyến tính

Trong SPSS, điều hướng đến menu phân tích hồi quy:

AnalyzeRegressionLinear…

Giao diện menu Analyze - Regression - Linear trong SPSS

Bước 2: Thiết lập biến phụ thuộc và biến độc lập

Cửa sổ Linear Regression mở ra, thực hiện các thiết lập sau:

  • Đưa biến read vào ô Dependent
  • Đưa biến age, memiq vào ô Independent(s)
  • Đảm bảo phương thức Enter được chọn ở phần Method

Cửa sổ Linear Regression với biến read làm dependent và age, mem, iq làm independent

Ghi chú: Phương thức Enter sẽ đưa tất cả biến độc lập vào mô hình cùng lúc, khác với các phương thức như Forward, Backward hay Stepwise.

Bước 3: Cấu hình tùy chọn thống kê

Click nút Statistics… để thiết lập các tùy chọn:

Trong khung Regression Coefficients:

  • Chọn Estimates để hiển thị các tham số ước lượng
  • Chọn Confidence intervals để hiển thị khoảng tin cậy cho tham số

Các tùy chọn bổ sung:

  • Chọn Model fit để kiểm tra độ phù hợp của mô hình
  • Chọn Collinearity diagnostics để kiểm tra hiện tượng đa cộng tuyến
  • Trong khung Residuals, chọn Durbin-Watson để kiểm tra sự tự tương quan

Cửa sổ Statistics với các tùy chọn Estimates, Model fit, Collinearity diagnostics và Durbin-Watson được chọn

Bạn có thể chọn Casewise diagnostics để loại bỏ các giá trị dị biệt khỏi ước lượng hồi quy bằng cách thiết lập ngưỡng phù hợp.

Bước 4: Thiết lập đồ thị chẩn đoán

Click nút Plots… để vẽ đồ thị chẩn đoán:

Thiết lập đồ thị:

  • Chọn *ZRESID (Standardized Residuals) cho trục Y
  • Chọn *ZPRED (Standardized Predicted Values) cho trục X
  • Chọn HistogramNormal probability plot để kiểm tra phân phối chuẩn

Cửa sổ Plots với thiết lập đồ thị scatter plot và histogram

Bước 5: Kiểm tra tùy chọn bổ sung

Click nút Options… để đảm bảo:

  • Mục Include constant in equation được chọn (để sử dụng kiểm định Durbin-Watson)
  • Các tùy chọn khác để mặc định

Cửa sổ Options với Include constant in equation được chọn

Bước 6: Thực thi phân tích

Sau mỗi bước thiết lập, click Continue để quay về cửa sổ chính, sau đó click OK để thực hiện phân tích.

Đọc và diễn giải kết quả

Bảng ANOVA – Kiểm tra độ phù hợp tổng thể

Bảng ANOVA tóm tắt các kết quả về độ phù hợp của mô hình nghiên cứu:

Bảng ANOVA hiển thị Sum of Squares, df, Mean Square, F và Sig

Các thông số quan trọng:

  • Hệ số ý nghĩa (Sig): Cho biết mô hình có giải thích được sự thay đổi của biến phụ thuộc hay không. Nếu Sig > 0.05, mô hình không phù hợp với dữ liệu
  • Giá trị F: So sánh mô hình hồi quy với mô hình chỉ có hằng số. Kiểm định giả thuyết \(H_0: \beta_1 = \beta_2 = \beta_3 = 0\)
  • Sum of Squares: Bao gồm ESS (Regression: 7.498), RSS (Residual: 1.482), và TSS (Total: 8.980)

Công thức quan trọng: \(TSS = ESS + RSS\), trong đó:

  • ESS: Tổng bình phương thay đổi được giải thích bởi mô hình
  • RSS: Tổng bình phương của phần dư
  • TSS: Tổng thay đổi trong biến phụ thuộc

Khả năng giải thích \(R^2 = \frac{ESS}{TSS}\) là tỷ lệ thay đổi được giải thích bởi mô hình.

Bảng Model Summary – Đánh giá độ phù hợp

Bảng Model Summary trình bày kết quả tóm tắt về độ phù hợp của mô hình:

Bảng Model Summary hiển thị R, R Square, Adjusted R Square, Std. Error và Durbin-Watson

Diễn giải các chỉ số:

  • R-square (0.835): 83.5% sự thay đổi trong biến phụ thuộc được giải thích bởi mô hình
  • Adjusted R-square (0.804): 80.4% phương sai của biến phụ thuộc được giải thích sau khi điều chỉnh cho số biến
  • Std. Error of Estimate (4.468): Sai số chuẩn của ước lượng, đo mức độ phân tán quanh giá trị dự báo
  • Durbin-Watson (2.029): Giá trị trong khoảng 1.5-2.5 cho thấy không có sự tự tương quan bậc 1
Ghi nhớ: Cần đánh giá độ phù hợp của mô hình ở bảng ANOVA trước khi đánh giá hiệu quả giải thích \(R^2\).

Bảng Coefficients – Hệ số hồi quy

Bảng Coefficients trình bày các hệ số của phương trình hồi quy:

Bảng Coefficients hiển thị B, Std. Error, Beta, t, Sig và Collinearity Statistics

Diễn giải kết quả:

  • Chỉ có hệ số của biến age có ý nghĩa thống kê (p < 0.05)
  • Tuổi có ảnh hưởng đến khả năng đọc hiểu của trẻ
  • Chưa có bằng chứng về tác động của IQ và khả năng ghi nhớ

Kiểm tra đa cộng tuyến:

  • Cột Collinearity Statistics kiểm tra mức độ đa cộng tuyến
  • Hệ số VIF từ 1.8 đến 3.5 (< 10) cho thấy không có đa cộng tuyến nghiêm trọng

Đồ thị chẩn đoán

Histogram và Normal P-P Plot:

Histogram và Normal P-P Plot của phần dư

Đồ thị histogram cho thấy phân phối của phần dư có hình dạng phân phối chuẩn. Đồ thị Normal P-P cho thấy các quan sát phân phối xấp xỉ đường thẳng ứng với phân phối chuẩn.

Scatter Plot phần dư:

Scatter plot của phần dư theo giá trị dự báo

Phát hiện vi phạm giả định: Đồ thị scatter plot của phần dư theo giá trị dự báo cho thấy phương sai của phần dư không đồng nhất. Mô hình đang vi phạm giả thuyết về phương sai đồng nhất (homoscedasticity).

Lưu ý quan trọng

Tác động của vi phạm giả thuyết

Sự vi phạm giả thuyết phương sai đồng nhất trong thực hành kinh tế lượng:

  • Không ảnh hưởng: Độ phù hợp \(R^2\) và hệ số ước lượng \(\beta\) vẫn không thiên lệch
  • Ảnh hưởng: Sai số chuẩn của ước lượng không chính xác
  • Hậu quả: Giá trị thống kê F, t và mức ý nghĩa có thể sai lệch
  • Giải pháp: Sử dụng sai số chuẩn robust hoặc biến đổi dữ liệu

Các biện pháp khắc phục

Khi vi phạm giả thuyết:

  • Phương sai không đồng nhất: Sử dụng ước lượng bình phương tối thiểu trọng số, WLS (Weighted Least Squares) hoặc hồi quy với sai số vững mạnh (robust standard errors).
  • Đa cộng tuyến: Loại bỏ biến có VIF cao, sử dụng hồi quy Ridge (Ridge regression) hoặc phân tích thành phần chính, PCA (Principal Component Analysis).
  • Tự tương quan: Sử dụng ước lượng bình phương tối thiểu tuyến tính tổng quát, GLS (Generalized Least Squares) hoặc thêm các biến trễ (lag variables)
  • Phi tuyến tính: Biến đổi biến hoặc sử dụng hồi quy đa thức (polynomial regression).

Ứng dụng trong nghiên cứu kinh tế

Hồi quy tuyến tính đa biến có nhiều ứng dụng quan trọng trong thực hành kinh tế lượng:

  • Kinh tế vĩ mô: Phân tích các yếu tố ảnh hưởng đến GDP, lạm phát, thất nghiệp
  • Tài chính: Mô hình định giá tài sản, dự báo giá chứng khoán, phân tích rủi ro
  • Marketing: Nghiên cứu tác động của quảng cáo, giá cả, chất lượng đến doanh số
  • Nhân sự: Phân tích các yếu tố ảnh hưởng đến lương, năng suất, sự hài lòng

Tổng kết

Hồi quy tuyến tính đa biến là công cụ mạnh mẽ và linh hoạt trong thực hành kinh tế lượng. Thông qua hướng dẫn này, chúng ta đã nắm vững:

  • Các giả định cần thiết và cách kiểm tra chúng
  • Quy trình thực hiện hồi quy đa biến trong SPSS từ A đến Z
  • Cách đọc và diễn giải các bảng kết quả quan trọng
  • Phương pháp chẩn đoán và xử lý 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:

  • Kiểm tra giả thuyết là bước quan trọng nhất trước khi diễn giải kết quả
  • Bảng ANOVA xác định tính phù hợp tổng thể của mô hình
  • R-square cho biết tỷ lệ biến thiên được giải thích bởi mô hình
  • VIF < 10 cho thấy không có đa cộng tuyến nghiêm trọng
  • Durbin-Watson (1.5-2.5) cho thấy không có tự tương quan

Việc thành thạo hồi quy tuyến tính đa biến sẽ trang bị cho các nhà nghiên cứu công cụ phân tích mạnh mẽ để đưa ra những kết luận chính xác và có ý nghĩa trong thực hành kinh tế lượng.

1. Một quy tắc kinh nghiệm được sử dụng để kết luận không có sự tự tương quan bậc 1 là nếu giá trị thống kê d nằm giữa 1.5 và 2.5. Giá trị d nhỏ hơn 1.5 cho biết có sự tự tương quan dương bậc 1. Giá trị d lớn hơn 2.5 cho biết có sự tự tương quan âm bậc 1.

2. Hoàng Ngọc Nhậm và cộng sự, 2008. Giáo trình kinh tế lượng. Hà Nội: Nhà xuất bản lao động – xã hội, trang 140.

Phụ lục: Code syntax cho các phần mềm thống kê

SPSS Syntax

SPSS Syntax (.sps)


* Hồi quy tuyến tính đa biến 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=read age mem iq
  /STATISTICS=MEAN STDDEV MIN MAX.

* Ma trận tương quan
CORRELATIONS
  /VARIABLES=read age mem iq
  /PRINT=TWOTAIL NOSIG
  /MISSING=PAIRWISE.

* Hồi quy tuyến tính đa biến
REGRESSION
  /MISSING LISTWISE
  /STATISTICS COEFF OUTS R ANOVA COLLIN
  /CRITERIA=PIN(.05) POUT(.10)
  /NOORIGIN 
  /DEPENDENT read
  /METHOD=ENTER age mem iq
  /SCATTERPLOT=(*ZRESID ,*ZPRED)
  /RESIDUALS DURBIN HISTOGRAM(ZRESID) NORMPROB(ZRESID).

* Kiểm tra điểm dị biệt
REGRESSION
  /MISSING LISTWISE
  /STATISTICS COEFF OUTS R ANOVA
  /CRITERIA=PIN(.05) POUT(.10)
  /NOORIGIN 
  /DEPENDENT read
  /METHOD=ENTER age mem iq
  /SAVE COOK LEVER DFBETA DFFIT
  /RESIDUALS OUTLIERS(COOK) OUTLIERS(LEVER).

* Kiểm tra tính tuyến tính
GRAPH
  /SCATTERPLOT(BIVAR)=age WITH read
  /MISSING=LISTWISE.

GRAPH
  /SCATTERPLOT(BIVAR)=mem WITH read
  /MISSING=LISTWISE.

GRAPH
  /SCATTERPLOT(BIVAR)=iq WITH read
  /MISSING=LISTWISE.

* Biến đổi dữ liệu nếu cần
COMPUTE ln_read = LN(read).
COMPUTE sqrt_read = SQRT(read).
EXECUTE.

Stata Commands

Stata Commands (.do)


* Hồi quy tuyến tính đa biến trong Stata
* Sử dụng dữ liệu về khả năng đọc hiểu

* Tải và mô tả dữ liệu
use "ols_data.dta", clear
describe read age mem iq
summarize read age mem iq, detail

* Ma trận tương quan
corr read age mem iq
pwcorr read age mem iq, sig

* Hồi quy tuyến tính đa biến
regress read age mem iq

* Kiểm tra các giả thuyết
* 1. Kiểm tra đa cộng tuyến (VIF)
estat vif

* 2. Kiểm tra phương sai đồng nhất (Breusch-Pagan test)
estat hettest

* 3. Kiểm tra tự tương quan (Durbin-Watson)
estat dwatson

* 4. Kiểm tra phân phối chuẩn của phần dư
predict residuals, residuals
histogram residuals, normal
qnorm residuals

* 5. Kiểm tra tính tuyến tính
scatter read age || lfit read age
scatter read mem || lfit read mem
scatter read iq || lfit read iq

* 6. Kiểm tra điểm dị biệt
predict leverage, leverage
predict cooksd, cooksd
predict dfbeta_age, dfbeta(age)
predict dfbeta_mem, dfbeta(mem)
predict dfbeta_iq, dfbeta(iq)

* Liệt kê các quan sát có Cook's distance > 4/n
scalar threshold = 4/_N
list if cooksd > threshold

* Robust standard errors nếu có phương sai không đồng nhất
regress read age mem iq, robust

* Weighted least squares nếu cần
regress read age mem iq [aweight=1/variance_weight]

* Stepwise regression
stepwise, pr(0.05) pe(0.10): regress read age mem iq

* Thống kê mô tả theo nhóm nếu có biến categorical
* egen age_group = cut(age), group(3)
* by age_group: summarize read

R Script

R Script (.R)


# Hồi quy tuyến tính đa biến với R
# Sử dụng các gói car, lmtest và ggplot2

# Tải các thư viện cần thiết
library(car)
library(lmtest)
library(ggplot2)
library(dplyr)
library(corrplot)
library(stargazer)

# Đọc dữ liệu
data <- read.csv("ols_data.csv")
str(data)
summary(data)

# Thống kê mô tả
summary(data[c("read", "age", "mem", "iq")])

# Ma trận tương quan
cor_matrix <- cor(data[c("read", "age", "mem", "iq")])
print(cor_matrix)
corrplot(cor_matrix, method = "circle")

# Hồi quy tuyến tính đa biến
model <- lm(read ~ age + mem + iq, data = data)
summary(model)

# Kiểm tra các giả thuyết
# 1. Kiểm tra đa cộng tuyến
vif_values <- vif(model)
print(vif_values)

# 2. Kiểm tra phương sai đồng nhất
# Breusch-Pagan test
bptest(model)

# 3. Kiểm tra tự tương quan
# Durbin-Watson test
dwtest(model)

# 4. Kiểm tra phân phối chuẩn của phần dư
# Shapiro-Wilk test
shapiro.test(residuals(model))

# 5. Đồ thị chẩn đoán
par(mfrow = c(2, 2))
plot(model)

# 6. Kiểm tra tính tuyến tính
# Scatter plots
ggplot(data, aes(x = age, y = read)) +
  geom_point() +
  geom_smooth(method = "lm") +
  labs(title = "Mối quan hệ giữa Age và Read")

ggplot(data, aes(x = mem, y = read)) +
  geom_point() +
  geom_smooth(method = "lm") +
  labs(title = "Mối quan hệ giữa Memory và Read")

ggplot(data, aes(x = iq, y = read)) +
  geom_point() +
  geom_smooth(method = "lm") +
  labs(title = "Mối quan hệ giữa IQ và Read")

# 7. Kiểm tra điểm dị biệt
# Cook's distance
cooksd <- cooks.distance(model)
plot(cooksd, pch = "*", cex = 2, main = "Cook's Distance")
abline(h = 4/length(cooksd), col = "red")

# Leverage
leverage <- hatvalues(model)
plot(leverage, pch = "*", cex = 2, main = "Leverage")

# Standardized residuals
std_residuals <- rstandard(model)
plot(std_residuals, pch = "*", cex = 2, main = "Standardized Residuals")

# 8. Robust standard errors (nếu cần)
library(sandwich)
coeftest(model, vcov = vcovHC(model, type = "HC0"))

# 9. Weighted Least Squares (nếu cần)
# weights <- 1/fitted(lm(abs(residuals(model)) ~ fitted(model)))^2
# model_wls <- lm(read ~ age + mem + iq, data = data, weights = weights)

# 10. Stepwise regression
model_stepwise <- step(model, direction = "both")
summary(model_stepwise)

# 11. Tạo bảng kết quả đẹp
stargazer(model, type = "text", 
          title = "Kết quả hồi quy tuyến tính đa biến",
          dep.var.labels = "Khả năng đọc hiểu",
          covariate.labels = c("Tuổi", "Khả năng ghi nhớ", "Chỉ số IQ"))

# 12. Dự báo
new_data <- data.frame(age = 10, mem = 50, iq = 100)
prediction <- predict(model, new_data, interval = "confidence")
print(prediction)

Python Script

Python Script (.py)


# Hồi quy tuyến tính đa biến với Python
# Sử dụng scikit-learn, 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 sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error
from sklearn.preprocessing import StandardScaler
from statsmodels.stats.outliers_influence import variance_inflation_factor
import statsmodels.api as sm
from statsmodels.stats.diagnostic import het_breuschpagan, linear_rainbow
from statsmodels.stats.stattools import durbin_watson

# Đọc dữ liệu
data = pd.read_csv('ols_data.csv')
print(data.info())
print(data.describe())

# Kiểm tra missing values
print(data.isnull().sum())

# Thống kê mô tả
variables = ['read', 'age', 'mem', 'iq']
desc_stats = data[variables].describe()
print(desc_stats)

# Ma trận tương quan
correlation_matrix = data[variables].corr()
print(correlation_matrix)

# Vẽ heatmap tương quan
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('Ma trận tương quan')
plt.show()

# Scatter plots để kiểm tra tính tuyến tính
fig, axes = plt.subplots(1, 3, figsize=(15, 5))

sns.scatterplot(data=data, x='age', y='read', ax=axes[0])
sns.regplot(data=data, x='age', y='read', ax=axes[0], scatter=False)
axes[0].set_title('Age vs Read')

sns.scatterplot(data=data, x='mem', y='read', ax=axes[1])
sns.regplot(data=data, x='mem', y='read', ax=axes[1], scatter=False)
axes[1].set_title('Memory vs Read')

sns.scatterplot(data=data, x='iq', y='read', ax=axes[2])
sns.regplot(data=data, x='iq', y='read', ax=axes[2], scatter=False)
axes[2].set_title('IQ vs Read')

plt.tight_layout()
plt.show()

# Chuẩn bị dữ liệu
X = data[['age', 'mem', 'iq']]
y = data['read']

# Hồi quy với scikit-learn
model_sklearn = LinearRegression()
model_sklearn.fit(X, y)

# Kết quả cơ bản
print("Sklearn Results:")
print(f"R² Score: {model_sklearn.score(X, y):.4f}")
print(f"Intercept: {model_sklearn.intercept_:.4f}")
print("Coefficients:")
for i, coef in enumerate(model_sklearn.coef_):
    print(f"  {X.columns[i]}: {coef:.4f}")

# Hồi quy với statsmodels (chi tiết hơn)
X_with_const = sm.add_constant(X)
model_sm = sm.OLS(y, X_with_const).fit()
print("\nStatsmodels Results:")
print(model_sm.summary())

# Kiểm tra các giả thuyết
print("\n=== KIỂM TRA GIẢ THUYẾT ===")

# 1. Kiểm tra đa cộng tuyến (VIF)
print("\n1. Variance Inflation Factor (VIF):")
vif_data = pd.DataFrame()
vif_data["Variable"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif_data)

# 2. Kiểm tra phương sai đồng nhất (Breusch-Pagan test)
print("\n2. Breusch-Pagan Test (Homoscedasticity):")
bp_test = het_breuschpagan(model_sm.resid, X_with_const)
bp_labels = ['LM Statistic', 'LM-Test p-value', 'F-Statistic', 'F-Test p-value']
print(dict(zip(bp_labels, bp_test)))

# 3. Kiểm tra tự tương quan (Durbin-Watson)
print("\n3. Durbin-Watson Test:")
dw_statistic = durbin_watson(model_sm.resid)
print(f"Durbin-Watson statistic: {dw_statistic:.4f}")

# 4. Kiểm tra phân phối chuẩn của phần dư
print("\n4. Shapiro-Wilk Test (Normality):")
shapiro_stat, shapiro_p = stats.shapiro(model_sm.resid)
print(f"Shapiro-Wilk statistic: {shapiro_stat:.4f}, p-value: {shapiro_p:.4f}")

# 5. Đồ thị chẩn đoán
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# Residuals vs Fitted
fitted_values = model_sm.fittedvalues
residuals = model_sm.resid

axes[0, 0].scatter(fitted_values, 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_values, 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()

# 6. Kiểm tra điểm dị biệt
print("\n6. Outlier Detection:")

# Cook's distance
influence = model_sm.get_influence()
cook_distance = influence.cooks_distance[0]
leverage = influence.hat_matrix_diag
dfbetas = influence.dfbetas

print(f"Max Cook's Distance: {cook_distance.max():.4f}")
print(f"Threshold (4/n): {4/len(data):.4f}")

# Vẽ đồ thị Cook's distance
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.scatter(range(len(cook_distance)), cook_distance)
plt.axhline(y=4/len(data), color='red', linestyle='--', label='Threshold')
plt.xlabel('Observation')
plt.ylabel("Cook's Distance")
plt.title("Cook's Distance")
plt.legend()

# Vẽ đồ thị Leverage
plt.subplot(1, 2, 2)
plt.scatter(range(len(leverage)), leverage)
plt.axhline(y=2*X.shape[1]/len(data), color='red', linestyle='--', label='Threshold')
plt.xlabel('Observation')
plt.ylabel('Leverage')
plt.title('Leverage')
plt.legend()

plt.tight_layout()
plt.show()

# 7. Dự báo
print("\n7. Prediction Example:")
new_data = pd.DataFrame({
    'age': [10],
    'mem': [50], 
    'iq': [100]
})

prediction_sklearn = model_sklearn.predict(new_data)
print(f"Sklearn prediction: {prediction_sklearn[0]:.2f}")

new_data_with_const = sm.add_constant(new_data)
prediction_sm = model_sm.predict(new_data_with_const)
confidence_interval = model_sm.get_prediction(new_data_with_const).conf_int()
print(f"Statsmodels prediction: {prediction_sm[0]:.2f}")
print(f"95% Confidence Interval: [{confidence_interval[0,0]:.2f}, {confidence_interval[0,1]:.2f}]")

# 8. Model comparison và feature selection
from sklearn.feature_selection import f_regression

print("\n8. Feature Importance:")
f_stats, f_pvalues = f_regression(X, y)
feature_importance = pd.DataFrame({
    'Feature': X.columns,
    'F-statistic': f_stats,
    'p-value': f_pvalues
}).sort_values('F-statistic', ascending=False)

print(feature_importance)

# 9. Robust regression (nếu cần)
print("\n9. Robust Regression Results:")
robust_model = sm.RLM(y, X_with_const).fit()
print(robust_model.summary())

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.
  • Hoàng Ngọc Nhậm và cộng sự. (2008). Giáo trình kinh tế lượng. Hà Nội: Nhà xuất bản Lao động – Xã hội.
  • IBM Corporation. (2023). IBM SPSS Statistics Documentation – Regression. Retrieved from IBM Knowledge Center.
  • Montgomery, D. C., Peck, E. A., & Vining, G. G. (2021). Introduction to Linear Regression Analysis (6th ed.). John Wiley & Sons.
  • Chatterjee, S., & Hadi, A. S. (2015). Regression Analysis by Example (5th ed.). John Wiley & Sons.
  • Wooldridge, J. M. (2020). Introductory Econometrics: A Modern Approach (7th ed.). Cengage Learning.
Xem thêm
Back to top button