Tengo una variable dependiente que puede variar de 0 a infinito, con 0s siendo observaciones correctas. Entiendo que los modelos de censura y Tobit solo se aplican cuando el valor real de es parcialmente desconocido o falta, en cuyo caso se dice que los datos están truncados. Más información sobre datos censurados en este hilo .
Pero aquí 0 es un verdadero valor que pertenece a la población. Ejecutar OLS en estos datos tiene el problema particular de llevar estimaciones negativas. ¿Cómo debo modelar ?
> 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
Desarrollos
Después de leer las respuestas, estoy informando el ajuste de un modelo de obstáculo Gamma usando funciones de estimación ligeramente diferentes. Los resultados son bastante sorprendentes para mí. Primero echemos un vistazo a la DV. Lo que es evidente son los datos de cola extremadamente gordos. Esto tiene algunas consecuencias interesantes en la evaluación del ajuste que comentaré a continuación:
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
Construí el modelo de obstáculo Gamma de la siguiente manera:
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))
Finalmente, evalué el ajuste en la muestra usando tres técnicas diferentes:
# 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))
}
Al principio estaba evaluando el ajuste mediante las medidas habituales: AIC, desviación nula, error absoluto medio, etc. Pero al observar los errores absolutos cuantiles de las funciones anteriores se destacan algunos problemas relacionados con la alta probabilidad de un resultado 0 y el extremo cola gorda Por supuesto, el error crece exponencialmente con valores más altos de Y (también hay un valor Y muy grande en Max), pero lo que es más interesante es que confiar mucho en el modelo logit para estimar 0 produce un mejor ajuste de distribución (no lo haría) No sé cómo describir mejor este fenómeno):
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