我目前正在从事一个涉及估计多项 logit 模型的行为建模项目。在互联网上搜索后,我发现了 mnlogit 包,它似乎非常适合我。
我试图建模的问题可以描述如下:向客户提供 5 种产品,他要从中选择 1 种或决定不选择任何一种。这些产品因价格和交货时间而异。这些产品的价格和交货时间在所有客户中都是固定的。因此,客户可以从 1、2、3、4、5 和 0 6 个选项中进行选择。选项 1 代表产品 1,而选项 0 代表不选择任何产品的选项。产品 1 和 2 的价格为 1 美元,产品 3 和 4 的价格为 2 美元,产品 5 的价格也为 1 美元。另一方面,备选方案 0 的成本为 0。
为了模拟客户的决定,我自己生成了 7 个参数。我将“价格”定义为替代自变量,这意味着所有替代品的价格对产品效用的权重相同。此外,我将“替代”定义为替代特定变量,它产生另外 6 个参数。我的目标是模拟产品由于交付时间而产生的吸引力,因为每个替代品都有固定的交付时间。我使用以下表达式计算了产品的效用:
product_utility = ( B_alternative [ alternativeNum ] * alternativeNum) + ( B_price * productPrice)
其中 B_alternative 是我的替代参数的向量:[0, 0.6, 0.5, 0.45, 0.3, 0.3],该向量的每个索引代表一个替代数字(B_alternative[0] :替代 0 的参数);B_price 是我的价格参数:-0.5。
所以,我为每个产品计算的效用是:0.00;0.10;0.50;0.35;0.20;1.00 ,是替代 0 的实用程序的第一个数字,产品 5 的最后一个数字。
在计算了这些效用后,我用以下表达式计算了客户选择第 n 个产品的概率:
Pn = exp(Un) / sum(exp(U))
其中 'sum(U)' 是所有实用程序的总和
计算出的概率(加起来为 1)为:0.1097376;0.1212788;0.1809268;0.1557251;0.1340338;0.2982978 ,对于从 0 到 5 的每个相应产品。
使用这些概率和随机函数,我在表中生成了一个“模式”列,代表客户的选择:
最后,按照我在 CRAN 上找到的文档,我编写了这段代码来估计模型:
artificialData <- read.csv(PathToData, sep = ";")
# define model description (formula)
fm <- formula(MODE ~ PRICE - 1 | 1 | ALT)
# Define a mlogit data
TestData <- mlogit::mlogit.data(artificialData,
choice = "MODE", shape = "long",
alt.levels = c(1,2,3,4,5,0),
id.var = "CUSTOMER_ID")
# Estimate mnl
fit <- mnlogit::mnlogit(fm, TestData)
print(summary(fit))
但是,无论我设置什么参数,我总是会收到以下两条错误消息:
solve.default(hessian, gradient, tol = 1e-24) 中的错误:Lapack 例程 dgesv:系统完全是奇异的:U[7,7] = 0
或者
在 sqrt(diag(vcov(object))) 中:产生了 NaN