关于R中DCchoice包dbchoice函数计算WTP均值与中位数的技术问询
你用DCchoice包dbchoice函数默认对数逻辑分布时,已经验证了WTP中位数($\exp(-\beta_{const}/\beta_{bid})$),现在要手动验证均值,结合Aizaki等人2014年的《Stated preference methods using R》,具体操作如下:
核心公式
对数逻辑分布下的WTP均值公式为:
$$WTP_{mean} = WTP_{median} \times \Gamma(1+\sigma) \times \Gamma(1-\sigma)$$
其中:
- $WTP_{median}$就是你已经验证过的$\exp(-\beta_{const}/\beta_{bid})$,$\beta_{const}$是受限模型的常数项,$\beta_{bid}$是投标变量的系数;
- $\sigma$是对数逻辑分布的尺度参数,对应模型误差项的尺度,可从
dbchoice的模型结果中提取。
手动验证步骤
提取模型参数
- 从你的
dbchoice模型结果里,取出常数项(比如model$coefficients["(Intercept)"])和投标系数(model$coefficients["bid"]); - 取出尺度参数$\sigma$,通常是模型结果的
scale属性(比如model$scale)。 - 注意:投标系数一般为负,计算时别搞反符号,确保$-\beta_{const}/\beta_{bid}$为正。
- 从你的
计算Gamma函数项
用R的gamma()函数计算两个Gamma值的乘积:sigma <- model$scale # 替换成你的模型尺度参数 gamma_product <- gamma(1 + sigma) * gamma(1 - sigma)计算均值WTP
先算出中位数,再乘以上面的Gamma乘积:beta_const <- model$coefficients["(Intercept)"] beta_bid <- model$coefficients["bid"] wtp_median <- exp(-beta_const / beta_bid) wtp_mean_manual <- wtp_median * gamma_product对比验证
把手动算出的wtp_mean_manual和dbchoice模型输出的WTP均值对比,只要浮点误差在可接受范围内,就说明验证正确。
补充说明
如果用的是标准logit模型(无尺度参数估计),此时误差项是标准Gumbel分布,WTP均值的计算会用到公式:
$$WTP_{mean} = \frac{-\beta_{const}}{\beta_{bid}} \times \frac{\pi}{\sin(\pi/\tau)}$$
其中$\tau$是离散参数,标准logit下$\tau=1$,但这个公式此时无意义——这种情况下模型的均值大概率是通过模拟方法得到的,你可以用模型的参数生成WTP样本后取均值来验证。
参考文献:Aizaki, H., Nakatani, T., Sato, K. 2014, Stated preference methods using R, CRC Press, Florida.
内容的提问来源于stack exchange,提问作者user26june23

