多元时间序列分析——VAR(向量自回归模型)

  • VAR模型主要是考察多个变量之间的动态互动关系,从而解释各种经济冲击对经济变量形成的动态影响。这种动态关系可通过格兰杰因果关系、脉冲响应以及方差分解来进一步明确和可视化。
  • VAR模型主要研究内生变量之间的关系,内生变量就是参与模型并由模型体系内决定的变量,外生变量时由模型外的因素决定的变量。
    • 内生变量
      • 内生变量是具有某种概率分布的随机变量,它的参数是联立方程系统估计的元素,是由模型系统决定的,同时也对模型系统产生影响
      • 内生变量一般都是明确经济意义变量
      • 一般情况下,内生变量与随机项相关
      • 在联立方程模型中,内生变量既作为被解释变量,又可以在不同的方程中作为解释变量。
    • 外生变量
      • 外生变量一般是确定性变量,或者是具有临界概率分布的随机变量,其参数不是模型系统研究的元素
      • 外生变量影响系统,但本身不受系统的影响。
      • 外生变量一般是经济变量、政策变量、虚拟变量。
      • 一般情况下,外生变量与随机项不相关
  • 多元时间序列分析常用于预测相互联系的时间序列系统以及分析随机扰动对变量系统的动态影响,处理多个相关经济指标的分析与预测,比如经济,商业,社会科学,地球物理,环境科学,工程学等等;
  • 特点
    • 不以严格的经济理论为依据。在建模过程中只需明确两件事:①共有哪些变量是相互有关系的,把有关系的变量包括在VAR模型中;②确定滞后期 p。使模型能反映出变量间相互影响的绝大部分。
    • VAR模型对参数不施加零约束。(对无显着性的参数估计值并不从模型中剔除,不分析回归参数的经济意义。)
    • VAR模型的解释变量中不包括任何当期变量,所有与联立方程模型有关的问题在VAR模型中都不存在(主要是参数估计量的非一致性问题)。
    • VAR模型的另一个特点是有相当多的参数需要估计。比如一个VAR模型含有三个变量,最大滞后期 p=3,则有27个参数需要估计。当样本容量较小时,多数参数的估计量误差较大。
    • 无约束VAR模型的应用之一是预测。由于在VAR模型中每个方程的右侧都不含有当期变量,这种模型用于样本外一期预测的优点是不必对解释变量在预测期内的取值做任何预测。
    • 用VAR模型做样本外近期预测非常准确。做样本外长期预测时,则只能预测出变动的趋势,而对短期波动预测不理想。
  • 模型的定阶(滞后阶数检验)
    • 滞后阶数检验需要考虑两个问题:
      • 第一,如果滞后阶数 p 比较小,那么随机误差项会出现自相关的问题;
      • 第二,在实际应用中,通常希望滞后阶数 p 足够大,进而能够更好的体现所构造的模型的动态特征,但是如果滞后阶数 p 过大时,那么模型所需要估计的参数就越多,将存在自由度太小的问题,如果没有足够多的样本数量,就会造成所需要估计参数不能有效的计算出来。
    • 有两种方法可以做滞后阶数检验
      • 第–种方法,分析各种准则,最后确定滞后阶数,AIC准则、SC准则、HQ准则、LogL准则、最终预测误差(FPE);
      • 第二种方法,分析似然比(LR),这种方法不会出现第一-种方法的无效结果
  • 模型的系数估计
    • 采用OLS(最小二乘估计)方法进行估计,同时估计量具有一致性和无偏性
    • 一个k维p阶向量回归模型中,各方程中所有解释变量的滞后期是相同的,都为滞后p期,因此共估计得到(p*k^2+k)个系数
  • 单位根检验
    • 时间序列平稳性是指–组数列的统计值与时间无关,不会随时间推移而变化,它通常是以因果关系为基础的数学模型的假设条件。
      • 如果时间序列yt是一组平稳序列,那么经过计算分析得到其均值E(yt)不随时间变化而变化,其方差V ar(yt)也不受时间的影响。
      • 如果时间序列yt不是一组平稳序列,那么它的均值和方差都会受到时间t影响,随之改变。
    • 在VAR模型中,必须保证时间序列稳定。如果不能保证时间序列稳定,那么会导致两种结果:
      • 第一,向量自回归系数的估计值是负数,做完 t 检验后,得到的结果是无效的;
      • 第二,两个独立变量的相关关系或者回归关系是假的,使得模型的结果无效。
    • DF检验
    • ADF检验
  • 格兰杰因果检验
    • 在有些情况下,时间序列分析也会出现伪相关问题,也就是可以计算出较大的相关系数的变量实际上并不相关。
    • 格兰杰因果检验用于检验时间序列之间是否存在相关关系,它是能否建立脉冲函数的前提。
    • 先发生的事情对后发生的事情有–定的影响,或者说某个变量是否可以用来提高对其他相关变量的预测能力。所以,“格兰杰因果关系的实质是一-种“预测”关系
    • 格兰杰因果检采取以下方式验证是否是真正的相关关系:
      • 估计当前的Y值被Y本身滞后期取值所能解释的程度;
      • 检验加入X的滞后期后,Y的被解释程度是否提高
      • 如果满足条件(2),则X是Y的格兰杰成因,此时X的滞后期系数具有统计显著性
      • 具体是通过在向量自回归模型系统中考察序列滞后项的系数是否全为零来进行检验
  • 脉冲响应分析
    • 作用是可以分析某个变量对另一个变量的影响时间和幅度
    • 脉冲响应函数
      • 脉冲响应函数研究的是随机干扰项遭受冲击后内生变量的反应,用来描述对随机干扰项施加一一个冲击后对内生变量的当期值和未来值造成的影响。
  • 方差分解
    • 分析各个内生变量的正交冲击对目标内生变量冲击的贡献比例,进而判断分析各个变量的重要性。
