Eu tenho uma variável dependente que pode variar de 0 a infinito, com 0s sendo realmente observações corretas. Entendo que os modelos de censura e Tobit só se aplicam quando o valor real de é parcialmente desconhecido ou ausente, caso em que os dados são considerados truncados. Mais algumas informações sobre dados censurados neste segmento .
Mas aqui 0 é um valor verdadeiro que pertence à população. A execução do OLS nesses dados tem o problema irritante específico de levar estimativas negativas. Como devo 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
Desenvolvimentos
Depois de ler as respostas, estou relatando o ajuste de um modelo de barreira gama usando funções de estimativa ligeiramente diferentes. Os resultados são bastante surpreendentes para mim. Primeiro, vamos olhar para o DV. O que é aparente são os dados de cauda extremamente gordos. Isso tem algumas conseqüências interessantes na avaliação do ajuste que irei comentar abaixo:
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
Criei o modelo de obstáculos Gamma da seguinte maneira:
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, avaliei o ajuste dentro da amostra usando três 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))
}
Inicialmente, eu estava avaliando o ajuste pelas medidas usuais: AIC, desvio nulo, erro absoluto médio etc. Mas, observando os erros absolutos quantílicos das funções acima, destacamos alguns problemas relacionados à alta probabilidade de um resultado 0 e ao extremo cauda gorda. Obviamente, o erro cresce exponencialmente com valores mais altos de Y (também existe um valor Y muito grande em Max), mas o mais interessante é que depender muito do modelo de logit para estimar 0 produz um melhor ajuste de distribuição (eu não não sei como descrever melhor esse 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