xcorr (для автокорреляции) со значениями NaN - PullRequest
1 голос
/ 12 августа 2011

Я хотел бы автокоррелировать некоторые данные, но у них есть некоторые пропущенные значения, есть ли быстрый способ сделать это в Matlab?xcorr возвращает массив NaN, если любой из входных данных является NaN.

например

data = [1 2 3 4 NaN 2 3 4 1 2 3 4];
xc = xcorr(data, 'biased');

Ответы [ 3 ]

5 голосов
/ 24 августа 2011

С некоторой проницательностью из Nzbuu, следующие работы:

data = [1 2 3 4 NaN 2 3 4 5];

scaled = (data - nanmean(data)) / nanstd(data);
scaled(isnan(data)) = 0;

corr = xcorr(scaled);

Необходимо вставлять нули после масштабирования данных, а не раньше, так как в противном случае это повлияет на значения mu и std, используемые в xcorr,Лучше сделать это, чем просто работать непосредственно с xcorr, поскольку подход fft, используемый в xcorr, намного быстрее для больших наборов данных.

3 голосов
/ 19 февраля 2013

Я бы предпочел исключить из корреляции пары с NaN вместо введения нулей. В этом случае я бы использовал следующий код в matlab, основанный на corr (коэффициенты автокорреляции Пирсона).

out=zeros(nlags,1);
out(1)=1;
for i=2:nlags+1
    out(i)=corr(data(i:end),data(1:end-i+1),'rows','complete');
end
stem(0:nlags,out)
title('sample ACF')

Надеюсь, это поможет

2 голосов
/ 12 августа 2011

Конечно. Вы можете использовать индексирование, чтобы выбрать только те элементы, которые не являются NaN, и вызвать xcorr для этого.

data = [1 2 3 4 NaN 2 3 4 1 2 3 4];
xc = xcorr(data(~isnan(data)), 'biased');
...