使用logitr包估算绿色基础设施WTP时缺失z值的技术咨询
解决logitr包MNL模型标准误、z值及p值为NA的问题
核心问题分析
从你的模型输出看,存在两个关键问题:
- 部分变量(
age、gar)系数估计为0,说明模型无法识别这些变量的影响; - 所有系数的标准误、z值、Pr(>|z|)均为NA,这是因为优化过程中无法计算Hessian矩阵(用于估计标准误),通常源于模型设定错误或变量识别不足。
解决方案
1. 修正模型设定:区分备选方案属性与个体属性
你的数据中,age、edu、bud、act属于个体属性(每个受访者的特征,同一id下不同备选方案的变量值相同),而price、gar、gre属于备选方案属性(每个备选方案的特征,同一id下不同备选方案的变量值不同)。
在MNL模型中,个体属性不能直接作为全局参数纳入pars——因为同一观测下不同备选方案的个体属性值完全相同,会导致模型识别失效,进而引发Hessian矩阵奇异。
正确做法:将个体属性与备选方案做交互,让系数反映个体属性对特定备选方案选择概率的影响。示例代码:
# 生成个体属性与备选方案2的交互项(以alt=2为参照) wtp2.7 <- wtp2.7 %>% mutate( age_alt2 = age * (alt == 2), edu_alt2 = edu * (alt == 2), bud_alt2 = bud * (alt == 2), act_alt2 = act * (alt == 2) ) # 重新拟合模型:仅纳入备选方案属性和交互项 model <- logitr( data = wtp2.7, outcome = "choice", obsID = "id", pars = c("price", "gar", "gre", "age_alt2", "edu_alt2", "bud_alt2", "act_alt2") )
2. 移除无解释力的变量
age和gar的系数估计为0,说明这些变量对选择行为没有显著解释力,建议先从模型中移除,再重新拟合,观察标准误是否恢复:
model_simplified <- logitr( data = wtp2.7, outcome = "choice", obsID = "id", pars = c("price", "gre", "edu_alt2", "bud_alt2", "act_alt2") )
3. 调整优化算法与参数
模型退出状态为3(因函数容差达到而停止优化),可以尝试更换优化算法或调整容差参数,确保Hessian矩阵能被正确计算:
model_optim <- logitr( data = wtp2.7, outcome = "choice", obsID = "id", pars = c("price", "gre", "edu_alt2", "bud_alt2", "act_alt2"), algorithm = "NLOPT_LD_SLSQP", # 更换为SLSQP算法 ftol_rel = 1e-10, # 减小相对容差 ftol_abs = 1e-10 # 减小绝对容差 )
4. 直接在WTP空间拟合模型
既然你的目标是估算支付意愿(WTP),可以直接在WTP空间拟合模型,输出结果将直接包含WTP值及其标准误,无需后续转换:
model_wtp <- logitr( data = wtp2.7, outcome = "choice", obsID = "id", pars = c("gre", "edu_alt2", "bud_alt2", "act_alt2"), # 移除price,单独指定为支付变量 price = "price", space = "wtp" ) summary(model_wtp) # 查看包含WTP及标准误的结果
5. 验证数据格式
确保数据符合logitr的要求:
- 每个
id对应多个alt,且每个id的choice列仅有一个1(表示选中的备选方案); - 备选方案属性变量(如
price)在同一id的不同alt间存在差异。
内容的提问来源于stack exchange,提问作者MiAe Jeong
相关产品推荐
相关产品推荐

