Stata中bysort与egen结合if及_n使用:为何全生成缺失值?
Stata egen命令生成全缺失值的原因及解决方法
核心原因
你写的条件rep78[_n]!=rep78逻辑完全错误:rep78[_n]就是当前行的rep78值,和自身做不等比较时,只有两种结果:
- 如果当前行
rep78是具体数值,比如第一行的3,那么3!=3结果为假(0),不满足条件; - 如果当前行
rep78是缺失值,比如第四行,缺失值和自身比较的结果是缺失,同样不满足条件。
这就导致整个mpg组里没有任何观测符合条件,egen mean()找不到有效样本,最终生成的n1全为缺失值。
结合mpg=14组的具体说明
以你给出的mpg=14的组为例:
- 第一行
rep78=3,条件rep78[_n]!=rep78等价于3!=3,不成立; - 第二行
rep78=2,等价于2!=2,不成立; - 第四行
rep78缺失,等价于.!=.,结果为缺失,不成立; - 其余行同理,没有任何一行能满足条件。
自然无法计算出预期的均值。
实现预期需求的正确方法
你的需求是:对每个观测,计算同mpg组内排除与当前行rep78相同的所有观测后的price均值。可以用以下步骤实现:
* 1. 计算每个mpg组的总均值和有效观测数 bysort mpg: egen total_mean = mean(price) bysort mpg: egen total_n = count(price) * 2. 计算每个mpg-rep78子组的均值和观测数 bysort mpg rep78: egen same_rep_mean = mean(price) bysort mpg rep78: egen same_rep_n = count(price) * 3. 推导排除同rep78后的均值 gen n1 = (total_mean * total_n - same_rep_mean * same_rep_n) / (total_n - same_rep_n)
或者用更简洁的循环方式(适合小数据集):
bysort mpg: gen n1 = . levelsof mpg, local(mpgs) foreach m of local mpgs { levelsof rep78 if mpg==`m', local(reps) foreach r of local reps { local mean_val = mean(price) if mpg==`m' & rep78!=`r' replace n1 = `mean_val' if mpg==`m' & rep78==`r' } * 处理rep78缺失的观测 local mean_miss = mean(price) if mpg==`m' & !missing(rep78) replace n1 = `mean_miss' if mpg==`m' & missing(rep78) }
内容的提问来源于stack exchange,提问作者user917983
相关产品推荐
相关产品推荐

