R で多項プロビット モデルを推定するのに問題があります。2 つのパッケージを見つけましたが、どちらも満足のいく結果を得ることができませんでした。コードにバグはありますか? パッケージを間違って使用していますか?
ちょっとした例:
消費者は 3 つの選択肢に加えて、どの選択肢もとらないという外部オプションに直面します。外部オプションの効用はゼロに正規化されます。
u_i0 = 0
u_i1 = -20 + 1*age_i + epsilon_i1
u_i2 = 0 + epsilon_i2
u_i3 = 15 - 1*age_i + epsilon_i3
(ここでは、消費者にインデックスを付けます。)
(バグがないと仮定して) age が 11:50 で一様であり、イプシロンが年齢に関係なく iid Normal(0, 1) であるコード:
library(MNP) # Multinomial probit
library(mlogit) # Has a probit option
n <- 1000
df <- data.frame(age=sample(11:50, replace=TRUE, size=n))
constant <- c(-20, 0, 15)
coefficients <- rbind(c(1, 0, -1))
epsilon <- matrix(rnorm(n*3), nrow=n, ncol=3)
utility <- (matrix(rep(constant, n), nrow=1000, ncol=3, byrow=TRUE) +
as.matrix(df) %*% coefficients + epsilon)
isTRUE(all.equal(utility[1, ], as.vector(constant + coefficients * df$age[1] +
epsilon[1, ]))) # True as expected
df$choice <- max.col(utility)
max.utility <- apply(utility, 1, max)
df$choice[max.utility < 0] <- 0 # Take outside option when all product utilities < 0
df$choice <- factor(df$choice)
table(df$choice)
model.mnp <- mnp(choice ~ age, data=df, burnin=100)
summary(model.mnp) # Many of the 95% intervals don't contain the true value
model.mlogit <- mlogit(choice ~ 0 | age, data=df,
varying=NULL, shape="wide", probit=TRUE)
summary(model.mlogit)
モデルに係数を回復させたいのですが、mnp の推定値がずれているようです (または、非常にノイズが多いだけですか?)。mlogit は、システムが計算上特異であるというエラーを表示します。
何を試すべきですか?
編集:これは機能します(probit = FALSE):
model.mlogit <- mlogit(choice ~ 0 | age, data=df, varying=NULL, shape="wide", probit=FALSE)
summary(model.mlogit)
これは、およそ -30、0、22 の定数と、1.5、0、-1.4 の年齢係数を与えます。コードが実行され、妥当な見積もりが得られますが、データは通常のエラーで生成されるため、正確には正確ではありませんが、ロジットを正しく指定するには、エラーが極端な値である必要があります ( http://enを参照)。 .wikipedia.org/wiki/Logistic_regression#As_a_latent-variable_model )