Matlab中的嵌套双重排序

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. 将选定的 B 元素分为5组。
  7. C 中获取每组的平均值。
  8. 以此类推。
这是我对此的示例代码:
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个回答

2

首先,按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 中为组创建索引(从1到nbins1*nbins2):
groupsC = repmat(1:(nbins1*nbins2), 1000/(nbins1*nbins2), 1); groupsC = groupsC(:);

最后,计算每个组内的均值:

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

@volcompt,如果这个答案解决了你的问题,能否请你接受一下呢? - nirvana-msu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接