Stata:计算时忽略缺失值

时间:2013-12-16 08:44:40

标签: stata

我想创建一个变量(计数器),它每年计算另一个变量( firmage0 )的非缺失值。我的代码如下所示:

sort year  
quietly by year: gen counter = _n if firmage0 != . 

不幸的是,即使存在缺失值,Stata也会以1开始计数。但是我想在有一个非缺失值时开始计算。另外,第二个非缺失值应该具有值“2”,第三个“3”等等。有一个重要的限制。请勿使用保留恢复!创建变量计数器后,我的数据集看起来像这样(这只是它的一小部分)。自由空间意味着缺失价值!

year    firmage0    counter
1975        
1975        
1975        
1975        
1975    21  5
1975        
1975    60  7
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975    115 20
1975        
1975        
1975

但数据集应该如下所示:

year    firmage0    counter
1975        
1975        
1975        
1975        
1975    21  1
1975        
1975    60  2
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975    115 3
1975        
1975        
1975    

2 个答案:

答案 0 :(得分:3)

系统变量_n 已修复,因为它表示当前观察的编号,与if条件无关。您对代码的要求是counter,如果没有丢失,则会显示观察次数的值。这与直到特定点的非缺失观察计数不同,这是您真正想要的。

请注意 缺失的数据类型。当你提出它时,firmage0似乎是一个字符串变量,因为 空白是字符串的缺失。数值缺失是 表示为.(或.<something>)。见help missings

一种解决方案是针对sum执行累积missings条件。我假设变量类型是数字:

clear all
set more off

input year firmage0
1975      .  
1975      . 
1975      .      
1975      .  
1975    21
1980    60 
1980    .
1980    89       
1985      . 
1985      .  
1985    23    
1985    45    
1985    47
1985     .   
end 

list, sepby(year)

bysort year: gen counter = sum(!missing(firmage0))
replace counter = . if missing(firmage0) // optional

list, sepby(year)

!missing(firmage0)的计算结果为false(0)或true(1),具体取决于firmage0的观察是否缺失。然后sum执行累计总和。

如果变量实际上是字符串类型,则将相应的行替换为:

replace counter = "" if missing(firmage0) // optional

单行(对于数字类型)是:

bysort year: gen counter = cond(missing(firmage0), ., sum(!missing(firmage0)))

但我更喜欢第一种方式,因为它更容易阅读。

答案 1 :(得分:1)

我相信如果你之前按yearfirmage0排序:

. sort year firmage0

你将解决你的问题。我更改了其中一个firmage0值的年份,以确认它会重新启动计数。

. by year : gen counter = _n if firmage0 !=.

year    firmage0    counter               
1975    21  1     
1975    60  2   
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1975        
1976    115 1