2016-11-10 13 views
0

家計に関する観測データセットがあります。各家庭には個人がいる。 1世帯あたりの個体数は異なります。世帯はidで識別され、世帯のメンバーはインタビューされた順番に従って識別されます。家計1のメンバーが4人の場合、変数idはすべて同じですが、変数orderは1から4になります。いくつかの変数については、最初のメンバーだけが残りの回答メンバーのしたがって、私はデータセット内に長いフォーマットと広いフォーマットが混在しています。1つのファイルからプログラムで複数のファイルを作成する方法

私がする必要があるのは、世帯の最初のメンバーが回答した値を世帯の特派員に割り当てることです。さらに私のデータの構造を説明するために - 私次のおもちゃの例与える:上からおもちゃの例では

clear 
input /// 
    id order age o_a1 o_a2 v1a1 v1a2 v2a1 v2a2 o_b1 o_b2 v1b1 v1b2 v2b1 v2b2 
     1 1 54 1  . 50 . 100  . .  .  . . . . 
     1 2 50 .  . . .  .  . .  .  . . . . 
     1 3 27 .  . . .  .  . .  .  . . . . 
     1 4 18 .  . . .  .  . .  .  . . . . 
     2 1 60 3  4 70 23  10  15 2  5 80 90 100 140 
     2 2 72 .  . . .  .  . .  .  . . . . 
     2 3 58 .  . . .  .  . .  .  . . . . 
     2 4 20 .  . . .  .  . .  .  . . . . 
     2 5 23 .  . . .  .  . .  .  . . . . 
end 

を、私は家庭レベル変数idと個人レベルの変数を持っている:orderの順に対応します世帯内の個人;彼らの年齢はageです。他の変数は負債に対応しています。世帯は、債務の種類ごとに最大2つの債務を報告することができます。この場合、債務は2種類あり、債務はaまたはb 'です。

o_a1は、タイプaの最初の債務を持つ世帯のメンバーの順序を示します。データセットの行5を見ると、o_a1は3であり、その負債を持つ世帯の個人は世帯の3番目の個人、つまり行7、58歳の世帯であることを意味します。同様に、o_a2は第二の債務を持つ個人。

v1aおよびv2aは、負債の最初の変数aに対応しています。例えば、負債のサイズはドルです。これは、世帯2のメンバー3が70ドルで負債になり、世帯2の個人4が23ドルで負債になることを意味します。変数v2a1およびv2a2は、負債の第2変数などに対応します。

次に、別のタイプの債務、負債bがあり、ロジックはこれまでと同じです。

実際に、データには、まだ借りている債務がまだ分かっていないので、各債務とそれ以上の種類の債務(教育、住宅、クレジット、クレジットカードなど)私は異なるデータセットにある債務の種類別に情報を保存したいと思っており、idorderという識別子を識別子として使って私の興味のあるデータをmergeにしたいと思っています。だから、私は各債務のテーブルを持っていて、個人の変数(この場合は年齢)を他のテーブルにも保持したいと思っています。実際のデータセットには性別、教育レベルなどの変数が含まれています

私は既にこれを2つの債務で管理していましたが、多くのことがあるので、これをプログラム的に行う方法があるかどうかを知りたいと思います。

私は借金の種類ごとに何をしたのかを示します。

1)私は一定の債務のための変数を保持し、order == 1のためだけにしました。債務aの場合、私は変数o_a1 o_a2 v1a1 v1a2 v2a1 v2a2と識別子idorderを保持していました。各債務は、その対応する債務者と行にあったので、私はreshape

drop age 
keep if order==1 
keep id order *a* 

2)が長い形式で各世帯の個々の順序を取得するために広いから長にデータをDは私はsave

reshape long o_a , i(id) j(ncred) 

3)は、新しいファイルにreshape Dデータはd。

save "debt_a.dta", replace 

4)私はタイプaの各クレジットのためのデータセットを作成しました。

4.1)負債a1およびdropのデータセットを作成し、新規作成された変数o_aには欠落していた観測データを取得しました。

use "debt_a.dta", clear 
drop if o_a == . 

次は、私dropは借金a2に対応する変数をPED、そして唯一のクレジットa1ncred == 1)に属する行を続けました。

drop *a2 
keep if ncred==1 

債務a1と債務a2のデータセットを追加するステップ5でできるようにするために、私はa1債務変数から部分a1を消去します。私はステップ4.2で同じことをしました。借金の場合a2

foreach var of varlist * { 
    local newname : subinstr local var "a1" "", all 
    if "`newname'" != "`var'" { 
      rename `var' `newname' 
    } 
} 
save "debt_a1.dta", replace 

4.2)手順4.1と同じですが、債務はa2です。

use "debt_a.dta", clear 
drop if o_a == . 
drop *a1 
keep if ncred==2 

foreach var of varlist * { 
    local newname : subinstr local var "a2" "", all 
    if "`newname'" != "`var'" { 
     rename `var' `newname' 
    } 
} 
save "debt_a2.dta", replace 

