2012-07-19 30 views
1

Si j'ai une matrice:calculer la corrélation entre plusieurs séries temporelles

data = rand(365,5); 

Quelle est la manière la plus appropriée de calcul de la corrélation entre chaque colonne et la moyenne des colonnes. Par exemple, pour la première colonne:

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

Comment pourrais-je répéter cette procédure pour que j'ai des valeurs 5 corrélation dire pour chaque série?

EDIT:

Merci pour les commentaires. Cela peut également se faire en une ligne:

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

pour ceux qui souhaitent éviter les boucles. Bien que dans ce cas les méthodes montrées ci-dessous soient meilleures en raison de leur lisibilité.

+0

Est-ce que 'corrcoef (données)' fonctionne pas? Il devrait retourner une matrice 5x5 contenant les corrélations entre toutes les combinaisons possibles des colonnes. – slayton

+0

Cela fonctionne tout simplement pas pour ce dont j'ai besoin. Je veux calculer la corrélation entre chaque colonne et la moyenne des autres colonnes pas la corrélation entre chaque colonne – KatyB

Répondre

1
for i=1:5 
    x = data(:,i); 
    y = mean(data(:,(1:5) ~= i)')'; 
    R(i) = nonzeros(tril(corrcoef(x,y),-1)); 
end 
1

Une version légèrement simplifiée:

R = zeros(1,5); 
for i=1:5 
    x = data(:,i); 
    y = mean(data(:,(1:5)~=i), 2); 
    R(i) = corr(x,y); 
end 
+0

merci beaucoup. Peut également éviter les boucles en utilisant la méthode ci-dessus (EDIT) – KatyB

+0

@Kate: vous n'évitez pas vraiment les boucles, ARRAYFUN a pour l'essentiel une boucle cachée à l'intérieur. Sans parler de ceci est beaucoup plus lisible .. – Amro

Questions connexes