家計に関する観測データセットがあります。各家庭には個人がいる。 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
があり、ロジックはこれまでと同じです。
実際に、データには、まだ借りている債務がまだ分かっていないので、各債務とそれ以上の種類の債務(教育、住宅、クレジット、クレジットカードなど)私は異なるデータセットにある債務の種類別に情報を保存したいと思っており、id
とorder
という識別子を識別子として使って私の興味のあるデータをmerge
にしたいと思っています。だから、私は各債務のテーブルを持っていて、個人の変数(この場合は年齢)を他のテーブルにも保持したいと思っています。実際のデータセットには性別、教育レベルなどの変数が含まれています
私は既にこれを2つの債務で管理していましたが、多くのことがあるので、これをプログラム的に行う方法があるかどうかを知りたいと思います。
私は借金の種類ごとに何をしたのかを示します。
1)私は一定の債務のための変数を保持し、order == 1
のためだけにしました。債務a
の場合、私は変数o_a1 o_a2 v1a1 v1a2 v2a1 v2a2
と識別子id
とorder
を保持していました。各債務は、その対応する債務者と行にあったので、私は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、そして唯一のクレジットa1
(ncred == 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でこれをプログラムで実行する方法はありますか?
まず変数の名前を変更して、最後に番号(または文字)で識別します。より効率的に名前を変更するには、findit 'renvars 'を参照してください。債務の種類を表す変数を使ってデータを再構成することができるので、債務ごとにルーチンを実行する方が簡単です。一時的なdta ..のために 'debt_a1.dta'などの' tempfile'を使うべきです。 – timat
'renvars'(私は作者)の言及をありがとうが、' rename groups'はStata 12のそれに取って代わりました。自分の返答の例を見てください。 –