2017-10-21 38 views
1

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

举一个例子:假设我有公司,产品和产品特征。每家公司(f = 1,...,F)生产多种产品(i = 1,...,I)。我想创建一个产品的某个特性的组合平均值i公司f,使用所有公司的所有产品,不包括公司f产品观察。

这样我就可以有一个这样的数据集:

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工具。

+0

完成,我想构建一个“循环” - 溶液,但我有语法的“平均所有群体麻烦但_i_“在循环中。有没有人想尝试一个循环解决方案? – cla4study

回答

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使得乘以的x宽度柱(的代码的第二行)的各m行给出其它基团的总和。 m通过将公司列的x中的每个条目与该列的唯一值(第一行)进行比较而构建。然后,除以其他组的相应计数(第三行)给出期望的结果。

如果你需要反复按原来firm列的效果,请使用result(x(:,1))

+0

谢谢你的帮助!这很好用!但是,我怎样才能创建一个与原始数据大小相同的矢量:对于每个观察,我需要让这个“其他组的意思”稍后运行回归。 – cla4study

+0

'result(x(:,1))'你想要什么?这是因为“公司”列包含整数。我已经编辑了答案 –

+1

多么奇妙的简单解决方案!我不知道这种类型的用途。有效。谢谢! – cla4study