1

我正在尝试执行以下代码:

    forval i = 1/51 {

    // number of households
    by hhid, sort: gen nvals = _n==1
    count if (nvals & stateID == `i')
    local stateTotalHH = r(N)

        local avPersonHH`i' = sum(numper)/`stateTotalHH' if(nvals & stateID ==`i')
        drop nvals 
}

一切正常,除了if不允许使用sum(). 如何估计 numper每个州和家庭级别的变量中所有值的总和或总和?

ps:

  1. 我不能使用collapse numper, by(stateID),因为我有其他估计
  2. 另外,我不能执行以下操作:duplicates drop hhid, force
4

1 回答 1

6

您的问题甚至不需要sum()with if,因此最好从头开始。

重构你的问题,没有很好的解释,

  1. hhid您对美国 50 个州和哥伦比亚特区(标识符)内的家庭(标识符)中的个人进行了观察stateID

  2. 您有一个变量numper,即每个家庭的人数,并且您想要每个州的平均值。

  3. 对家庭中的每个人重复观察,因此每个家庭只需要使用一次观察。

您可以通过以下方式标记每个家庭一次

  egen tag = tag(hhid) 

作为新变量的平均值将是

 egen avPersonHH = mean(numper/tag), by(stateID) 

numper/tagStata将求numper/1平均值 numper/0后一个部门的缺失将被忽略,这是想要的。

每个家庭都重复该变量。要查看每个 的一个值stateID

 tabdisp stateID, cell(avPersonHH) 

你的代码有什么问题?以下是部分列表:

一个。不需要循环。

湾。如果是,则by hhid, sort: gen nvals = _n==1不应重复该声明。

C。sum()是跨观测值的累积和的函数,而不是您想要的。

d。线

  local avPersonHH`i' = sum(numper)/`stateTotalHH' if(nvals & stateID ==`i')

最多只能计算一个数字,但if条件错位了。if无论如何local......在Stata中通常是有意义的,但是放在定义if的右边local只对操作包含命令的文本有意义。

您对这一行的评论错过了这些基本的误解,c。和 d。

e. 您的目标是在尽可能多的本地宏中收集 51 个平均值,但仍需要将它们放在有用的地方。

F。不需要单独计算总数和数字,因为您可以让 Stata 为您计算平均值。

collapse(稍后)这段代码随着您对使用and的反感一步一步地发挥作用duplicates,没有说明其理由。但是大多数有经验的 Stata 用户会很乐意使用蛮力:

   duplicates drop hhid, force 
   collapse numper, by(stateID) 

然后merge回来。该解决方案不仅直接,而且使用较少的特殊Stata细节,这可能需要时间来弄清楚。

于 2013-06-14T06:36:58.600 回答