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_*
}
答案 0 :(得分:1)
this 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
的每个不同组合应恰好是我们感兴趣的2个观察值(因此限定符if _N == 2
)。如果这是真的那么3 - _n
给我们其他合作伙伴的下标,好像_n
是1然后3 - _n
是2,反之亦然。在by:
下,下标始终在组内应用,因此_n
在每个不同的组中运行1,2等。
如果这看起来很神秘,那么Cox, N.J. 2008. The problem of split identity, or how to group dyads. Stata Journal 8(4): 588-591中的所有拼写都可以作为.pdf访问。