Tuesday, 15 January 2019

(R) Hồi Quy Phân Vị - Quantile Regression

Phương pháp hồi quy phân vị được Koenker & Bassett giới thiệu lần đầu tiên năm 1978. Thay vì ước lượng các tham số của hàm hồi quy trung bình bằng phương pháp OLS, Koenker & Bassett (1978) đề xuất việc ước lượng tham số hồi quy trên từng phân vị của biến phụ thuộc để sao cho tổng chênh lệch tuyệt đối của hàm hồi quy tại phân vị τ của biến phụ thuộc là nhỏ nhất. Nói một cách khác, thay vì xác định tác động biên của biến độc lập đến giá trị trung bình của biến phụ thuộc, hồi quy phân vị sẽ giúp xác định tác động biên của biến độc lập đến biến phụ thuộc trên từng phân vị của biến phụ thuộc đó.
Ưu điểm:
 - Thứ nhất, phương pháp hồi quy phân vị cho phép thể hiện một cách chi tiết về mối quan hệ giữa biến phụ thuộc và các biến độc lập trên từng phân vị của biến phụ thuộc, không phải chỉ xét mối quan hệ này trên giá trị trung bình như hồi quy OLS.
- Thứ hai, mặc dù các tính toán thực hiện trong hồi quy phân vị là phức tạp và khối lượng tính toán nhiều hơn trong OLS, nhưng với sự phát triển của toán học, thống kê học cộng với sự hỗ trợ của công nghệ thông tin thì những tính toán như quy hoạch tuyến tính, bootstrap, được thực hiện rất dễ dàng và nhanh chóng.
- Thứ ba, trong hồi quy OLS, các quan sát bất thường (outliers) thường được loại bỏ để ước lượng OLS không bị chệch. Trong khi đó, hồi quy phân vị có tính ổn định (robustness), không bị ảnh hưởng bởi sự hiện diện của các quan sát bất thường đó.
- Thứ tư, các kiểm định về tham số của hồi quy phân vị không dựa vào tính chuẩn của sai số. Hơn nữa, các kiểm định này không dựa trên bất kỳ một giả định nào về dạng phân phối của sai số hồi quy.
- Thứ năm, hồi quy phân vị đặc biệt phù hợp khi phân tích trên mô hình hồi quy có sự hiện diện của phương sai thay đổi hoặc trong mẫu số liệu mà hàm phân phối của biến phụ thuộc bất đối xứng quanh giá trị trung bình. Khi đó, hàm hồi quy phân vị trên các phân vị khác nhau sẽ có sự khác biệt rõ rệt, cho thấy tác 26 động không giống nhau của biến độc lập đến biến phụ thuộc ở những phân vị khác nhau.
Nhược điểm:
- Một là, các tính toán trong hồi quy phân vị phức tạp hơn so với OLS. Ví dụ như trong OLS, muốn tìm ước lượng tham số hồi quy sao cho tổng bình phương sai số là nhỏ nhất thì có thể áp dụng các công thức tìm cực trị của giải tích toán học như lấy đạo hàm riêng và giải hệ phương trình ứng với điều kiện cần của cực trị. Trong khi đó, ước lượng tham số của hồi quy phân vị thực hiện thông qua việc giải bài toán quy hoạch tuyến tính. Việc này sẽ khó khăn nếu không có sự hỗ trợ của máy tính.
- Hai là, phải thực hiện nhiều hàm hồi quy trên nhiều phân vị mới cho thấy được toàn diện sự tác động của biến độc lập đến biến phụ thuộc thay vì chỉ có một hàm hồi quy trung bình có điều kiện trong OLS.
- Ba là, việc áp dụng hồi quy phân vị cho các dạng hàm phi tuyến còn khá hạn chế. Các lý thuyết để xử lý tự tương quan hoặc nội sinh trong hồi quy phân vị còn chưa được phát triển hoàn thiện.
Với những thế mạnh đó, ngày càng có nhiều các bài nghiên cứu ứng dụng sử dụng hồi quy phân vị được thực hiện và công bố, cho thấy phương pháp ước lượng này đang ngày càng được hoàn thiện và là công cụ đắc lực trong nghiên cứu kinh tế cũng như các lĩnh vực khác. Ở VN các bạn có thể tham khảo hai nghiên cứu sau:
Quartiles (tứ phân vị)
Tứ phân vị là đại lượng mô tả sự phân bố và sự phân tán của tập dữ liệu. Tứ phân vị có 3 giá trị, đó là tứ phân vị thứ nhất (Q1), thứ nhì (Q2), và thứ ba (Q3). Ba giá trị này chia một tập hợp dữ liệu (đã sắp xếp dữ liệu theo trật từ từ bé đến lớn) thành 4 phần có số lượng quan sát đều nhau.

