【问题标题】:Matlab, Econometrics toolbox - Simulate ARIMA with deterministic time-varying varianceMatlab,计量经济学工具箱 - 用确定性时变方差模拟 ARIMA
【发布时间】:2012-09-28 16:55:23
【问题描述】:

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

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

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

问题 2) 如果 问题 1 的答案是“否”,那么是否有人知道我无法从计量经济学工具箱如下: a) 更改前导码,以便在输入 model 中的 Variance 字段设置为数值向量而不是数值标量时函数不会抛出错误。 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 讨论实现目标的最佳方式。得到结果后,我会在此处发布结果。

【问题讨论】:

  • 像往常一样,一个5秒无法回答的问题;)
  • @angainor 但这些通常是好的 :-) 我意识到 q2 是一个很难回答的问题 - 我希望还有其他一些时间序列的家伙/女孩们遇到过这个问题。如果没有,我明天会做一些测试并在这里发布结果。

标签: time-series matlab simulate


【解决方案1】:

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

针对我的问题 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) 打开位于@arima_Customsimulate.m 进行编辑(我们在步骤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 类,因为我们没有对其进行更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2011-07-08
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2015-06-03
    相关资源
    最近更新 更多