rJAGS使用自定义密度采样出现Node::setValue长度不匹配错误求解
代码存在的几个核心错误
- 未正确实现零/一trick逻辑:自定义密度采样的零trick核心是引入固定为0的虚拟观测节点,让该节点服从
dpois(负对数似然)分布,而非直接把原始连续型观测x套用到离散泊松分布dpois上,这是触发报错的核心原因。 - 分布与观测类型不匹配:你生成的x是连续浮点数值,而
dpois是离散分布,仅支持整数型观测值,类型不兼容直接触发了Length mismatch in Node::setValue报错。 - 似然逻辑未关联观测数据:你给出的负对数似然公式
-N*log(1-exp(-(1/mu)))中完全没有用到输入观测x的信息,也没有用到你预处理得到的删失指示符censor,等于模型拟合和输入数据完全无关,即使不报错也无法得到正确的参数估计结果。 - 冗余的参数重复定义:和循环索引i完全无关的
lambda被放在for循环内部,重复定义了N次同一个标量参数,属于不必要的逻辑冗余,也会提升节点解析的出错概率。
基础修正方案
首先在传入模型的数据中新增零trick需要的虚拟观测:
jags <- jags.model(model1.spec, data = list('x' = x, 'N' = N, 'zeros' = 0), # 新增固定为0的虚拟观测 n.chains=4, n.adapt=100)
对应的模型字符串调整为如下结构,你需要根据自己的自定义密度和删失逻辑,把x和censor的计算逻辑补充到lambda的计算中:
model { # 零trick绑定自定义似然 zeros ~ dpois(lambda) lambda <- -N*log(1-exp(-(1/mu))) # 此处需补充x、censor相关的似然计算逻辑 mu ~ dlnorm(mup, taup) mup <- log(.0001) taup <- 1/49 R <- 1 - exp(-(1/mu) * .0001) }
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

