ChoiceModelR,none = TRUE,“betadraw中的错误[good,] = newbeta [good,]”

时间:2017-04-21 13:28:28

标签: r bayesian hierarchical choice mlogit

我正在使用ChoiceModelR进行分层多项logit。我想估计外部商品的效用(遵循正态分布)。外部商品没有像内部商品那样的协变量 - 例如它不能有价格或品牌虚拟 - 所以我设置list(none = TRUE)并且不将此无选择添加到X数据(如ChoiceModelR的文档中所述),但仅添加到y(选择)数据。

迭代正常开始,然后在某个时刻停止并说

"Error in betadraw[good, ] = newbeta[good, ] :   NAs are not allowed in subscripted assignments". 

这可能是因为在“choicemodelr”函数的第388行中,“good”下标是NA。

我查看了有关choicemodelr(thisthisthis)以及下标中的NAs(thisthis)的一些问题,但我的猜测是我的问题是特定于这个函数的,因为迭代中的某些输入可能会变得如此之大/小,以至于“好”将转为NA。

下面是一个非常简单的例子。我使用3种不同属性的产品生成数据。在一半的时间内,不提供产品3。 2000年的消费者有偏好 - 正常分布 - 超过3个属性(以及对外部商品的偏好)。添加Logit错误以与模型一致。外部商品被索引为产品4(当选择集中有3个和2个产品时)。

我怎样才能避免NA错误?我做错了什么,或者它是函数中的一般错误?

我还在网上搜索了设置选项none = TRUE的例子,但我没有找到任何可重复的例子。也许这个选项只是有问题的,因为如果我设置none = FALSE就没有问题恢复真正的参数,并且我不允许客户选择外部选项。

因此导致NA错误的代码如下:

library("ChoiceModelR")
library("MASS")

set.seed(36)

# Set demand pars
beta_mu = c(-3,4,1)
beta_sigma = diag(c(1,1,1))
alfa_mu = 5  #outside good mean utility
alfa_sigma = 2  #outside good sd

# Three/two products, 3 vars (2 continuous,1 dummy)
threeprod <- list()
twoprod <- list()
purchase <- list()

for (t in 1:1000){
  threeprod[[t]] = cbind(rep(t,3),c(1,1,1),c(1,2,3),runif(3),runif(3),ceiling(runif(3,-0.5,0.5)))
  purchase[[t]] = which.max(rbind(threeprod[[t]][,c(4,5,6)]%*%mvrnorm(1,beta_mu,beta_sigma) + 
    matrix( -log(-log(runif(3))), 3, 1),rnorm(1,alfa_mu,alfa_sigma)) )
  threeprod[[t]] = cbind(threeprod[[t]],c(purchase[[t]],0,0))
}

for (t in 1001:2000){
  twoprod[[t]] = cbind(rep(t,2),c(1,1),c(1,2),runif(2),runif(2),ceiling(runif(2,-0.5,0.5)))
  purchase[[t]] = which.max(rbind(twoprod[[t]][,c(4,5,6)]%*%mvrnorm(1,beta_mu,beta_sigma) + 
    matrix( -log(-log(runif(2))), 2, 1),rnorm(1,alfa_mu,alfa_sigma)) )
  if (purchase[[t]] == 3) {purchase[[t]] <- 4}
  twoprod[[t]] = cbind(twoprod[[t]],c(purchase[[t]],0))
}

X <- rbind(do.call(rbind,threeprod),do.call(rbind,twoprod))

xcoding <- c(1,1,1)

mcmc = list(R = 5000, use = 2000)
options = list(none=TRUE, save=TRUE, keep=5)

out = choicemodelr(X, xcoding, mcmc = mcmc,options = options)

1 个答案:

答案 0 :(得分:0)

你必须按ID,Set,Alt ...对它们进行排序,以解决错误(你得到的相同)问题必须按照给定问题中的回答者ID,设定数量(问题)和替代品进行排序。