Matlab:计算时间序列模型协方差矩阵的逆矩阵

4

<code>x(n) = \sum_{j=1}^p a_jx(n-j) + u(n)</code>

这是一个一元自回归 AR 模型,阶数为 p = 2,数据样本为N,由高斯零均值噪声 u 驱动,方差为 sigma_u^2.

我了解到函数 cov(x),但我如何使用它来获取 AR 模型的系数的 pxp 协方差矩阵 C(n) 及其逆矩阵 S(n) = C(n) 呢?逆协方差矩阵 S(n) 的数学公式表示为:

Invcovformula

其中 A_1 和 A_2 是下三角 Toeplitz 矩阵。

InverseCOv

我可以直接执行 pinv(Cov(coefficients)) 吗?我也不确定如何将 AR 系数作为参数传递给该函数。

如何实现这个公式?谢谢帮助。


正如你所知,StackOverflow不支持TeX/LaTeX。请将其删除(除非它确实是代码,请勿将其格式化为代码)。如果您绝对需要显示一个方程式,请像您已经做过的那样使用图像。 - horchler
我知道cov的东西,但不知道AR。你有什么AR模型的输出?cov()函数是用于在给定变量的一堆观测/样本(输入=观测x变量数组)的情况下数值计算协方差的,不确定这里是否适用。如果您想要系数的协方差,是否有一个公式来产生系数本身的样本?(a_i值是否为这些系数?) AR可能有一个封闭形式的解,但我不知道它是什么。 - Andrew Janke
2
@AndrewJanke:感谢您的意见和观察。系数a_i是使用最大似然估计器估计的。系数的均方误差的下限通常由Cramer Rao下限(CRLB)确定。CRLB的公式包含系数的pbyp矩阵的协方差的逆项。我知道可以找到数据的协方差,但我不知道如何为任何时间序列模型的系数情况找到协方差。AR模型的输出是一个一维时间序列,我们从中估计未知系数。 - SKM
感谢提供额外信息。恐怕我在这方面已经超出了我的能力范围。希望其他更熟悉AR模型的人可以加入讨论。 - Andrew Janke
1
我认为你的问题表述不清。根据你的评论,我猜测你对时间序列的协方差不感兴趣,而是对模型系数的最大似然(ML)估计的协方差感兴趣。如果是这样,那么cov函数并不是你要找的。你应该使用估计的系数a_j构建p-by-p矩阵A_1A_2,因为ML估计器还提供了噪声方差sigma的估计值(假设它确实提供)。 - lmillefiori
显示剩余3条评论
1个回答

1
您的问题完全不合适,正如其他人所指出的那样,所以我建议您先阅读一些内容并思考您真正想做什么。尽管如此,我可以提供一些指导,这实际上更多地涉及概念的梳理而非编程。基于问题和评论,您的问题应该重新表述为:“如何估计通过最大似然估计获得参数的AR(n)模型的参数协方差矩阵?”在这种情况下,我们可以回答如下。
  1. 为了讨论起见,让我们首先生成一些测试数据
>> rng(0);
>> n = 10000;
>> x = rand(n,2);

2. 先通过运行OLS巧妙地获得初始条件。这是大多数人估计自回归的方式(向量自回归文献中的几乎全部),在某些条件下,OLS和MLE在渐近意义下是等价的。如果要包括常数项(如果您使用的是非去均值数据,则需要这样做),请包括一个零列。在输出中,b是您的参数估计向量,C是相应的标准误向量。
>> X = [x,ones(n,1)];
>> [b,C]=lscov(X,y)

b =

    4.9825
    9.9501
   20.0227


C =

    0.0347
    0.0345
    0.0266

在进行极大似然估计之前,您需要首先有一个似然函数。我们可以将其构建为几个简单的匿名函数的组合。我们还需要构建一个初始条件向量,其中包括预测误差的标准偏差,因为这是我们将使用MLE估计的内容之一。在这种情况下,我假设您希望误差服从正态分布,并基于此进行示例,但您没有说明,当然可以选择任何分布(不使用正态分布通常是不进行OLS的动机)。此外,我将构建一个负对数似然,因为我们正在使用最小化程序。
>> err = @(b) y - X*b

err = 

    @(b)y-X*b

>> std(err(b))

ans =

    0.9998

>> b0 = [b; std(err(b))];
>> nll = @(b) (n/2)*log(2*pi*b(end)^2) + (1/(2*b(end)^2))*sum(err(b(1:end-1)).^2);
  1. 接下来使用某种最小化程序(例如,fminsearchfminunc等)进行MLE
>> bmle = fminsearch(nll,b0)

bmle =

    4.9825
    9.9501
   20.0227
    0.9997

毫不意外的是,估计值几乎与我们在OLS下获得的相同,这正是我们在误差服从正态分布时所期望的,也是为什么大多数人选择只进行OLS,除非有充分的理由认为误差是非正态的。协方差矩阵可以通过得分的外积来估计,在正态情况下这是一个特别简单的表达式。

>> inv(X'*X/bmle(end))

ans =

    0.0012    0.0000   -0.0006
    0.0000    0.0012   -0.0006
   -0.0006   -0.0006    0.0007

最后,标准误差与我们在最小二乘法中得到的结果相匹配。
>> sqrt(diag(inv(X'*X/bmle(end))))

ans =

    0.0347
    0.0345
    0.0266

编辑:抱歉,我刚意识到我的测试数据是横向截面数据而不是时间序列数据。我会尽快修复它。但是用于估计模型的方法保持不变。


很抱歉回复晚了。我正在实现您的技术,但不幸的是出现了一些问题。这可能是因为我理解有误。您能帮忙看一下吗? - SKM
因此,我对AR进行了时间序列模型拟合,并使用aryule()命令估计参数。这给了我2个参数。现在,我尝试通过改变噪声方差(即sigma^2)来估计存在零均值白高斯噪声的情况。那么,如何在每个时间点n上实现协方差公式S?:inv(sigma^2)(A_1A_1' - A_2*A_2') 我不明白在这种情况下Toeplitz矩阵A_1和A_2将是什么以及系数估计的作用。从您的示例中,很容易看出估计值在分母中使用。 - SKM
aryule()不是内置函数,我不确定你正在使用哪个函数。但是从名称可以猜测它与Yule-Walker方程有关。这些方程只是让您在自回归模型隐含的自协方差函数和自协方差函数隐含的自回归模型之间进行反演。所以你实际上是在寻找估计的自协方差函数吗?这与估计的自回归参数对应的协方差矩阵并不相同。无论如何,我建议关闭该线程,因为这不是编程... - transversality condition

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接