随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型
原文链接:http://tecdat.cn/?p=9390
介绍
向量自回归(VAR)模型的一般缺点是,估计系数的数量与滞后的数量成比例地增加。因此,随着滞后次数的增加,每个参数可用的信息较少。在贝叶斯VAR文献中,减轻这种所谓的维数诅咒的一种方法是随机搜索变量选择(SSVS),由George等人提出(2008)。SSVS的基本思想是将通常使用的先验方差分配给应包含在模型中的参数,将不相关参数的先验方差接近零。这样,通常就可以估算出相关参数,并且无关变量的后验值接近于零,因此它们对预测和冲激响应没有显着影响。这是通过在模型之前添加层次结构来实现的,其中在采样算法的每个步骤中评估变量的相关性。
这篇文章介绍了使用SSVS估计贝叶斯向量自回归(BVAR)模型。它使用Lütkepohl(2007)的数据集E1,其中包含有关1960Q1至1982Q4十亿德国马克的西德固定投资,可支配收入和消费支出的数据。加载数据并生成数据:
library(bvartools) # install.packages("bvartools")# Load and transform datadata("e1")e1 <- diff(log(e1))# Generate VARdata <- gen_var(e1, p = 4, deterministic = "const")# Get data matricesy <- data$Y[, 1:71]x <- data$Z[, 1:71]
估算值
根据George等人所述的半自动方法来设置参数的先验方差(2008)。对于所有变量,先验包含概率设置为0.5。误差方差-协方差矩阵的先验信息不足。
# Reset random number generator for reproducibilityset.seed(1234567)t <- ncol(y) # Number of observationsk <- nrow(y) # Number of endogenous variablesm <- k * nrow(x) # Number of estimated coefficients# Coefficient priorsa_mu_prior <- matrix(0, m) # Vector of prior means# SSVS priors (semiautomatic approach)ols <- tcrossprod(y, x) %*% solve(tcrossprod(x)) # OLS estimatessigma_ols <- tcrossprod(y - ols %*% x) / (t - nrow(x)) # OLS error covariance matrixcov_ols <- kronecker(solve(tcrossprod(x)), sigma_ols)se_ols <- matrix(sqrt(diag(cov_ols))) # OLS standard errorstau0 <- se_ols * 0.1 # Prior if excludedtau1 <- se_ols * 10 # Prior if included# Prior for inclusion parameterprob_prior <- matrix(0.5, m)# Prior for variance-covariance matrixu_sigma_df_prior <- 0 # Prior degrees of freedomu_sigma_scale_prior <- diag(0, k) # Prior covariance matrixu_sigma_df_post <- t + u_sigma_df_prior # Posterior degrees of freedom
初始参数值设置为零,这意味着在Gibbs采样器的第一步中应相对自由地估算所有参数。
可以直接将SSVS添加到VAR模型的标准Gibbs采样器算法中。在此示例中,常数项从SSVS中排除,这可以通过指定来实现include = 1:36
。
具有SSVS的Gibbs采样器的输出可以用通常的方式进一步分析。因此,可以通过计算参数的绘制方式获得点估计:
## invest income cons## invest.1 -0.102 0.011 -0.002## income.1 0.044 -0.031 0.168## cons.1 0.074 0.140 -0.287## invest.2 -0.013 0.002 0.004## income.2 0.015 0.004 0.315## cons.2 0.027 -0.001 0.006## invest.3 0.033 0.000 0.000## income.3 -0.008 0.021 0.013## cons.3 -0.043 0.007 0.019## invest.4 0.250 0.001 -0.005## income.4 -0.064 -0.010 0.025## cons.4 -0.023 0.001 0.000## const 0.014 0.017 0.014
还可以通过计算变量的均值来获得每个变量的后验概率。从下面的输出中可以看出,在VAR(4)模型中似乎只有几个变量是相关的。常数项的概率为100%,因为它们已从SSVS中排除。
## invest income cons## invest.1 0.43 0.23 0.10## income.1 0.10 0.18 0.67## cons.1 0.11 0.40 0.77## invest.2 0.11 0.09 0.14## income.2 0.08 0.07 0.98## cons.2 0.07 0.06 0.08## invest.3 0.19 0.07 0.06## income.3 0.06 0.13 0.10## cons.3 0.09 0.07 0.12## invest.4 0.78 0.09 0.16## income.4 0.13 0.09 0.18## cons.4 0.09 0.07 0.06## const 1.00 1.00 1.00
给定这些值,研究人员可以按照常规方式进行操作,并根据Gibbs采样器的输出获得预测和脉冲响应。这种方法的优势在于它不仅考虑了参数不确定性,而且还考虑了模型不确定性。这可以通过系数的直方图来说明,该直方图描述了收入的第一个滞后项与消费当前值之间的关系。
hist(draws_a[6,], main = "Consumption ~ First lag of income", xlab = "Value of posterior draw")
通过两个峰描述模型不确定性,并通过右峰在它们周围的散布来描述参数不确定性。
但是,如果研究人员不希望使用模型,变量的相关性可能会从采样算法的一个步骤更改为另一个步骤,那么另一种方法将是仅使用高概率的模型。这可以通过进一步的模拟来完成,在该模拟中,对于不相关的变量使用非常严格的先验,而对于相关参数则使用没有信息的先验。
后方抽取的均值类似于Lütkepohl(2007,5.2.10节)中的OLS估计值:
## invest income cons## invest.1 -0.219 0.001 -0.001## income.1 0.000 0.000 0.262## cons.1 0.000 0.238 -0.334## invest.2 0.000 0.000 0.001## income.2 0.000 0.000 0.329## cons.2 0.000 0.000 0.000## invest.3 0.000 0.000 0.000## income.3 0.000 0.000 0.000## cons.3 0.000 0.000 0.000## invest.4 0.328 0.000 -0.001## income.4 0.000 0.000 0.000## cons.4 0.000 0.000 0.000## const 0.015 0.015 0.014
评价
bvar
功能可用于将Gibbs采样器的相关输出收集到标准化对象中,例如predict
获得预测或irf
进行脉冲响应分析。
bvar_est <- thin(bvar_est, thin = 5)
预测
可以使用函数获得可信区间的预测predict
。
plot(bvar_pred)
脉冲响应分析
plot(OIR, main = "Orthogonalised Impulse Response", xlab = "Period", ylab = "Response")
- system表空间不足的问题分析(二) (r8笔记第5天)
- golang基于redis lua封装的优先级去重队列
- python基础知识——内置数据结构(元组)
- python基础知识——控制语句
- python基础知识——基本语法
- 11g主库归档自动删除的小问题分析 (r8笔记第1天)
- JavaWeb02-CSS,JS(Java真正的全栈开发)
- 数据处理——One-Hot Encoding
- JavaWeb20-文件上传;下载(Java真正的全栈开发)
- 转--每周一个GoLang设计模式之组合模式
- 简单易学的机器学习算法——Softmax Regression
- JavaWeb19-Listener ; Filter
- dataguard归档路径的问题(r7笔记第99天)
- 厚土Go学习笔记 | 34. 一个简单的 web 服务器实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Nautilus:一款基于语法的反馈式模糊测试工具
- R可视化 | 地理信息空间(下)
- 21页优雅读博指南:佐治亚理工学院助理教授Eric Gilbert撰写,入坑前必读
- Too old resource version 引起 Flink JobManager 崩溃的问题定位
- SharpHose:一款基于C#开发的Windows异步密码喷射工具
- PyTorch版YOLOv4更新了,不仅适用于自定义数据集,还集成了注意力和MobileNet
- 一行代码不用写,就可以训练、测试、使用模型,这个star量1.5k的项目帮你做到
- Android画板开发之橡皮擦功能
- Android画板开发之基本画笔功能
- python递归函数求n的阶乘,优缺点及递归次数设置方式
- Python 给下载文件显示进度条和下载时间的实现
- pytorch 中的重要模块化接口nn.Module的使用
- 东京大学版「一生一芯」:自制CPU、C编译器,还成功运行了类Unix系统
- python实现将range()函数生成的数字存储在一个列表中
- Pytorch 使用不同版本的cuda的方法步骤