我在估计 R 中的多项概率模型时遇到了麻烦。我找到了两个包,但我都没有得到令人满意的结果。我的代码中有错误吗?我是否错误地使用了这些软件包?
一个小例子:
消费者面临 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
(这里我索引消费者。)
代码,其中(假设没有错误)年龄在 11:50 是统一的,并且 epsilon 是 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 的年龄系数。代码运行并给出了合理的估计——但它们并不完全正确,因为生成的数据带有正常错误,而要正确指定 logit,错误必须是极值(参见http://en .wikipedia.org/wiki/Logistic_regression#As_a_latent-variable_model)