0

免责声明:此问题仅适用于那些可以访问 Matlab 中的计量经济学工具箱的人。

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

问题 1)我可以使用内置的 matlabsimulate函数而不自己更改它吗?据我所知,这是不可能的。根据我对文档的阅读,创新可以指定为具有恒定方差(即每个创新的方差相同),也可以指定为随机随时间变化的(例如 GARCH 模型),但它们不能是确定性的时间-变化,我,用户,选择他们的值(除了在平凡的常数情况下)。

问题 2)如果问题 1的答案是“否”,那么是否有人看到我无法从计量经济学工具箱中编辑函数的任何原因simulate,如下所示:a)更改序言以使函数不会抛出错误如果Variance输入中的字段model设置为数值向量而不是数值标量。b) 将第 310 行更改simulate为:

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

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

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

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

更新(2012-10-18):我相信我上面建议的代码编辑是有效的,而且我最有信心它不会破坏其他任何东西。然而事实证明,由于文件权限,实施该解决方案并非易事。我目前正在与 Mathworks 讨论实现目标的最佳方式。获得结果后,我将在此处发布结果。

4

1 回答 1

0

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

在回答我的问题 1)时,不,我还没有找到使用内置的 matlab 函数来做到这一点。

在回答我的问题 2)时,是的,我发布的内容将起作用。但是,由于 matlab 文件权限,它比我想象的要复杂一些。这是一个分步指南:

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

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

iii)在您的机器上找到计量经济学工具箱。找到后,@arima在工具箱中查找目录。该目录可能位于(在 Linux 机器上)类似的位置$MATLAB_ROOT/toolbox/econ/econ/@arima(在我的机器上,$MATLAB_ROOT 位于 /usr/local/Matlab/R2012b)。复制@arimato的内容@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类,因为我们没有更改它。

于 2012-10-18T08:32:56.663 回答