2012-10-08 76 views
0

免責聲明:此問題僅適用於那些有權訪問Matlab中的計量經濟學工具箱的人。Matlab,計量經濟學工具箱 - 用確定性時變方差模擬ARIMA

The Situation:我想用Matlab來模擬使用計量經濟學工具箱的ARIMA(p,d,q)模型的N觀測值。有什麼困難?我希望創新能夠用確定性的時變方差來模擬。

問題1)我能做到這一點使用內置的MATLAB simulate功能而不改變它自己?據我所知,這是不可能的。從我讀到的文檔中,創新可以被指定爲具有恆定的方差(即每個創新的方差相同),或者被指定爲隨機時變的(例如GARCH模型),但是它們不能以確定性的時間 - 變化,我,用戶,選擇他們的價值(除了在平凡的常數情況下)。

問題2)如果答案問題1是「否」,則沒有人認爲有任何理由爲什麼我不能從計量經濟學工具箱編輯simulate功能如下: 一)改變序言如果輸入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自己的一個功能,也不想做一些愚蠢的事情。

UPDATE(2012-10-18):我相信我上面提出的代碼編輯是有效的,而且我主要相信它不會破壞其他任何東西。然而,事實證明,由於文件權限,實施解決方案並不是微不足道的。我現在正在與Mathworks談論實現我的目標的最佳方式。一旦我有他們,我會在這裏發佈結果。

+0

像往常一樣,一個問題不能在5秒內回答;) – angainor

+0

@angainor但這些通常是好的:-)我認識到q2是一個難以回答的問題 - 我希望還有其他時間那些已經遇到過這個問題的系列球員/女球員。如果沒有,我會明天做一些測試,並在這裏發佈結果。 –

回答

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)打開位於@arima_Custom進行編輯simulate.m(我們在步驟三)在複製它。最好在當前文件夾窗口中手動導航到該文件,以確保打開正確的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類,因爲我們沒有改變它。