计算组表示在MATLAB中排除自己的组

时间:2017-10-21 19:11:19

标签: matlab

通用问题是:我需要创建组意味着在计算平均值之前排除自己的组观察。

作为一个例子:让我们说我有公司,产品和产品特征。每个公司(f = 1,...,F)生产几种产品(i = 1,...,I)。我想使用所有公司的所有产品(不包括公司 f f 的产品 i 的某个特征的组均值>产品观察。

所以我可以拥有这样的数据集:

firm prod width
1   1   30
1   2   10
1   3   20
2   1   25
2   2   15
2   4   40
3   2   10
3   4   35

重现表:

firm=[1,1,1,2,2,2,3,3]
prod=[1,2,3,1,2,4,2,4]
hp=[30,10,20,25,15,40,10,35]
x=[firm' prod' hp']

然后我想估算一个平均值,它将使用所有其他公司的所有产品的价值,即排除所有公司1产品。在这种情况下,我的分组处于公司层面。 (这意味着将用作公司1中所有产品宽度的工具变量。)

所以,我应该找到的意思是:(25 + 15 + 40 + 10 + 35)/ 5 = 25 然后为其他公司重复这个过程。

firm prod width mean_desired
1   1   30      25
1   2   10      25
1   3   20      25
2   1   25      
2   2   15
2   4   40
3   2   10
3   4   35

我想我最大的困难是排除自己的公司价值观。

此问题与此页面有关:Calculating group mean/medians in MATLAB where group ID is in a separate column。但在这里,我们不排除自己的群体。

p.s。:出于好奇,如果有人在经济学方面工作,我实际上是在尝试构建Hausman或BLP工具。

1 个答案:

答案 0 :(得分:0)

这是一种避免循环的方法,但可能是内存昂贵的。让x表示您的三列数据矩阵。

m = bsxfun(@ne, x(:,1).', unique(x(:,1))); % or m = ~sparse(x(:,1), 1:size(x,1), true); 
result = m*x(:,3);
result = result./sum(m,2);

这会创建一个零一个矩阵m,使m的每一行乘以x(第二行代码)的 width 列其他群体的总和。 m是通过将x公司列中的每个条目与该列的唯一值(第一行)进行比较而构建的。然后,除以其他组的相应计数(第三行)得到所需的结果。

如果您需要按原始firm列重复搜索结果,请使用result(x(:,1))