R语言BMR包estim_mcmc触发递归错误致会话终止求助
使用BMR包估计DSGE模型MCMC时的递归错误解决求助
我尝试用R语言的BMR(Bayesian Macroeconomics in R)包进行DSGE模型的MCMC估计,运行obj$estim_mcmc(x,50,100,100)时触发如下递归错误,R会话直接终止,必须重启。已尝试gc()清理内存无效,在包的GitHub仓库提交问题后无回复。希望不依赖MATLAB/Octave实现DSGE建模,求助解决该报错问题。
错误信息
Error: no more error handlers available (recursive errors?); invoking 'abort' restart Error: no more error handlers available (recursive errors?); invoking 'abort' restart Error: no more error handlers available (recursive errors?); invoking 'abort' restart Error in tryCatch(evalq((function (parameters) : bad value Error: no more error handlers available (recursive errors?); invoking 'abort' restart Error in parent.frame() : 'rho' must be an environment not promise: detected in C-level eval Error during wrapup: R_Reprotect: only 0 protected items, can't reprotect index 33 Error: no more error handlers available (recursive errors?); invoking 'abort' restart
复现代码
rm(list=ls()) library(BMR) source("nkm_model.R") # 处理数据 data(BMRVARData) dsgedata <- USMacroData[24:211,-c(1,3)] dsgedata <- as.matrix(dsgedata) for(i in 1:2){ dsgedata[,i] <- dsgedata[,i] - mean(dsgedata[,i]) } # 初始化DSGE模型对象 obj <- new(dsgevar_gensys) obj$set_model_fn(nkm_model_simple) x <- c(1) obj$eval_model(x) # 求解模型并生成模拟数据 lrem_obj = obj$lrem lrem_obj$solve() lrem_obj$shocks_cov <- matrix(c(1,0,0,0.125),2,2,byrow=TRUE) sim_data <- lrem_obj$simulate(200,800)$sim_vals sim_data <- cbind(sim_data[,3],sim_data[,5]) # 设置先验 prior_pars <- cbind(c(1.0), c(0.05)) prior_form <- c(1) obj$set_prior(prior_form,prior_pars) # 设置参数边界 par_bounds <- cbind(c(-Inf), c( Inf)) opt_bounds <- cbind(c(0.7), c(3.0)) obj$set_bounds(opt_bounds[,1],opt_bounds[,2]) obj$opt_initial_lb <- opt_bounds[,1] obj$opt_initial_ub <- opt_bounds[,2] # 构建模型并估计模式 cons_term <- TRUE p <- 1 lambda <- 1.0 obj$build(sim_data,cons_term,p,lambda) mode_res <- obj$estim_mode(x,TRUE) mode_check(obj,mode_res$mode_vals,25,1,"eta") # 设置MCMC初始边界并运行估计(错误发生处) obj$mcmc_initial_lb <- opt_bounds[,1] obj$mcmc_initial_ub <- opt_bounds[,2] obj$estim_mcmc(x,50,100,100) # error here # 后续绘图与分析代码 var_names <- c("Output Gap","Output","Inflation","Natural Int","Nominal Int","Labour Supply", "Technology","MonetaryPolicy") plot(obj,par_names="eta",save=FALSE) IRF(obj,20,var_names=colnames(dsgedata),save=FALSE) forecast(obj,10,back_data=10) states(obj)
排查方向与解决建议
- 检查模型函数维度匹配:确认
nkm_model_simple中定义的方程、状态变量、观测变量维度与输入数据完全一致,这种递归崩溃常因内部数值计算维度不兼容触发C层错误。 - 调整MCMC起始点与迭代设置:
- 不要用初始值
x <- c(1)作为MCMC起点,改用模式估计结果mode_res$mode_vals,命令改为obj$estim_mcmc(mode_res$mode_vals,50,100,100),避免从远离后验模式的点引发数值不稳定。 - 先大幅减少迭代数测试,比如把热身迭代(50)和采样迭代(100)都改成10,确认是否还崩溃,逐步定位问题来源。
- 不要用初始值
- 更新包与R版本:
- 重新安装最新版BMR包:
install.packages("BMR", repos="http://cran.us.r-project.org"),旧版本可能存在内存管理或C层调用的已知bug。 - 换用不同版本的R(如4.2.x或4.3.x)测试,递归错误有时与R的内存保护机制版本相关。
- 重新安装最新版BMR包:
- 简化模型定位问题:先将DSGE模型简化为最小可运行版本(比如仅包含核心方程),确认MCMC能正常运行后再逐步添加复杂度,找到引发崩溃的模型部分。
- 替代R方案:如果BMR的问题无法解决,可考虑:
- 使用
dynareR包:无需手动编写MATLAB代码,通过R调用Dynare完成DSGE建模。 - 用
rstan自定义实现贝叶斯DSGE的MCMC采样,灵活性更高。 - 尝试Julia语言的
DSGE.jl包,可通过R与Julia的交互工具调用。
- 使用
内容的提问来源于stack exchange,提问作者Matheus Girola
相关产品推荐
相关产品推荐

