J'ai une variable dépendante qui peut aller de 0 à l'infini, les 0 étant en fait des observations correctes. Je comprends que la censure et les modèles Tobit ne s'appliquent que lorsque la valeur réelle de est partiellement inconnue ou manquante, auquel cas les données seraient tronquées. Quelques informations supplémentaires sur les données censurées dans ce fil .
Mais ici, 0 est une vraie valeur qui appartient à la population. L'exécution d'OLS sur ces données présente le problème particulièrement ennuyeux de porter des estimations négatives. Comment dois-je modéliser ?
> 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
Développements
Après avoir lu les réponses, je signale l'ajustement d'un modèle d'obstacle gamma en utilisant des fonctions d'estimation légèrement différentes. Les résultats me surprennent assez. Voyons d'abord le DV. Ce qui est évident, ce sont les données à queue extrêmement grasse. Cela a des conséquences intéressantes sur l'évaluation de l'ajustement que je commenterai ci-dessous:
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
J'ai construit le modèle d'obstacle Gamma comme suit:
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))
Enfin, j'ai évalué l' ajustement dans l'échantillon en utilisant trois techniques différentes:
# 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))
}
Au début, j'évaluais l'ajustement par les mesures habituelles: AIC, déviance nulle, erreur absolue moyenne, etc. Mais en regardant les erreurs absolues quantiles des fonctions ci-dessus, nous soulignons certains problèmes liés à la forte probabilité d'un résultat 0 et à l' extrême grosse queue. Bien sûr, l'erreur croît de façon exponentielle avec des valeurs plus élevées de Y (il y a aussi une très grande valeur Y à Max), mais ce qui est plus intéressant, c'est que s'appuyer fortement sur le modèle logit pour estimer les 0 produit un meilleur ajustement de distribution (je ne voudrais pas t savoir mieux décrire ce phénomène):
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