Negative Binomial — Hồi quy nhị thức âm
Negative Binomial (NegBin) là mô hình biến đếm xử lý overdispersion — khi phương sai lớn hơn kỳ vọng, tình huống rất phổ biến mà Poisson không mô tả đúng. NegBin thêm một tham số phân tán để nới lỏng ràng buộc equidispersion.
Khi nào dùng
Dùng NegBin khi là số đếm có overdispersion (). Nếu , NegBin quy về Poisson.
Đặc tả mô hình
Tham số đo mức overdispersion. Ước lượng bằng MLE.
Chẩn đoán
- Kiểm định (NegBin vs Poisson): bác bỏ ⇒ NegBin phù hợp hơn.
- Nếu vẫn dư thừa số 0 ⇒ ZINB.
Thực hiện trong EcoLab
- Module Mô hình hóa → họ Dữ liệu đếm → Negative Binomial.
- Chọn đếm, các , offset nếu cần.
- Chạy, đọc IRR và ; so sánh AIC/BIC với Poisson; xuất mã tái lập.
Minh họa mã tái lập
- Stata
- R
- Python
* === Hồi quy Negative Binomial ===
nbreg patents rd_spend firm_size, vce(robust)
* Incidence Rate Ratios (IRR)
nbreg patents rd_spend firm_size, vce(robust) irr
* Tham số overdispersion alpha (lnalpha trong output)
* Kiểm định alpha = 0 (NegBin vs Poisson)
* ⇒ Likelihood-ratio test tự động hiển thị
# === Hồi quy Negative Binomial ===
library(MASS)
model <- glm.nb(patents ~ rd_spend + firm_size, data = df)
summary(model)
# Incidence Rate Ratios (IRR)
exp(coef(model))
exp(confint(model))
# Tham số overdispersion theta (1/alpha)
model$theta
# So sánh AIC với Poisson
pois <- glm(patents ~ rd_spend + firm_size, family = poisson, data = df)
AIC(pois, model)
# === Hồi quy Negative Binomial ===
import statsmodels.api as sm
import numpy as np
X = sm.add_constant(df[["rd_spend", "firm_size"]])
y = df["patents"]
model = sm.GLM(y, X, family=sm.families.NegativeBinomial()).fit()
print(model.summary())
# Incidence Rate Ratios (IRR)
print("\nIRR:")
print(np.exp(model.params))
# So sánh AIC với Poisson
pois = sm.GLM(y, X, family=sm.families.Poisson()).fit()
print(f"\nAIC Poisson: {pois.aic:.2f}")
print(f"AIC NegBin: {model.aic:.2f}")
Hạn chế
- Vẫn kém khi có excess zeros từ một cơ chế riêng ⇒ dùng zero-inflated.
- Cần mẫu đủ lớn để ước lượng ổn định.