来自个人数据的家庭财产

时间:2013-12-10 04:09:53

标签: stata

我想创建新变量HHage,这是HID报告的户主年龄。在数据集中,户主由P1编码。数据集如下所示:

Personid   HID    Age   
P1         100    12    
P2         100    45
P1         101    16
P1         102    35
P2         102    24
P3         102    26

我尝试了egen命令,但是我收到了与numlist有关的错误。我使用的命令是:

egen hhage = anyvalue(age), values(integer 1,2 to 26)

2 个答案:

答案 0 :(得分:2)

// create the example data
clear
input ///
str2 Personid   HID    Age
P1         100    12
P2         100    45
P1         101    16
P1         102    35
P2         102    24
P3         102    26
end

// check whether there is only 1 household head per household
bys HID : gen byte flag = -(Personid == "P1")
bys HID (flag): replace flag = sum(flag)
assert flag == -1
drop flag

// create hhage
gen hhage = Age if Personid == "P1"
bys HID (hhage): replace hhage = sum(hhage)
list , sepby(HID)  

答案 1 :(得分:2)

@Maarten Buis的优秀答案解释说,您可以在没有egen的情况下执行此操作。这个答案侧重于使用egen来解决这类问题。

允许作为 numlist 的内容是一个小问题;主要问题是egen函数anyvalue()没什么帮助。它的文档解释了

anyvalue( varname ), values( 整数numlist )可能无法与by合并。如果 varname 等于提供的 numlist 中的任何整数值,则它采用 varname 的值,否则将丢失。

这将是合法的语法

egen hhage = anyvalue(age), values(1/26)
但是Stata会将1至26岁的年龄复制到新的变量而忽略其他变量,通过观察观察,无论是家庭还是谁是户主。那不是你想要的。

对此的一个egen解决方案可能是

egen hhage = total(age * (Personid == "P1")), by(HHID) 

表达式Personid == "P1"在为true时计算结果为1,在为false时计算结果为0。因此,户主的age出现在总数中,age的其他值被忽略,因为它们对总数的贡献为0。

by()选项未记录,但可以使用。 Stata鼓励你这样做:

bysort HHID : egen hhage = tota(age * (Personid == "P1")) 

此解决方案假设

  1. Personid是一个字符串变量。如果它是一个数值变量,则表达式Personid == "P1"应该被Personid == 1替换为使用1或其他任何适当的整数代码。

  2. 每户有一户户主。这可以通过

    之类的东西直接检查
    egen hhcount = total(Personid == "P1"), by(HHID) 
    
  3. 另见http://www.stata-journal.com/article.html?article=dm0055有关该领域技术的评论。

    请注意,原则上你可以使用

        egen work = anyvalue(age) if Personid == "P1", values(0/200) 
    

    允许任何age可以想象,只要该人是户主。然后你可以通过

    解决这个问题
        egen hhage = total(work), by(HHID) 
    

    但是,我认为该解决方案没有意义。