Преобразование смешанных пустых/непустых ячеек в числовую матрицу

Я работаю над кодом для извлечения моего параметра 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(:,i) размерность меньше, чем nIndices. Естественно, когда я пытаюсь экспортировать оценки в цикле, в котором указана размерность (:, i) и nIndices, Matlab сообщает о несоответствии размерности. Я хотел бы сказать Matlab заменить NaN на 0 вместо того, чтобы оставлять место пустым, чтобы он мог создать матрицу (1, nIndices) из AA_ARCH.

Я подумал о чем-то вроде этого:

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

но я не смог совместить эту часть с предыдущим кодом.

Буду очень рад любой подсказке!

Бест, Кэролин

ОБНОВИТЬ:

Вот полностью работоспособная версия моего кода, которая создает мою проблему. Обратите внимание, что код выдает ошибку несоответствия размеров, потому что в fit.gjr(1,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; 

person Carolin    schedule 14.06.2015    source источник
comment
Что содержит fit? Где это определено? Кроме того, не могли бы вы более четко определить вашу конкретную проблему (проблемы)? Заменяет ли значения NaN нулями в сложной структуре данных? Это с экспортом каких-то данных из MATLAB (в таком случае - скажите, как и куда вы пытаетесь экспортировать)? Это предложения о том, как хранить данные или оптимизировать алгоритм (например, избавиться от цикла)? Попробуйте предоставить выполнимый фрагмент кода, который воспроизводит вашу проблему, и покажите желаемый результат.   -  person Dev-iL    schedule 14.06.2015
comment
Привет, Dev-iL, спасибо за попытку помочь! Я опубликовал работоспособную версию кода, которая выдает ошибку. Я также попытался более четко указать проблему в исходном вопросе. Я надеюсь, что теперь это имеет больше смысла. Бест, Кэролин   -  person Carolin    schedule 14.06.2015
comment
Я отредактировал заголовок и теги вашего вопроса, чтобы лучше отразить то, что вы спрашивали. Обратите внимание, что MATLAB обрабатывает NaN и [] по-разному, потому что они концептуально различны: NaN обычно означает бесконечность (или просто результат операций, которые имеют неопределенные числовые результаты), но иногда используется в качестве заполнителя для других значений, тогда как [] (пустые) значения служит другой цели...   -  person Dev-iL    schedule 14.06.2015


Ответы (1)


У меня есть несколько общих слов о коде, но сначала решение вашей проблемы:

Вы можете поместить в свой цикл простую структуру if/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 ).

Что касается других вещей, я должен сказать:

  • Я твердо поддерживаю идею о том, что не следует использовать i, j в качестве индексов цикла, так как это может вызвать проблемы совместимости в некоторых случаях, когда задействованы комплексные числа (например, если индекс цикла равен i, то 1*i теперь относится к циклу индекс вместо квадратного корня из -1).
  • Часть вашей проблемы заключалась в том, что массивы, в которые вы записывали, не были предварительно выделены, что также означает, что правильный тип данных был неизвестен MATLAB во время их создания. Помимо очевидного снижения производительности, это также может привести к ошибкам, подобным той, с которой вы столкнулись здесь. Если, например, вы использовали ячейки для AA_beta и т. д., то они могут содержать пустые значения, которые вы могли бы позже заменить любым заполнителем, который пожелает ваше сердце, используя комбинацию cellfun и isempty. Итог: lint (также известный как цветной квадрат в правом верхнем углу окна редактора) ваш друг — не игнорируйте его :)
person Dev-iL    schedule 14.06.2015
comment
Привет Dev-il, я успешно реализовал ваш код, большое спасибо за ваши усилия! Я очень ценю это! Я также хотел бы поблагодарить вас за ваши дополнительные советы, я не знал о проблемах, которые я создаю, используя i и j в качестве индексов цикла. Бест, Кэролин - person Carolin; 14.06.2015