Hồi quy phân vị (Quantile Regression)
Hồi quy phân vị ước lượng tác động của biến giải thích lên các phân vị (quantile) khác nhau của phân phối — không chỉ trung bình như OLS. Nó cho thấy biến ảnh hưởng khác nhau ở nhóm "thấp", "trung vị" và "cao" (vd tác động lên người thu nhập thấp khác người thu nhập cao).
Khi nào dùng
Dùng Quantile Regression khi quan tâm tác động không đồng nhất theo phân phối (heterogeneous effects), hoặc khi phân phối lệch/nhiều outlier khiến trung bình OLS kém đại diện. Hồi quy trung vị () vững với outlier hơn OLS.
Đặc tả mô hình
Phân vị của điều kiện theo :
Ước lượng bằng cách tối thiểu hóa tổng sai số tuyệt đối có trọng số bất đối xứng (check function ):
Thực hiện trong EcoLab
- Module Mô hình hóa → họ Hồi quy phân vị → Quantile.
- Chọn , các , và danh sách phân vị (vd 0.1, 0.25, 0.5, 0.75, 0.9).
- Chạy, đọc hệ số theo từng phân vị + đồ thị quantile process; bootstrap SE; xuất mã tái lập.
Minh họa mã tái lập
- Stata
- R
- Python
* === Hồi quy phân vị (Quantile Regression) ===
* --- Hồi quy tại từng phân vị ---
qreg lnwage educ exper, quantile(0.25)
qreg lnwage educ exper, quantile(0.5)
qreg lnwage educ exper, quantile(0.75)
* --- Ước lượng đồng thời nhiều phân vị (bootstrap SE) ---
sqreg lnwage educ exper, quantiles(0.25 0.5 0.75) reps(100)
* --- Kiểm định sự khác biệt hệ số giữa các phân vị ---
test [q25]educ = [q75]educ
# === Hồi quy phân vị (Quantile Regression) ===
library(quantreg)
# --- Ước lượng tại nhiều phân vị ---
fit <- rq(lnwage ~ educ + exper, data = df,
tau = c(0.25, 0.5, 0.75))
# --- Tóm tắt với bootstrap SE ---
summary(fit, se = "boot", R = 200)
# --- Đồ thị quantile process ---
plot(summary(rq(lnwage ~ educ + exper, data = df,
tau = seq(0.05, 0.95, by = 0.05)),
se = "boot"))
# === Hồi quy phân vị (Quantile Regression) ===
import statsmodels.api as sm
import pandas as pd
X = sm.add_constant(df[["educ", "exper"]])
y = df["lnwage"]
# --- Ước lượng tại nhiều phân vị ---
taus = [0.25, 0.5, 0.75]
results = {}
for t in taus:
mod = sm.QuantReg(y, X).fit(q=t)
results[t] = mod
print(f"\n--- Quantile {t} ---")
print(mod.summary())
# --- So sánh hệ số giữa các phân vị ---
coef_df = pd.DataFrame({t: r.params for t, r in results.items()})
print(coef_df)
Hạn chế
- SE thường cần bootstrap; tốn tính toán hơn OLS.
- Diễn giải nhiều phân vị phức tạp hơn một hệ số trung bình.