0

世帯 ID と各世帯内の個人 ID を含む調査データセットがあります。個人 1 は、インタビュー対象者自身を表します。一部の変数は、各個人とインタビュー対象者との関係を表します (たとえば、配偶者は 2、両親は 3 など)。データ構造は次のようになります。

???

ここでやりたいことは、特定の値の出現を検出し、それが出現した場合、およびの値が特定の条件を満たすvar1かどうかを検出することです。var1var2

たとえば、次var1var2場合

(var1 == 3 & var2 == 1) | (var1 == 4 & var2 == 1)

var3次に、同じグループ (この場合は家族構成を表す世帯) 内の各個人に対して値 1 を、新しく生成された変数 (たとえば、 ) に割り当て、それ以外の場合は 0 を割り当てることができます。

大した問題ではないようだし、何人か雇うべきだと思う

 by group: egen 

また

by group: gen

コマンドですが、よくわかりません。以前は次のようなコマンドを適用していました

gen l_w_p = 0
by hhid: replace l_w_p = 1 if (var1 == 3 & a2004 == 1) | (var2 == 4 & a2004 == 1)
by hhid: replace l_w_p = 2 if (var1 == 3 & a2004 == 2) & (var2 == 4 & a2004 == 2)

しかし、うまくいかないようです。それにはある種のループが必要ですか?

4

2 に答える 2

2

あなたが何を求めているのか理解するのに苦労しています。良い戦略は、問題の本質を可能な限り単純化して、データと目的の出力の例を示すことです。これは、データを言葉で説明するよりもはるかに簡単です。

簡単に始めましょう。次のようなデータがあるとします。

hhid    x
1       1
1       2
2       0
2       1

これまでにある世帯にタグを付けたいx2. 1 つの方法は

bys hhid: egen tag=max(cond(x==2,1,0))

これにより、次が生成されます。

hhid   x   tag  
   1   1     1  
   1   2     1  
   2   0     0  
   2   1     0  

裏返しに作業して、メンバーごとにxが 2 であるかどうかを確認し1ます。そうでない場合、彼は0. max()は、世帯全体でこのバイナリ インジケータの最大値を計算します。

条件はより複雑になる可能性があり、条件関数はロシア人形のように入れ子にすることができます。

より複雑な例を次に示します。このデータセットで誰かがx = 2( の付いたタグ1) またはy >= 5(の付いたタグ ) を持っている世帯にタグを付けたいとします。2

hhid   x   y  
   1   1   1  
   1   2   2  
   2   0   3  
   2   1   4  
   3   1   5  
   3   3   5  

x最初に確認し、次に条件が falseyかどうかを確認します。x

bys hhid : egen tag=max(cond(x==2,1,cond(y>=5,2,0)))

これにより、次の結果が得られます。

hhid   x   y   tag  
   1   1   1     1  
   1   2   2     1  
   2   0   3     0  
   2   1   4     0  
   3   1   5     2  
   3   3   5     2  
于 2014-12-10T08:47:51.163 に答える
2

@Dimitriy V. Masterov は適切な具体的な回答を提供しましたが、より一般的に質問に対処する余地があります。

彼の答えが示すように、

  1. フォームの問題: このグループのメンバーはこの特徴を持っていますか? egenグループに対してのmax()関数を使用して、0 または 1 を生成する true または false の式、つまりインジケーター (または、一部の分野で一般的な不適切な用語ではダミー)を使用することによって取り組むことができます。

少し考えてみれば、

  1. フォームの問題: このグループのすべてのメンバーはこの特性を持っていますか? egenグループに対して's関数を使用してmin()、0 または 1 などを生成する真または偽の式にすることで対処できます。

グループのいずれかのメンバー (またはグループのすべてのメンバー) が何らかの特徴を持っているかどうかを記録する変数を作成するにはどうすればよいですか? (したがって、メタレッスンは、利用可能なリソースを利用することです)。

グループの他のメンバーに関する問題も 1 ステップ離れており、FAQ でも説明されています。

役立つ可能性のある詳細な議論については、この記事この記事を参照してください

さらに 2 つのコメント:

を。このようなコードで

gen l_w_p = 0
by hhid: replace l_w_p = 1 if (var1 == 3 & a2004 == 1) | (var2 == 4 & a2004 == 1)
by hhid: replace l_w_p = 2 if (var1 == 3 & a2004 == 2) & (var2 == 4 & a2004 == 2)

by:プレフィックスは、実行される内容に違いはありません。コードは引き続き個々のレベルで機能し、接頭辞は操作をグループに広げません。それが「機能しない」理由であり、通常はかなり役に立たないエラーレポートです。

b. 軽度の抽象化は問題を説明するのに役立ちますが、変数の命名における抽象化はコードを読みにくくするだけです。var1、などの変数名は使用しませんvar2。これは、何が何であるかを覚えておくという負担を課すだけです。any_unemployedまたはなどの刺激的な名前を使用しますany_married。これは個人的なスタイルではなく、(ここのように) 自分のコードについて他の人に考えてもらうとき、コードを簡単に読めることは大きな助けになります。

于 2014-12-10T09:40:46.007 に答える