我正在尝试执行以下代码:
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:
collapse numper, by(stateID)
因为我有其他估算duplicates drop hhid, force
答案 0 :(得分:5)
您的问题甚至没有sum()
if
,因此最好从头开始。
重建你的问题,这个问题没有得到很好的解释,
您对美国50个州和哥伦比亚特区(标识符hhid
)内的个人(标识符stateID
)有观察结果。
您有一个变量numper
,每个家庭的人数,以及您想要的每个州的平均值。
对一个家庭中的每个人重复观察,因此每个家庭只需使用一次观察。
您可以通过
标记每个家庭一次 egen tag = tag(hhid)
作为新变量的平均值为
egen avPersonHH = mean(numper/tag), by(stateID)
Stata的平均值为numper/tag
,其不同的是numper/1
和numper/0
;后一个部门的失误将被忽略,这就是所需要的。
每个家庭都重复这个变量。要查看每个stateID
的一个值,
tabdisp stateID, cell(avPersonHH)
您的代码有什么问题?以下是部分列表:
一个。不需要循环。
湾如果是,则不应重复声明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。
即您的目标是在尽可能多的本地宏中收集51个平均值,但仍需要将它们放在有用的地方。
F。不需要单独计算总数和数字,因为您可以让Stata为您计算平均值。
(LATER)此代码一步一步播放,您厌恶使用collapse
和duplicates
,其理由尚未说明。但是大多数有经验的Stata用户都乐于使用蛮力:
duplicates drop hhid, force
collapse numper, by(stateID)
然后merge
回来。该解决方案不仅直接,而且使用较少的特殊Stata细节,这需要时间来弄清楚。