斯塔塔.如何将 if 语句与 sum() 一起使用



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

    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变量中所有值的总和或总和?

附言:

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

你的问题甚至不需要sum() if,所以最好从头开始。

重建你的问题,这没有得到很好的解释,

  1. 您有针对美国 50 个州和哥伦比亚特区(标识符 stateID(内家庭(标识符 hhid(内个人的观测值。

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

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

您可以标记每个家庭一次

  egen tag = tag(hhid) 

作为新变量的平均值将是

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

Stata将平均numper/tag,这将numper/1numper/0;后者的缺失将被忽略,这是想要的。

该变量对每个家庭重复。要只看到每个stateID的一个值,

 tabdisp stateID, cell(avPersonHH) 

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

a. 不需要循环。

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

三. sum()是跨观测值的累积总和的函数,而不是此处想要的函数。

d.该行

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

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

你对这一行的评论忽略了这些基本的误解,c.和d。

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

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

(后来(这段代码与你对使用collapseduplicates的厌恶一起逐步发挥作用,其理由没有说明。但大多数有经验的Stata用户都很乐意使用蛮力:

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

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

最新更新