2017-10-21 1 views
1

一般的な問題は次のとおりです。平均を計算する前に独自のグループ観測を除外するグループ手段を作成する必要があります。計算グループとは、MATLABで除外された独自のグループを意味します

例:企業、製品、製品の特性があるとします。各企業(f = 1、...、F)はいくつかの製品(i = 1、...、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

を使用し、オリジナルのfirm列ごとに繰り返された結果が必要な場合は

、私は「ループ」 - 溶液を構築しようとしていますが、私は平均的なすべてのグループ」の構文に問題が生じていますループ内では_i_ "となります。誰もがループソリューションの答えを試したいですか? – cla4study

答えて

0

ループを回避する方法ですが、メモリが多額になる可能性があります。 xは、3列のデータ行列を表します。

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); 

これはxカラム(コードの2行目)を乗じmの各行は他のグループの和を与えるmようにゼロつのマトリックスを作成します。 mは、会社カラムの各エントリとxの各エントリを、そのカラムの一意の値(第1行)と比較することによって構築されます。次に、他のグループ(3行目)のそれぞれのカウントで除算することで、目的の結果が得られます。あなたが完了するためにresult(x(:,1))

+0

ありがとうございます!これは素晴らしい作品です!しかし、元のデータと同じ大きさのベクトルを作成するにはどうしたらよいでしょうか:各観測について、後で回帰を実行するにはこの "他のグループ平均"を持つ必要があります。 – cla4study

+0

'result(x(:、1))'はあなたが望むものですか?これは、 'firm'カラムが整数を含んでいるために機能します。私は答えを編集しました –

+1

どのような素晴らしい単純なソリューション!私はこのタイプの使用を知らなかった。出来た。ありがとう! – cla4study

関連する問題