2015-06-14 34 views
1

我正在研究一个代码来提取AR(1)-GARCH(1)参数,我使用AR(1)-GJR(1,1) )模型到单个矩阵,以便我可以在计算中将它们用作变量。由于我有16个时间序列变量,结合我的代码按以下方式循环:将混合的空/非空单元格转换为数字矩阵

for i=1:nIndices 
AA_ARCH(:,i) = cell2mat(fit{i}.Variance.ARCH)'; 
end; 

我的问题是,一些变量是没有的AA_ARCH(:我)的尺寸比nIndices低。当然,当我尝试导出指定维数(:,i)的循环中的估计和nIndices matlab报告维度不匹配时。我想告诉Matlab用0代替NaN,而不是留下空白点,以便它能够从AA_ARCH生成(1,nIndices)矩阵。

我想到了什么样的这样:

fit{i}.Variance.Leverage(isnan(fit{i}.Variance.Leverage))=0 

,但我没能这部分与前面的代码相结合。

我会非常高兴任何提示!

最佳,卡罗琳

UPDATE:

这里是一个完全的我的代码产生我的问题,可运行版本。请注意,由于在时间序列1的fit.gjr(1,1)中没有ARCH和GARCH估计,因此代码会生成维度失配误差。对于这些缺失值,我希望在提取的矩阵中包含0作为占位符。

returns = randn(2,750)'; 

T  = size(returns,1); 
nIndices = 2; 

model  = arima('AR', NaN, 'Variance', gjr(1,1)); 
residuals = NaN(T, nIndices);  
variances = NaN(T, nIndices); 
fit  = cell(nIndices,1); 

options = optimset('fmincon'); 
options = optimset(options, 'Display' , 'off', 'Diagnostics', 'off', ... 
           'Algorithm', 'sqp', 'TolCon'  , 1e-7); 

for i = 1:nIndices 
    fit{i} = estimate(model, returns(:,i), 'print', false, 'options', options); 
    [residuals(:,i), variances(:,i)] = infer(fit{i}, returns(:,i)); 
end 

for i=1:nIndices 
AA_beta(:,i) = cell2mat(fit{i}.AR)'; 
AA_GARCH(:,i) = cell2mat(fit{i}.Variance.GARCH)'; 
AA_ARCH(:,i) = cell2mat(fit{i}.Variance.ARCH)'; 
AA_Leverage(:,i) = cell2mat(fit{i}.Variance.Leverage)'; 
end; 
+0

'fit'包含什么?它在哪里定义?另外,您能否更清楚地定义您的具体问题?它在复杂的数据结构中用零代替NaN值?是从出口MATLAB的一些数据(在这种情况下 - 请说出你试图导出的方式和位置)?是关于如何存储数据或优化算法的建议(例如,摆脱循环)?请尝试提供[可运行的代码片段来重现您的问题](http://stackoverflow.com/help/mcve),并显示所需的结果。 –

+0

嗨Dev-iL,谢谢你试图帮助!我发布了可生成错误的代码的可运行版本。我还尝试在原始问题中更明确地指出问题。我希望现在更有意义。最好的,卡洛琳 – Carolin

+0

我已经编辑了你的问题的标题和标签,以更好地反映你问的问题。请注意,MATLAB以不同的方式处理'NaN'和'[]',因为它们在概念上是不同的:'NaN'通常意味着“无穷大”(或者简单地说是来自未定义数值结果的操作的结果),但有时用作其他占位符值,而[]'(空)“值”[服务于不同的目的](http://www.mathworks.com/help/matlab/math/empty-matrices-scalars-and-vectors.html)。 。 –

回答

1

我有一些通用的东西,说的代码,而是先解决你的问题:

你可以把一个简单的,如果在你的循环/ else结构来处理一个空数组的情况下, :

for ind1=1:nIndices 
    AA_beta(:,ind1) = cell2mat(fit{ind1}.AR)'; %//' 
    %// GARCH  
    if isempty(cell2mat(fit{ind1}.Variance.GARCH)') %//' 
     AA_GARCH(1,ind1) = 0; 
    else 
     AA_GARCH(:,ind1) = cell2mat(fit{ind1}.Variance.GARCH)'; %//' 
    end 
    %// ARCH (same exact code, should probably be exported to a function) 
    if isempty(cell2mat(fit{ind1}.Variance.ARCH)') %//' 
     AA_ARCH(1,ind1) = 0; 
    else 
     AA_ARCH(:,ind1) = cell2mat(fit{ind1}.Variance.ARCH)'; %//' 
    end 
    AA_Leverage(:,ind1) = cell2mat(fit{ind1}.Variance.Leverage)'; %//' 
end; 

附注:我最初尝试是这样的:soz = @(A)isempty(A)*0+~isempty(A)*A;作为内嵌更换为的if/else,但事实证明,MATLAB不处理[] + 0我想要的方式(它导致[]代替的0;不像JS等其他语言)。

至于其他的事情,我不得不说:

  • 我的概念,不应该使用ij作为循环指标,因为这可能导致在某些情况下兼容性问题的坚定支持者涉及复数(例如,如果循环索引为i,则1*i现在指的是循环索引,而不是-1的平方根)。
  • 你问题的一部分是你写入的数组没有预先分配 - 这也意味着MATLAB在创建时正确的数据类型是未知的。除了这种明显的性能冲击之外,它还可能导致像您在此遇到的错误。例如,如果您使用的单元格为AA_beta等,那么它们可以包含空值,您可以稍后用cellfunisempty的组合替换您的心脏所需的任何占位符。底线:lint(又名编辑窗口右上角的彩色方块)是你的朋友 - 不要忽略它:)
+1

嗨Dev-il,我已经成功地实现了你的代码,非常感谢你的努力!对此,我真的非常感激!我还要感谢您的额外提示,我不知道我使用i和j作为循环索引产生的问题。最好的,Carolin – Carolin

相关问题