Tứ phân vị được xác định như sau:
·        Sắp xếp các số theo thứ tự tăng dần
·        Cắt dãy số thành 4 phàn bằng nhau
·        Tứ phân vị là các giá trị tại vị trí cắt


Độ trải giữa (Interquartile Range - IQR)
Interquartile Range được xác định như sau:

Typical Case


Nghiên cứu tác động của income lên chi cho thực phẩm (foodexp) với bộ dữ liệu có tên engel tích hợp trong gói quantreg do chính tác giả của phương pháp này là Koenker (2005) viết.
#Fix lỗi không install.package
options(repos = c(CRAN = "http://cran.rstudio.com"))

#Install necessary packages
rm(list = ls())
install.packages("quantreg")
library(quantreg)
library(ggplot2)
install.packages("stargazer")
library(stargazer)

#Read the “engel” dataset which is one of integrated dataset in “quantreg” package (Engel food expenditure data used in Koenker and Bassett(1982). This is a regression data set consisting of 235 observations on income and expenditure on food for Belgian working class households)
data("engel")
head(data)
plot(engel, log = "xy", main = "'engel' data (log - log scale)")
plot(log10(foodexp) ~ log10(income), data = engel, main = "'engel' data (log10 - transformed)")

#Transform engel to data frame
data.frame(engel)
head(engel, n=10)
view(engel)

#Quantile regression in R
phanvi <- rq(foodexp ~ income,engel, tau = c(0.25, 0.50, 0.75))
summary (phanvi)



# Để hỗ trợ so sánh trực quan, dùng gói stargazer:
q25=rq(foodexp ~ income, engel,tau=0.25)
q50=rq(foodexp ~ income, engel,tau=0.50)
q75=rq(foodexp ~ income, engel,tau=0.75)
stargazer(q25,q50,q75,title="Regression quantitle result", type="text")


#Explanation: in the first quantitle, foodexp = 0.029 + 0.474*income (If the income increase by 1 bp, the food expense will increase by 0.474 bp). It is clearly seen that there is a difference between the Q1 and the Q3, then we can take an Anova test to check whether it differs from each other or not. The hypothesis will be explained by:
Ho: the impact of income on foodexp is homogenous
H1: the impact of income on foodexp is not homogenous
anova(q25,q75,joint = FALSE)


#Data frame in quantitle
df_phanvi <- data.frame(t(coef(phanvi)))
View(df_phanvi)

#rename
names(df_phanvi)[names(df_phanvi)=='X.Intercept.'] <- 'Intercept'
names(df_phanvi)[names(df_phanvi)=='income'] <- 'slope'
head(df_phanvi)
or: colnames(df_phanvi) <- c("intercept", "slope")
df_phanvi$cacphanvi <- row.names(df_phanvi)
head(df_phanvi)






#Draw graph
graph <- qplot(x=income, y= foodexp, data = engel)
graph + geom_abline(aes(intercept = Intercept, slope = slope, colour = cacphanvi), data = df_phanvi)



1 comment: