如何解决在Stata中为多个成员多层次模型准备数据
我正在尝试为多成员多级模型准备数据集,并且被困在如何创建一系列“多成员标识符”变量上。本质上,我具有带有单个标识符(ID)的数据以及它们从1996年至1999年(state_1996到state_1999)所居住的州,其中1 =阿拉斯加,2 =亚利桑那州,等等。例如(这是组成的):>
ID state_1996 state_1997 state_1998 state_1999
1 1 1 2 2
2 1 1 1 1
3 3 1 1 1
n 4 4 4 4
我正在尝试创建变量s1到s51,以给出每个人在每种状态下花费的时间比例。例如,基于上表并仅提供这些新变量的子集,我想要看起来像这样的东西:
ID s1 s2 s3 s4
1 0.5 0.5 0 0
2 1.0 0 0 0
3 0.75 0 0.25 0
n 0 0 0 1.0
感谢您提供最佳方法的任何帮助,谢谢!
解决方法
这是一个非常简单的版本,应该可以为您提供所需的内容:
forv i = 1/51{
gen s`i' = 0
forv year = 1996/1999{
replace s`i' = s`i' + 0.25 if state_`year' == `i'
}
}
这是一个更通用的版本,适用于任何州和年份,以防对任何人有用:
// Count how many years there are
ds state_????
local yearVars `r(varlist)'
local numYears: list sizeof yearVars
di `numYears'
// What fraction of the total time is one year?
local myFrac = 1/`numYears'
di `myFrac'
// Get a list of all values state_???? can take
foreach var in `yearVars'{
levelsof `var'
local tempYears `r(levels)'
local allStates: list allStates | tempYears
}
// Loop over all states to create the variables you want
foreach i in `allStates'{
gen s`i' = 0
foreach var in `yearVars'{
replace s`i' = s`i' + `myFrac' if `var' == `i'
}
// Make sure you don't get any wacky values here
assert s`i' >=0 & s`i' <= 1
}
// Make sure total time adds up to 1
egen totaltime = rowtotal(s? /* s?? */) // uncomment s?? if you've got between 10 and 99 states; I bet you do
assert totaltime == 1
drop totaltime
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。