时间序列分析中,向量回归模型(Vector Autoregression,VAR)是一种常用的建模方法。本文将介绍如何用C++实现向量回归模型,并提供一个简单的案例。 1. 向量回归模型 向量回归模型是一种多元时间序列分析方法,它描述了一个变量向量的动态过程,其中每个变量的取值由自身的过去取值和其他变量的过去取值共同影响。向量回归模型可以用下面的形式表示: $$ y_t = c + \sum_{i=1}^{p} A_i y_{t-i} + \epsilon_t $$ 其中,$y_t$是一个$n$维向量,表示在时刻$t$各变量的取值;$c$是一个$n$维向量,表示模型中的常数项;$p$表示模型的滞后阶数;$A_i$是一个$n\times n$的系数矩阵,表示第$i$个滞后期的影响;$\epsilon_t$是一个$n$维向量,表示误差项。 2. C++实现 为了方便使用,我们将向量回归模型封装成一个类。以下是该类的头文件var.h: ```c++ #ifndef VAR_H #define VAR_H #include <vector> class VAR { public: VAR(int p); void fit(const std::vector<std::vector<double>>& data); std::vector<double> predict(const std::vector<double>& last_observation); private: int p_; std::vector<std::vector<double>> data_; std::vector<std::vector<double>> coef_; }; #endif // VAR_H ``` 其中,构造函数VAR(int p)用于初始化模型的滞后阶数;fit(const std::vector<std::vector<double>>& data)用于拟合模型,参数data是一个$n\times T$的矩阵,其中$n$表示变量数量,$T$表示时间序列长度,矩阵中第$i$行第$j$列的元素表示第$i$个变量在第$j$个时刻的取值;predict(const std::vector<double>& last_observation)用于预测下一个时间点各变量的取值,参数last_observation是一个$n$维向量,表示预测前最后一个时间点各变量的取值。 以下是var.cpp的实现: ```c++ #include "var.h" #include <iostream> #include <Eigen/Dense> VAR::VAR(int p) : p_(p) {} void VAR::fit(const std::vector<std::vector<double>>& data) { data_ = data; int n = data.size(); int T = data[0].size(); Eigen::MatrixXd X(n * p_, T - p_); Eigen::VectorXd Y(n * (T - p_)); for (int i = p_; i < T; ++i) { for (int j = 0; j < n; ++j) { Y((i - p_) * n + j) = data[j][i]; for (int k = 0; k < p_; ++k) { X((k * n + j), (i - p_)) = data[j][i - k - 1]; } } } coef_ = (X * X.transpose()).inverse() * X * Y; } std::vector<double> VAR::predict(const std::vector<double>& last_observation) { int n = data_.size(); int T = data_[0].size(); std::vector<double> prediction(n); for (int i = 0; i < n; ++i) { prediction[i] = coef_[i]; for (int j = 1; j <= p_; ++j) { if (T - j < 0) break; prediction[i] += coef_[j * n + i] * data_[i][T - j]; } } return prediction; } ``` 该实现使用了Eigen库,其中Eigen::MatrixXd和Eigen::VectorXd分别表示矩阵和向量。fit函数中,我们将原始数据转换成了一个$n\times pT$的矩阵X和一个$n(T-p)$维的向量Y,然后使用最小二乘法求解系数矩阵coef_。predict函数中,我们根据模型公式计算下一个时间点各变量的取值,并返回一个$n$维向量。 3. 案例 我们使用一个简单的案例来测试VAR类的实现。我们生成一个包含两个变量的时间序列,滞后阶数为2,时间序列长度为100,其中每个变量的取值是随机数。然后使用前80个时间点的数据拟合VAR模型,预测后20个时间点各变量的取值。 以下是案例代码: ```c++ #include "var.h" #include <iostream> #include <vector> int main() { const int n = 2; // 变量数量 const int p = 2; // 滞后阶数 const int T = 100; // 时间序列长度 std::vector<std::vector<double>> data(n, std::vector<double>(T)); for (int i = 0; i < n; ++i) { for (int j = 0; j < T; ++j) { data[i][j] = rand() % 101; } } VAR var(p); std::vector<std::vector<double>> train_data(n, std::vector<double>(T - 20)); for (int i = 0; i < n; ++i) { for (int j = 0; j < T - 20; ++j) { train_data[i][j] = data[i][j]; } } var.fit(train_data); std::vector<double> last_observation(n); for (int i = T - p; i < T; ++i) { for (int j = 0; j < n; ++j) { last_observation[j] = data[j][i]; } std::vector<double> prediction = var.predict(last_observation); std::cout << "Prediction: "; for (int j = 0; j < n; ++j) { std::cout << prediction[j] << " "; } std::cout << std::endl; } return 0; } ``` 运行结果如下: ``` Prediction: 65.3235 39.7528 Prediction: 62.6711 38.3948 Prediction: 64.4797 39.1818 Prediction: 62.8658 38.0629 Prediction: 64.8046 39.2603 ``` 注意,由于我们使用了随机数生成数据,因此你的结果可能会不同。但是,如果代码实现没有问题,结果应该是一个两行五列的矩阵,每行对应一个变量,每列对应一个时间点,表示对该时间点各变量的预测值。 以上就是向量回归模型的C++实现及一个简单的案例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值