我正在尝试执行以下代码:
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
变量中所有值的总和或总和?
附言:
- 我不能使用
collapse numper, by(stateID)
因为我有其他估计 - 另外,我不能执行以下操作:
duplicates drop hhid, force
你的问题甚至不需要sum()
if
,所以最好从头开始。
重建你的问题,这没有得到很好的解释,
-
您有针对美国 50 个州和哥伦比亚特区(标识符
stateID
(内家庭(标识符hhid
(内个人的观测值。 -
您有一个可变
numper
,每个家庭的人数,并且您想要每个州的平均值。
对家庭 中的每个个体重复观察,因此每个家庭只需要使用一个观察值。
您可以标记每个家庭一次
egen tag = tag(hhid)
作为新变量的平均值将是
egen avPersonHH = mean(numper/tag), by(stateID)
Stata将平均numper/tag
,这将numper/1
和numper/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 为您计算平均值。
(后来(这段代码与你对使用collapse
和duplicates
的厌恶一起逐步发挥作用,其理由没有说明。但大多数有经验的Stata用户都很乐意使用蛮力:
duplicates drop hhid, force
collapse numper, by(stateID)
然后merge
回来。该解决方案不仅直接,而且使用较少的特殊Stata细节,这可能需要时间来弄清楚。