Saya memiliki variabel dependen yang dapat berkisar dari 0 hingga tak terbatas, dengan 0s sebenarnya pengamatan yang benar. Saya mengerti menyensor dan model Tobit hanya berlaku ketika nilai sebenarnya dari adalah sebagian tidak diketahui atau hilang, di mana data kasus dikatakan terpotong. Beberapa informasi lebih lanjut tentang data yang disensor di utas ini .
Tapi di sini 0 adalah nilai sebenarnya yang dimiliki populasi. Menjalankan OLS pada data ini memiliki masalah menjengkelkan tertentu untuk membawa perkiraan negatif. Bagaimana saya harus memodelkan ?
> 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
Perkembangan
Setelah membaca jawabannya, saya melaporkan kecocokan model rintangan Gamma menggunakan fungsi estimasi yang sedikit berbeda. Hasilnya cukup mengejutkan bagi saya. Pertama mari kita lihat DV. Yang jelas adalah data ekor yang sangat gemuk. Ini memiliki beberapa konsekuensi menarik pada evaluasi kecocokan yang akan saya komentari di bawah ini:
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
Saya membuat model rintangan Gamma sebagai berikut:
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))
Akhirnya saya mengevaluasi kecocokan sampel dengan menggunakan tiga teknik berbeda:
# 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))
}
Pada awalnya saya mengevaluasi kecocokan dengan langkah-langkah biasa: AIC, null deviance, mean absolute error, dll. Tetapi melihat kesalahan absolut kuantil dari fungsi-fungsi di atas menyoroti beberapa masalah terkait dengan probabilitas tinggi hasil 0 danekor gemuk ekstrim. Tentu saja, kesalahan tumbuh secara eksponensial dengan nilai Y yang lebih tinggi (ada juga nilai Y yang sangat besar di Max), tetapi yang lebih menarik adalah bahwa sangat bergantung pada model logit untuk memperkirakan 0s menghasilkan distribusi distribusi yang lebih baik (saya tidak akan ' tidak tahu cara menggambarkan fenomena ini dengan lebih baik):
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