假设我有3个向量,向量A
是(n x 1)
,向量B
是(n x 1)
,向量C
是(n x 1)
我想将A
的元素分为5组,然后在这些组中我想将B
的各个元素分类为5组。然后取C
中元素的平均值。所以我将有25个平均值。
换句话说:
A
的元素分为5个五分位数; A
中的元素组,获取B
中的相应值; B
元素分为5组。C
获取每组的平均值。A
中的第二组元素,获取相应的元素
B
; B
元素分为5组。C
获取每组的平均值。这是我的虚拟代码:
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)对投资组合的双重排序。
答案 0 :(得分:0)
首先,按A列对所有内容进行排序:
sortedByA = sortrows([A,B,C], 1);
创建一个虚拟向量,表示A中每个组的索引(从1
到nbins1
):
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);