已经一个半星期没有答案了,所以我想我现在可以发布我自己的答案了。
在回答我的问题 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
to的内容@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
位于@arima_Custom
进行编辑(我们在步骤 iii 中将其复制到那里)。最好通过在“当前文件夹”窗口中手动导航到该文件来打开此文件,以确保simulate.m
打开正确的文件。在此文件中,将第 310 行更改为:
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_Custom
该类来模拟具有确定性的时变方差,例如(对于 ARIMA(0,1,0)):
ARIMAModel = arima_Custom('D', 1, 'Variance', ScalarVariance, 'Constant', 0);
ARIMAModel.Variance = TimeVaryingVarianceVector;
[X, e, VarianceVector] = simulate(ARIMAModel, NumObs, 'numPaths', NumPaths);
此外,您还应该能够使用 matlab 的原始arima
类,因为我们没有更改它。