Matlab,计量经济学工具箱 - 用确定性时变方差模拟ARIMA

时间:2012-10-08 12:27:24

标签: time-series matlab simulate

免责声明:此问题仅适用于有权访问Matlab中的计量经济学工具箱的人士。

情况:我想使用Matlab来使用计量经济学工具箱模拟来自ARIMA(p,d,q)模型的N观测值。有什么困难?我希望用确定性的时变方差模拟这些创新。

问题1)我可以使用内置的matlab simulate函数执行此操作而无需自行更改吗?尽我所知,这是不可能的。从我对文档的阅读中,可以指定创新具有恒定的方差(即每个创新的方差相同),或者指定为随机时变(例如GARCH模型),但它们不能确定性地为时间 - 变化,我,用户,选择他们的值(除了琐碎的常量情况)。

问题2)如果问题1 的答案为“否”,那么是否有人看到我无法编辑simulate函数的任何原因来自计量经济学工具箱的内容如下: a)更改前导码,使得如果输入Variance中的model字段设置为数字向量而不是数字标量,则函数不会抛出错误。 b)改变来自simulate的第310行:

E(:,(maxPQ + 1:end)) = Z * sqrt(variance);

E(:,(maxPQ + 1:end)) = (ones(NumPath, 1) * sqrt(variance)) .* Z;

其中NumPath是要模拟的路径数,可以假设我已经包含了一个错误陷阱,以确保variance中存储的(输入)确定性方差路径是正确的长度(即等于每条路径要模拟的观测数量)。

任何帮助都将非常感激。抱歉如果这个问题看起来很基本,我以前从未编辑过Mathwork自己的一个函数,也不想做一些愚蠢的事情。

更新(2012-10-18):我确信我上面建议的代码编辑是有效的,而且我很有信心它不会破坏其他任何东西。然而事实证明,由于文件权限,实现解决方案并非易事。我目前正在与Mathworks讨论实现目标的最佳方法。有了它们,我会在这里公布结果。

1 个答案:

答案 0 :(得分:0)

这已经过了一个半星期没有答案,所以我觉得我现在可以发布自己的答案了。

回答我的问题1),不,我还没有找到使用内置matlab函数执行此操作。

回应我的问题2),是的,我发布的内容将有效。但是,由于matlab文件权限,它比我想象的要多一些。这是一个循序渐进的指南:

i)在matlab路径的某处,创建目录@arima_Custom

ii)在命令窗口中,键入edit arima。将此文件的文本复制到新的m文件中,并将其保存在@arima_Custom目录中,文件名为arima_Custom.m

iii)在您的计算机上找到计量经济学工具箱。找到后,在工具箱中查找目录@arima。这个目录可能位于(在Linux机器上)类似$MATLAB_ROOT/toolbox/econ/econ/@arima的东西(在我的机器上,$ MATLAB_ROOT在/ usr / local / Matlab / R2012b)。将@arima的内容复制到@arima_Custom,但不要复制文件arima.m

iv)打开arima_Custom进行编辑,即edit arima_Custom。在此文件中更改第1行:

classdef (Sealed) arima < internal.econ.LagIndexableTimeSeries

classdef (Sealed) arima_Custom < internal.econ.LagIndexableTimeSeries

接下来,从:

更改第406行
function OBJ = arima(varargin)

function OBJ = arima_Custom(varargin)

现在,改变第993行:

if isa(OBJ.Variance, 'double') && (OBJ.Variance <= 0)

if isa(OBJ.Variance, 'double') && (sum(OBJ.Variance <= 0) > 0)

v)打开位于simulate.m的{​​{1}}进行编辑(我们在步骤iii中将其复制)。最好通过在“当前文件夹”窗口中手动导航来打开此文件,以确保打开正确的@arima_Custom。在此文件中,从以下位置改变第310行:

simulate.m

E(:,(maxPQ + 1:end)) = Z * sqrt(variance);

我们已经完成了!

您现在应该能够使用%Check that the input variance is of the right length (if it isn't scalar) if isscalar(variance) == 0 if size(variance, 2) ~= 1 error('Deterministic variance must be a column vector'); end if size(variance, 1) ~= numObs error('Deterministic variance vector is incorrect length relative to number of observations'); end else variance = variance(ones(numObs, 1)); end %Scale innovations using deterministic variance E(:,(maxPQ + 1:end)) = sqrt(ones(numPaths, 1) * variance') .* Z; 类以确定的时变方差进行模拟,例如(对于ARIMA(0,1,0)):

arima_Custom

此外,您还应该能够使用matlab的原始ARIMAModel = arima_Custom('D', 1, 'Variance', ScalarVariance, 'Constant', 0); ARIMAModel.Variance = TimeVaryingVarianceVector; [X, e, VarianceVector] = simulate(ARIMAModel, NumObs, 'numPaths', NumPaths); 课程,因为我们没有改变它。