Stata中两类if条件表达式执行结果不一致的技术问询
为什么Stata中两种if条件写法执行结果不同?
原本以为command var if v1 & v2 ==1和command var if v1==1 & v2==1功能等价,但实际执行结果有差异。以下是仅if条件不同的两段代码:
第一段代码:
forvalues i = 35/99 { if inlist(`i', 45, 50, 61, 68, 72, 88) continue recode A`i'_a A`i'_b A`i'_c (.=0) if A`i'_a & A`i'_b & A`i'_c }
第二段代码:
forvalues i = 35/99 { if inlist(`i', 45, 50, 61, 68, 72, 88) continue recode A`i'_a A`i'_b A`i'_c (.=0) if A`i'_a==. & A`i'_b==. & A`i'_c==. }
执行完以下代码后统计观测数,结果不一致:
forvalues i = 1/99 { if inlist(`i', 45, 50, 56, 57, 58, 61, 68 , 72) continue drop if A`i'_a==. | A`i'_b==. | A`i'_c==. }
问题原因解析
在Stata的逻辑判断规则里,直接写变量名和明确判断缺失值的逻辑完全不同:
- 直接使用变量名(如
Ai'_a)作为条件时,Stata会将**非0且非缺失**的数值视为真,0和缺失值(.)视为假,等价于Ai'_a != 0 & Ai'_a != .`。 - 而
Ai'_a==.`是明确判断变量是否为缺失值,只有当变量确实是缺失状态时才返回真。
回到你的代码:
- 第一段代码的
if条件要求三个变量都非0且非缺失才执行recode,但此时变量本身没有缺失值,这段recode操作实际不会生效。 - 第二段代码的
if条件要求三个变量全为缺失时才执行recode,会把这些缺失值替换成0。
两种处理后的数据状态完全不同:第一段代码里的缺失值保留,后续执行drop操作时会被剔除;第二段代码里的缺失值被转为0,不会被drop。最终统计的观测数自然出现差异。
内容的提问来源于stack exchange,提问作者Anis
相关产品推荐
相关产品推荐

