3

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 )

4

0 に答える 0