2011-08-24 10 views
3
Extraction

I ont des données dans deux colonnes qui se présente comme suit:valeurs uniques

 
A    B 

1,265848208  3 
-0,608043611 0 
-0,285735893 0 
0,006895134  7 
0    7 
-0,004526196 7 
0,176326617  10 
-0,159688071 2 
0,22439945  2 
-0,991045044 1 
0,178022324  1 
-0,270967397 4 
0,285849994  4 
1,881705539  23 
1,057184204  10 
NaN    10 

Pour toutes les valeurs uniques en B que je veux extraire la valeur correspondante dans la colonne A et le déplacer vers une nouvelle matrice. Je cherche ensuite à calculer la moyenne de toutes les valeurs correspondantes dans A et à utiliser comme variable dépendante (pondérée par le nombre d'observations par valeur dans B) dans une régression avec la valeur commune de B étant la variable indépendante pour réduire le bruit. Toute aide sur la façon de faire cela dans Matlab (sauf la régression) serait super!

Merci

Oscar

+1

soit clair: la virgule est un point décimal? – Rasman

Répondre

5

Voici une solution efficace:

X = [ 
    1.265848208  3 
    -0.608043611 0 
    -0.285735893 0 
    0.006895134  7 
    0    7 
    -0.004526196 7 
    0.176326617  10 
    -0.159688071 2 
    0.22439945  2 
    -0.991045044 1 
    0.178022324  1 
    -0.270967397 4 
    0.285849994  4 
    1.881705539  23 
    1.057184204  10 
    NaN    10 
]; 

%# unique values in B, and their indices 
[valB,~,subs] = unique(X(:,2)); 

%# values of A for each unique number in B (cellarray) 
valA = accumarray(subs, X(:,1), [], @(x) {x}); 

%# mean of each group 
meanValA = cellfun(@nanmean, valA) 

%# perform regression here... 

Le résultat:

%# B values, mean of corresponding values in A, number of A values 
>> [valB meanValA cellfun(@numel,valA)] 
ans = 
      0  -0.44689   2 
      1  -0.40651   2 
      2  0.032356   2 
      3  1.2658   1 
      4 0.0074413   2 
      7 0.00078965   3 
      10  0.61676   3 
      23  1.8817   1 
+0

Merci! fonctionne comme un charme – Oscar