Ich habe eine abhängige Variable, die von 0 bis unendlich reichen kann, wobei Nullen tatsächlich korrekte Beobachtungen sind. Ich verstehe zensieren und Tobit Modelle gelten nur , wenn der tatsächliche Wert von ist teilweise unbekannt ist oder fehlt, wobei in diesem Fall Daten , die abgeschnitten werden. Weitere Informationen zu zensierten Daten in diesem Thread .
Aber hier ist 0 ein wahrer Wert, der zur Bevölkerung gehört. Das Ausführen von OLS für diese Daten hat das besonders ärgerliche Problem, negative Schätzungen vorzunehmen. Wie soll ich modellieren ?
> 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
Entwicklungen
Nachdem ich die Antworten gelesen habe, berichte ich über die Anpassung eines Gamma-Hürdenmodells mit leicht unterschiedlichen Schätzfunktionen. Die Ergebnisse sind für mich ziemlich überraschend. Schauen wir uns zuerst den DV an. Was offensichtlich ist, sind die extrem fetten Schwanzdaten. Dies hat einige interessante Konsequenzen für die Bewertung der Passform, die ich unten kommentieren werde:
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
Ich habe das Gamma-Hürdenmodell wie folgt gebaut:
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))
Schließlich habe ich die In-Sample- Anpassung mit drei verschiedenen Techniken bewertet :
# 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))
}
Zuerst bewertete ich die Anpassung anhand der üblichen Maßnahmen: AIC, Nullabweichung, mittlerer absoluter Fehler usw. Bei Betrachtung der quantilen absoluten Fehler der obigen Funktionen werden jedoch einige Probleme im Zusammenhang mit der hohen Wahrscheinlichkeit eines 0-Ergebnisses und dem Extrem hervorgehoben fetter Schwanz. Natürlich wächst der Fehler exponentiell mit höheren Werten von Y (es gibt auch einen sehr großen Y-Wert bei Max), aber was interessanter ist, ist, dass eine starke Verwendung des Logit-Modells zur Schätzung von Nullen eine bessere Verteilungsanpassung ergibt (ich würde nicht ' Ich weiß nicht, wie ich dieses Phänomen besser beschreiben kann.
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