最近,用NLogit软件拟合多层巢式Logit模型时遇到了一些报错问题。尽管在论坛和贴吧上寻求了帮助,但未能找到有效的解决方案。具体报错信息如下:
Error 1026: Singular VC may mean model is unidentified. Check tree.
Error 1027: Models - estimated variance matrix of estimates is singular.
Error 1027: Models - estimated variance matrix of estimates is singular.
经过查阅NLOGIT使用手册,我发现错误1027实际上只是一个警告,而错误1026提示模型未被识别,需要检查树结构。我起初认为是树结构定义有问题,但经过仔细检查,发现树的定义并无错误。最终,我仔细查阅手册,发现问题的根源在于模型中的待拟合常数项数量超过了N(选择项数量)-1个,导致了模型出现过拟合。例如:当有5个出行方案时,对应的5个效用函数中应包含4个常数项。因为有一个选择项被作为参照项,其效用函数的常数项默认设为0。另外,在多层巢式Logit模型中,各选择肢的层与层之间存在一个IV(包容值),也是待估计的常数项,这就可能导致待拟合的常数项数量>5个。
在拟合巢式Logit模型时,一般要求效用函数中待拟合的常数项数量应≤N-1个。但经过我测试表明,待拟合常数项数量≤N个亦可行。以下是一个三层巢式结构的具体例子:
在这个结构中,
第1层与第2层共有3个IV,分别为λ_F1、λ_F2和λ_F3。
第2层与第3层共有2个IV,分别为λ_Q1和λ_Q2。
假设选项A作为参照项,其常数项默认为0,其余选项B、C、D和E的效用函数各有一个常数项。这样总共有9个待估计的常数项:λ_F1、λ_F2、λ_F3、λ_Q1、λ_Q2、λ_ConstB、λ_ConstC、λ_ConstD、λ_ConstE。直接用NLogit拟合模型会报错,需要手动设置某些包容值,确保待拟合的常数项数量不超过5个。
在这个例子中,选择肢Q1-F1-A、F2-B和W-Q2只有一个选项,在巢式Logit模型中这种选择肢被视为退化肢,通常这种选择肢层与层之间的包容值一般默认为1。因此,将包容值λ_Q1、λ_Q2、λ_F1和λ_F2均设为1。此时剩5个待估计常数项,满足待拟合常数项的数量不超过选择项数量N的要求,再去执行拟合就可成功了。具体设置包容值的语法如下:
; Ivset:(Q1,Q2)=[1]/(F1,F2)=[1]
这样设置后就不会出现上述错误了。具体巢式Logit的拟合操作将在后续继续分享。