Tôi có một biến phụ thuộc có thể nằm trong khoảng từ 0 đến vô cùng, với 0 thực sự là những quan sát chính xác. Tôi hiểu việc kiểm duyệt và các mô hình Tobit chỉ áp dụng khi giá trị thực tế của là chưa biết một phần hoặc mất tích, trong đó dữ liệu trường hợp được cho là được cắt ngắn. Một số thông tin thêm về dữ liệu bị kiểm duyệt trong chủ đề này .
Nhưng ở đây 0 là một giá trị thực sự thuộc về dân số. Chạy OLS trên dữ liệu này có vấn đề khó chịu đặc biệt để mang ước tính tiêu cực. Tôi nên làm mẫu như thế nào?
> summary(data$Y)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 0.00 0.00 7.66 5.20 193.00
> summary(predict(m))
Min. 1st Qu. Median Mean 3rd Qu. Max.
-4.46 2.01 4.10 7.66 7.82 240.00
> sum(predict(m) < 0) / length(data$Y)
[1] 0.0972098
Phát triển
Sau khi đọc câu trả lời, tôi đang báo cáo sự phù hợp của mô hình vượt rào Gamma bằng các hàm ước tính hơi khác nhau. Kết quả khá bất ngờ với tôi. Trước tiên hãy nhìn vào DV. Những gì rõ ràng là dữ liệu đuôi cực kỳ béo. Điều này có một số hậu quả thú vị về việc đánh giá sự phù hợp mà tôi sẽ bình luận bên dưới:
quantile(d$Y, probs=seq(0, 1, 0.1))
0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.286533 3.566165 11.764706 27.286630 198.184818
Tôi đã xây dựng mô hình rào cản Gamma như sau:
d$zero_one = (d$Y > 0)
logit = glm(zero_one ~ X1*log(X2) + X1*X3, data=d, family=binomial(link = logit))
gamma = glm(Y ~ X1*log(X2) + X1*X3, data=subset(d, Y>0), family=Gamma(link = log))
Cuối cùng tôi đã đánh giá sự phù hợp trong mẫu bằng ba kỹ thuật khác nhau:
# logit probability * gamma estimate
predict1 = function(m_logit, m_gamma, data)
{
prob = predict(m_logit, newdata=data, type="response")
Yhat = predict(m_gamma, newdata=data, type="response")
return(prob*Yhat)
}
# if logit probability < 0.5 then 0, else logit prob * gamma estimate
predict2 = function(m_logit, m_gamma, data)
{
prob = predict(m_logit, newdata=data, type="response")
Yhat = predict(m_gamma, newdata=data, type="response")
return(ifelse(prob<0.5, 0, prob)*Yhat)
}
# if logit probability < 0.5 then 0, else gamma estimate
predict3 = function(m_logit, m_gamma, data)
{
prob = predict(m_logit, newdata=data, type="response")
Yhat = predict(m_gamma, newdata=data, type="response")
return(ifelse(prob<0.5, 0, Yhat))
}
Lúc đầu, tôi đánh giá sự phù hợp bằng các biện pháp thông thường: AIC, sai lệch null, sai số tuyệt đối trung bình, v.v. Nhưng nhìn vào các lỗi tuyệt đối lượng tử của các hàm trên làm nổi bật một số vấn đề liên quan đến xác suất cao về kết quả 0 và cực trị đuôi béo. Tất nhiên, lỗi tăng theo cấp số nhân với giá trị Y cao hơn (cũng có giá trị Y rất lớn tại Max), nhưng điều thú vị hơn là việc dựa nhiều vào mô hình logit để ước tính 0 tạo ra sự phù hợp phân phối tốt hơn (tôi sẽ không t biết làm thế nào để mô tả tốt hơn hiện tượng này):
quantile(abs(d$Y - predict1(logit, gamma, d)), probs=seq(0, 1, 0.1))
0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
0.00320459 1.45525439 2.15327192 2.72230527 3.28279766 4.07428682 5.36259988 7.82389110 12.46936416 22.90710769 1015.46203281
quantile(abs(d$Y - predict2(logit, gamma, d)), probs=seq(0, 1, 0.1))
0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
0.000000 0.000000 0.000000 0.000000 0.000000 0.309598 3.903533 8.195128 13.260107 24.691358 1015.462033
quantile(abs(d$Y - predict3(logit, gamma, d)), probs=seq(0, 1, 0.1))
0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
0.000000 0.000000 0.000000 0.000000 0.000000 0.307692 3.557285 9.039548 16.036379 28.863912 1169.321773