0から無限大までの範囲の従属変数があり、0は実際には正しい観測値です。打ち切りとTobitモデルは、の実際の値が部分的に不明または欠落している場合にのみ適用されることを理解しています。この場合、データは切り捨てられると言われます。このスレッドの打ち切りデータに関するいくつかの詳細。
しかし、ここで0は母集団に属する真の値です。このデータでOLSを実行すると、負の推定を行うのに特に厄介な問題があります。をモデル化するにはどうすればよいですか?
> 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
開発
回答を読んだ後、少し異なる推定関数を使用して、ガンマハードルモデルの適合を報告します。結果は私にはかなり驚くべきものです。まず、DVを見てみましょう。明らかなのは、非常に太い尾のデータです。これは、以下でコメントする、適合度の評価に興味深い結果をもたらします。
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
ガンマハードルモデルを次のように作成しました。
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))
最後に、3つの異なる手法を使用してサンプル内フィットを評価しました。
# 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))
}
最初、私は通常の測度(AIC、ヌル逸脱、平均絶対誤差など)でフィットを評価していました。しかし、上記の関数の分位絶対誤差を見ると、0の結果の高い確率と極値に脂肪の尾。もちろん、Yの値が大きくなるとエラーは指数関数的に増加します(最大値には非常に大きなY値もあります)。しかし、興味深いのは、ロジットモデルに大きく依存して0を推定すると、より良い分布適合が得られることです(私はこの現象をよりよく説明する方法を知っている):
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