Stata按国家-年份分组计算子组最值并生成差值变量
Stata 按国家-年份分组计算子组最值并全组填充方案
原代码失效原因
问题出在if条件的作用范围上:
- 把
if判断写在egen命令尾部时,筛选规则同时限制了「参与计算的样本」和「写入结果的样本」:写bysort year country: egen smalloranges = min(oranges) if type == 1时,只有type==1的观测会参与最小值计算,同时也只有这些观测会被赋计算结果,同组里type不等于1的观测,smalloranges会是系统缺失值。 - 同理
bigoranges只会在type==0的观测上有有效值,其余观测全是缺失值,自然算不出全组统一的distance。
正确实现代码
核心调整是把筛选子组的逻辑放到egen的计算函数内部,用cond()条件函数指定哪些值参与最值计算,删掉命令尾部的if判断,这样算出来的结果会自动填充到整个分组的所有观测上:
* 计算各国家-年份分组下type=1子组的oranges最小值,全组所有观测填充相同值 bysort country year: egen smalloranges = min(cond(type == 1, oranges, .)) * 计算各国家-年份分组下type=0子组的oranges最大值,全组所有观测填充相同值 bysort country year: egen bigoranges = max(cond(type == 0, oranges, .)) * 生成两个最值的差值变量distance gen distance = bigoranges - smalloranges
提示:Stata不支持变量名包含括号、等号这类特殊字符,如果你需要输出名为
min(type=1)、max(type=0)的字段,建议在导出Excel/CSV结果时再修改列名,计算过程用合规的英文字段名即可避免运行报错。
结果校验
运行完可以按以下规则确认结果符合要求:
- 同一国家同一年份的所有观测,
smalloranges、bigoranges、distance三个字段取值完全一致 - 任意分组的
smalloranges等于该组所有type=1观测的oranges最小值,不会混入type=0的样本 - 任意分组的
bigoranges等于该组所有type=0观测的oranges最大值,不会混入type=1的样本
内容的提问来源于stack exchange,提问作者blackmamba
相关产品推荐
相关产品推荐

