You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

删除含缺失值的完整面板:Stata代码效果不符问题求助

解决面板数据中删除含缺失值的完整面板问题

我懂你要的效果:只要某个企业(对应BvD_ID的整个面板)的四个目标变量里任意一条观测存在缺失,就把这个企业的所有观测全部删掉,而不是只删有缺失的那一行。你之前的代码没达到目标,问题出在分组逻辑和判断方式上,咱们来调整下:

步骤1:标记存在缺失值的企业面板

先给每个企业生成一个标记,判断该企业的所有观测里是否有任何一个目标变量存在缺失:

bysort BvD_ID: egen any_missing = max(missing(REV_LAY, EMP_LAY, FX_ASSET_LAY, MATCOST_LAY))
  • missing()函数会对单个变量返回1(缺失)或0(非缺失),括号里放多个变量时,只要其中一个变量缺失就返回1
  • max()会取该企业所有观测的missing()结果的最大值:只要该企业有任何一行存在缺失,any_missing就会被设为1;如果所有行的四个变量都完整,any_missing就是0

步骤2:删除含缺失值的完整面板

基于上面的标记,直接删掉所有any_missing为1的企业观测:

drop if any_missing == 1

为什么你的原代码没生效?

你之前的代码bysort BvD_ID YEAR: drop if sum(!missing(REV_LAY,EMP_LAY,FX_ASSET_LAY,MATCOST_LAY))==0存在两个核心问题:

  • 分组方式错误:bysort BvD_ID YEAR是按「企业+年份」分组,每个分组只有一行观测,所以sum(!missing(...))==0只会在该行四个变量全缺失时触发,只能删掉单条全缺失的行,而非整个面板
  • 判断逻辑偏差:!missing()是变量非缺失时返回1,sum(...)==0意味着该行四个变量全缺失,但你要的是只要面板里有任何缺失就删整个面板,逻辑完全不匹配

可选的一步到位写法

如果不想保留标记变量,可以把两步合并成一行:

bysort BvD_ID: drop if max(missing(REV_LAY, EMP_LAY, FX_ASSET_LAY, MATCOST_LAY)) == 1

内容的提问来源于stack exchange,提问作者Avinash Kumar

火山引擎 最新活动