You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:00:38