在R中开展选择实验时的WTP计算问题求助
R语言计算选择实验WTP的问题解决方案
问题梳理
你在开展可持续产品选择实验的WTP(支付意愿)计算时,使用两种方法均遇到错误:一是glmer搭配wtp.gmnl报错,二是logitr包因obsID设置错误无法建模。
核心数据问题
你的数据缺少选择任务ID:每个受访者(ID列)会完成多个选择任务,每个任务包含若干备选方案,同一任务下的所有方案需要共享一个任务ID,这是离散选择模型建模的核心要求。
第一种方法(glmer + WTP计算)的修复
错误根源
indv变量赋值错误:你将其设为固定字符串,而非引用受访者ID列,导致随机截距无效。- 未定义
choice变量:模型中(1|choice)的choice未创建,需要生成选择任务ID。 - 工具不兼容:
wtp.gmnl仅适配gmnl包模型,无法直接用于lme4的glmer模型。
修复步骤
- 生成必要变量:
library(dplyr) # 假设每个选择任务包含3个备选方案,根据你的实验设计调整n()后的除数 db <- db %>% group_by(ID) %>% mutate( indv = ID, # 正确绑定受访者ID choice_task = rep(1:(n()/3), each=3) # 生成选择任务ID ) %>% ungroup() - 重构glmer模型:
library(lme4) model <- glmer( chosen ~ general_sust + ecosust + socialsust + price + (1|indv) + (1|choice_task), data = db, family = binomial ) - 手动计算WTP:
WTP公式为「属性系数 / (-价格系数)」,直接提取模型系数计算:coefs <- fixef(model) price_coef <- coefs["price"] # 计算各属性水平相对于基准(none)的WTP wtp <- coefs[!names(coefs) %in% c("(Intercept)", "price")] / (-price_coef) print(wtp)
第二种方法(logitr包)的修复
错误根源
obsID需要的是选择任务ID(同一任务下的所有选项共享同一ID),但你用了受访者ID,导致同一obsID对应多个不同任务,违反了logitr的要求。
修复步骤
- 生成选择任务ID:
db <- db %>% group_by(ID) %>% mutate( obsID = rep(1:(n()/3), each=3) # 按任务分组,每个任务下的选项共享ID ) %>% ungroup() - 转换结果变量类型:
将chosen列的WAHR/FALSCH转为0/1数值型:db$chosen <- ifelse(db$chosen == "WAHR", 1, 0) - 建模并计算WTP:
library(logitr) # 构建模型,若需随机系数模型,添加randPars参数;否则可省略 model <- logitr( data = db, outcome = "chosen", obsID = "obsID", pars = c("price", "ecosust", "socialsust", "general_sust") ) # 计算WTP wtp_result <- wtp(model, priceName = "price") print(wtp_result)
重要提示
- 务必根据你的实际实验设计调整选择任务ID的生成逻辑(比如每个任务的选项数量)。
- 分类属性会被自动处理为虚拟变量,WTP结果是各水平相对于基准水平(如
none)的支付意愿差值。
内容的提问来源于stack exchange,提问作者sabrisabrisabri
相关产品推荐
相关产品推荐

