You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的内存保护机制版本相关。
  • 简化模型定位问题:先将DSGE模型简化为最小可运行版本(比如仅包含核心方程),确认MCMC能正常运行后再逐步添加复杂度,找到引发崩溃的模型部分。
  • 替代R方案:如果BMR的问题无法解决,可考虑:
    • 使用dynareR包:无需手动编写MATLAB代码,通过R调用Dynare完成DSGE建模。
    • 用rstan自定义实现贝叶斯DSGE的MCMC采样,灵活性更高。
    • 尝试Julia语言的DSGE.jl包,可通过R与Julia的交互工具调用。

内容的提问来源于stack exchange,提问作者Matheus Girola

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:40:25