Matlab

时间:2016-03-09 22:09:35

标签: matlab sorting

假设我有3个向量,向量A(n x 1),向量B(n x 1),向量C(n x 1)

我想将A的元素分为5组,然后在这些组中我想将B的各个元素分类为5组。然后取C中元素的平均值。所以我将有25个平均值。

换句话说:

  1. A的元素分为5个五分位数;
  2. 选择第一个 A中的元素组,获取B中的相应值;
  3. 将挑选的B元素分为5组。
  4. C获取每组的平均值。
  5. 选择A中的第二组元素,获取相应的元素 B;
  6. 中的值
  7. 将挑选的B元素分为5组。
  8. C获取每组的平均值。
  9. 依此类推。
  10. 这是我的虚拟代码:

    minimum = 50;
    maximum = 100;
    
    A = (maximum-minimum).*rand(1000,1) + minimum;
    B = (maximum-minimum).*rand(1000,1) + minimum;
    C = (maximum-minimum).*rand(1000,1) + minimum;
    
    
    nbins1 = 5; 
    nbins2 = 5;
    
    bins1 = ceil(nbins1 * tiedrank(A) / length(A));
    
    for i=1:nbins1
    
        B1 = B(bins1==i);
        C1 = C(bins1==i);
        bins2 = ceil(nbins1 * tiedrank(B1) / length(B1));
    
        for j=1:nbins2
            C2 = C1(bins2==j);
            output(i,j) = mean(C2);
            clearvars  C2 
        end
    
    
        clearvars B1 C1
    end
    

    问题在于,这看起来并不优雅或高效。有没有其他方法这样做?对于财务人员来说,这个问题类似于Fama-French(1993)对投资组合的双重排序。

1 个答案:

答案 0 :(得分:0)

首先,按A列对所有内容进行排序:

sortedByA = sortrows([A,B,C], 1);

创建一个虚拟向量,表示A中每个组的索引(从1nbins1):

groupsA = repmat(1:nbins1, 1000/nbins1, 1); groupsA = groupsA(:);

然后再次重新排序(前两列),但用组索引替换实际的列A,这实际上会在A中的每组值中对B进行排序:

sorted = sortrows([groupsA, sortedByA(:,[2,3])], [1,2]);

为C列中的组创建索引(从1nbins1*nbins2):

groupsC = repmat(1:(nbins1*nbins2), 1000/(nbins1*nbins2), 1); groupsC = groupsC(:);

最后,计算每组中的平均值:

averages = accumarray(groupsC, sorted(:,3), [], @mean);