一对未婚夫妇与其他人一起住在一栋房子里。为了确定那对夫妇的收入,我需要将两个收入加在一起。我使用的变量充当提供的指针partners_id
。使用partners_id
,id
和individual_income
我如何应用合作伙伴的收入对他/她的伴侣?
这是我在下面的尝试:
summarize id, meanonly
capture gen partners_income = 0
forvalue ln = 1/`r(max)' {
bys household (id): ///
egen link_`ln' = total(individual_income) if partners_location==`ln')
replace partners_income = link_`ln' if link_`ln' > 0 & id == `ln'
drop link_*
}
在此FAQ中有一些一般性建议。
编写一种聪明的方法来完成此操作的时间可能要比使用一种快速且肮脏的方法花费的时间更长。
但是,有一种更聪明的方法。
蛮力解决方案
这里的快速意味着相对快速的编码。对于很大的数据集,这不能保证很快。
gen partners_income = .
gen problem = 0
合伙人的收入变量的正确初始化是缺失的,而不是零。不知道收入和收入为零是不同的条件。例如,如果某人没有伴侣,收入肯定会丢失。(如果在以后的阶段中,您想将缺失视为零,这取决于您,但是在此阶段,应使它们与众不同。)
该problem
变量的原因将变得显而易见。
我看不出您的原因capture
。
现在我们可以循环:
quietly forval i = 1/`=_N' {
su individual_income if id == partners_id[`i'], meanonly
replace partners_income = r(max) in `i'
if r(N) > 1 replace problem = r(N) in `i'
}
因此,逻辑是
foreach
观察
summarize, meanonly
快summarize
最大值,最小值或均值的结果中选取它并不重要summarize
发现一个以上的值,则不符合预期(错误的标识符或多个合作伙伴);稍后我们edit if problem
看一下这些观察结果。笔记:
通过修改,将计算限制在同一个家庭中,可以使比较更加安全
if id == partners_id[`i']
到
if id == partners_id[`i'] & household == household[`i']
在一个地方,您有一个partners_location
看起来像是错字的变量partners_id
。
可爱的解决方案
假设对方将对方命名为对方(这不是探讨例外的论坛),那么夫妻具有共同的身份,我们通过将“ John Joanna”和“ Joanna John”排序为“ Joanna John”或等价的数字来获得身份标识:
gen first = cond(id < partner_id, id, partner_id)
gen second = cond(id < partner_id, partner_id, id)
egen joint = concat(first second), p(" ")
first
而second
仅仅意味着在数字或字母顺序; 这适用于数字和字符串标识符。您可能需要对诸如
if !missing(partner_id)
现在
bysort household joint : gen partners_income = income[3 - _n] if _N == 2
得到它?每个不同的组合household
,并joint
应精确右观测让我们感兴趣(因此预选赛if _N == 2
)。如果是这样,则3 - _n
给我们另一个伙伴的下标,就好像_n
是1,然后3 - _n
是2,反之亦然。下by:
标始终在组内应用,因此_n
在每个不同的组中分别运行1、2等。
如果这看起来很神秘,请在2008年新泽西州考克斯(Cox)中详细说明。身份分离问题或如何对二元组进行分组。Stata Journal 8(4):588-591,可通过.pdf访问。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句