5)次に、I append両方のデータセットを編集しました。

use "debt_a1.dta", clear 
append using "debt_a2.dta" 
drop ncred 
replace order = o_a 
drop o_a 
sort id order 
save "debts_a_long.dta", replace 

だから私は、次のデータセットで終了:

id order v1 v2 
1 1 50 100 
2 3 70 10 
2 4 23 15 

したがって、今、私は他のテーブルとの個々の債務データをmergeすることができます。のは、個々のデータテーブルはこのように見えたと仮定しましょう:だけではなく、年齢の情報を持つの

clear 
input /// 
    id order age sex years_education 
    1 1 54 1  12 
    1 2 50 1  14 
    1 3 27 0  8 
    1 4 18 1  12 
    2 1 60 0  6 
    2 2 72 1  8 
    2 3 58 0  12 
    2 4 20 0  14 
    2 5 23 1  17 
end 
save "individual.dta", replace 

したがって、私はまた、性別や教育の年に持っています。

今、私はmerge個人の「社会人口統計」データを使って債務データを作成することができます。この場合、mergeはSQLの左結合に対応します。私は借金の種類ごとにテーブルを作成したい理由です

id order v1 v2 age sex years_education 
1 1 50 100 54 1 12 
2 3 70 10 58 0 12 
2 4 23 15 20 0 14 

:で終わる

use "debts_a_long.dta", clear 
joinby id order using "individual.dta" 

複数のコードを書くのではなく、債務ごとにStataでこれをプログラムで実行する方法はありますか?

+0

まず変数の名前を変更して、最後に番号(または文字)で識別します。より効率的に名前を変更するには、findit 'renvars 'を参照してください。債務の種類を表す変数を使ってデータを再構成することができるので、債務ごとにルーチンを実行する方が簡単です。一時的なdta ..のために 'debt_a1.dta'などの' tempfile'を使うべきです。 – timat

+1

'renvars'(私は作者)の言及をありがとうが、' rename groups'はStata 12のそれに取って代わりました。自分の返答の例を見てください。 –

答えて

1

これは明らかに説明されていますが、一度に多くのことを把握することは同じです。一度に1つの質問をするのが最善です!

私は初期のコメントをいくつか行いますが、当然のことながら他の人が完全な回答やより良い回答を投稿しない限り、この回答を時間の許す限り延長することができます。

戦略的なコメントとして、データセットを異なるデータセットに細分化する衝動がここでは間違っているようです。確かに、データのさまざまな部分について分析を行いたいと思っていますが、複数のデータセットがそれをより簡単にする理由は何もありません。

同様に、merge,joinbyなどのように重視されていますが、必要とされる印象はありません。ここで

が他の観察にorder 1で個体からの情報をコピーする方法を示すためのトークンコードです:

clear 
input id order age o_a1 o_a2 v1a1 v1a2 v2a1 v2a2 o_b1 o_b2 v1b1 v1b2 v2b1 v2b2 
1 1 54 1 . 50 . 100 . . . . . . . 
1 2 50 . . . . . . . . . . . . 
1 3 27 . . . . . . . . . . . . 
1 4 18 . . . . . . . . . . . . 
2 1 60 3 4 70 23 10 15 2 5 80 90 100 140 
2 2 72 . . . . . . . . . . . . 
2 3 58 . . . . . . . . . . . . 
2 4 20 . . . . . . . . . . . . 
2 5 23 . . . . . . . . . . . . 
end 

forval j = 1/2 { 
    bysort id (order) : replace v1a`j' = v1a`j'[1] if order == o_a`j'[1] 
} 

list id order age *a1 *a2, sepby(id) 

    +------------------------------------------------------------+ 
    | id order age o_a1 v1a1 v2a1 o_a2 v1a2 v2a2 | 
    |------------------------------------------------------------| 
    1. | 1  1 54  1  50 100  .  .  . | 
    2. | 1  2 50  .  .  .  .  .  . | 
    3. | 1  3 27  .  .  .  .  .  . | 
    4. | 1  4 18  .  .  .  .  .  . | 
    |------------------------------------------------------------| 
    5. | 2  1 60  3  70  10  4  23  15 | 
    6. | 2  2 72  .  .  .  .  .  . | 
    7. | 2  3 58  .  70  .  .  .  . | 
    8. | 2  4 20  .  .  .  .  23  . | 
    9. | 2  5 23  .  .  .  .  .  . | 
    +------------------------------------------------------------+ 

注:変数名の束からサフィックスを削除するには、必要はありません。ループ。

rename *a1 * 

は、(そうでなければ、問題ではない、その要求の対象)が存在する限りサフィックスa1ストリップ。

+0

ありがとう、これは私のアプローチよりもずっと簡単です。私はそれについて学び、それを練習したいので、私はSQLのアプローチに従いたいと思っていました。 – csmontt

+0

逆に、SQLの用語についてはわかりませんが、一部の操作ではStataの構文と同等のものが分かります。 –

関連する問題