рассчитать корреляцию между несколькими временными рядами

Если у меня есть матрица:

data = rand(365,5);

Каков наиболее подходящий способ вычисления корреляции между каждым столбцом и средним значением остальных столбцов. Например, для первого столбца:

  R = nonzeros(tril(corrcoef(data(:,1),mean(data(:,2:end)')'),-1));

Как я могу повторить эту процедуру, чтобы у меня было 5 значений корреляции, т.е. для каждой серии?

РЕДАКТИРОВАТЬ:

Спасибо за комментарии. Это также можно сделать в одной строке:

R = arrayfun(@(x)nonzeros(tril(corrcoef(data(:,x),...
    mean(data(:,setdiff(1:size(data,2),x))')'),-1)),1:size(data,2));

для тех, кто хочет избежать петель. Хотя в этом случае способы, показанные ниже, лучше из-за их читабельности.


person KatyB    schedule 19.07.2012    source источник
comment
corrcoef(data) не работает? Он должен вернуть матрицу 5x5, содержащую корреляции между всеми возможными комбинациями столбцов.   -  person slayton    schedule 19.07.2012
comment
Он работает только не для того, что мне нужно. Я хочу рассчитать корреляцию между каждым столбцом и средним значением других столбцов, а не корреляцию между каждым столбцом.   -  person KatyB    schedule 19.07.2012


Ответы (1)


Немного упрощенный вариант:

R = zeros(1,5);
for i=1:5
    x = data(:,i);
    y = mean(data(:,(1:5)~=i), 2);
    R(i) = corr(x,y);
end
person Amro    schedule 20.07.2012
comment
огромное спасибо. Также можно избежать петель, используя метод, показанный выше (EDIT) - person KatyB; 21.07.2012
comment
@Kate: на самом деле вы не избегаете циклов, внутри ARRAYFUN спрятан цикл. Не говоря уже о том, что это намного читабельнее .. - person Amro; 21.07.2012