免责声明:此问题仅适用于有权访问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讨论实现目标的最佳方法。有了它们,我会在这里公布结果。
答案 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);
课程,因为我们没有改变它。