在rjags并行拟合中配置half-Cauchy先验报错,求正确设置方法
问题
在使用rjags并行拟合模型时,尝试设置half-Cauchy先验,编写了如下代码:
model <- function(){ ... # rho.b ~ dunif(-0.99, 0.99) tau_h ~ dt(0, 1, 1)T(0,) tau_b ~ dt(0, 1, 1)T(0,) precision_h <- 1/(pow(tau_h,2)) precision_b <- 1/(pow(tau_b,2)) rho.h ~ dnorm(0, precision_h) rho.b ~ dnorm(0, precision_b) ... } params <- c("lambda.adj","lambda.1","L.0","L.1","b.adj","b1","beta.adj","beta.0","rho.b","rho.h","sigma.hzd","sigma.b") cl <- makePSOCKcluster(3) tmp <- clusterEvalQ(cl, library(dclone)) parLoadModule(cl, 'glm') parLoadModule(cl, 'lecuyer') parLoadModule(cl, 'dic') model.t1 <- jags.parfit(cl = cl, data = data, params = params, model = model, n.chains = 3, n.update = 10000, n.iter = 7000, thin = 1)
运行时收到错误:
Error: unexpected symbol in: " # rho.b ~ dunif(-0.99, 0.99) tau_h ~ dt(0, 1, 1)T"
即使改为tau_h ~ dt(0, 1, 1) T(0,),仍出现相同错误,请问如何正确设置half-Cauchy先验?
解决方法
错误原因
你将JAGS模型写在了R函数中,R会优先解析函数内的代码。JAGS的截断语法T(0,)在R中会被识别为对逻辑值T(即TRUE)的函数调用,这属于非法的R语法,因此触发了解析错误。
正确写法
将JAGS模型定义为字符串,避免R解析模型内部的JAGS语法。同时,JAGS中截断分布的标准语法是在分布后加空格再写T(lower, upper),half-Cauchy有两种常用定义方式:
方式1:用自由度为1的t分布截断
half-Cauchy等价于自由度为1的学生t分布截断在正半轴,代码如下:
# 模型定义为字符串 model <- " model{ ... # rho.b ~ dunif(-0.99, 0.99) tau_h ~ dt(0, 1, 1) T(0, ) tau_b ~ dt(0, 1, 1) T(0, ) precision_h <- 1/(pow(tau_h,2)) precision_b <- 1/(pow(tau_b,2)) rho.h ~ dnorm(0, precision_h) rho.b ~ dnorm(0, precision_b) ... } " # 后续并行代码保持不变 params <- c("lambda.adj","lambda.1","L.0","L.1","b.adj","b1","beta.adj","beta.0","rho.b","rho.h","sigma.hzd","sigma.b") cl <- makePSOCKcluster(3) tmp <- clusterEvalQ(cl, library(dclone)) parLoadModule(cl, 'glm') parLoadModule(cl, 'lecuyer') parLoadModule(cl, 'dic') model.t1 <- jags.parfit(cl = cl, data = data, params = params, model = model, n.chains = 3, n.update = 10000, n.iter = 7000, thin = 1)
方式2:直接用Cauchy分布截断(更直观)
JAGS原生支持dcauchy分布,直接截断为正半轴更贴合half-Cauchy的定义:
model <- " model{ ... # rho.b ~ dunif(-0.99, 0.99) tau_h ~ dcauchy(0, 1) T(0, ) tau_b ~ dcauchy(0, 1) T(0, ) precision_h <- 1/(pow(tau_h,2)) precision_b <- 1/(pow(tau_b,2)) rho.h ~ dnorm(0, precision_h) rho.b ~ dnorm(0, precision_b) ... } "
额外提示
如果坚持要用R函数返回模型文本,需用cat()或paste()拼接JAGS代码,避免R解析特殊语法:
model <- function(){ cat(" model{ ... tau_h ~ dt(0, 1, 1) T(0, ) tau_b ~ dt(0, 1, 1) T(0, ) precision_h <- 1/(pow(tau_h,2)) precision_b <- 1/(pow(tau_b,2)) rho.h ~ dnorm(0, precision_h) rho.b ~ dnorm(0, precision_b) ... } ") }
内容的提问来源于stack exchange,提问作者Chinyako
相关产品推荐
相关产品推荐

