与[_n]和[_n-1]结合使用时,运算符不起作用

时间:2013-11-18 20:23:12

标签: stata

在我的数据集中,变量 dyrstr 应该与每个 firm_id 具有相同的值,如下所示:

firm_id year    dyrstr
1   1975    1974
1   1976    1974
1   1977    1974
1   1978    1974
1   1979    1974
3   1975    1941
3   1976    1941
3   1977    1941
3   1978    1941
3   1979    1941
4   1975    1963
4   1976    1963
4   1977    1963
4   1978    1963
4   1979    1963

要检查在数据集的其余部分是否也是如此,我想创建一个等于1的变量,如果对于单个 firm_id dyrstr 具有超过一个价值。

我的代码如下所示:

sort firm_id year
by firm_id: gen twodyrstr = 1 if (dyrstr[_n-1] != dyrstr[_n])

不幸的是,在这种情况下,如果 firm_id 发生变化,那么by firm_id似乎无效,因为 twodyrstr 等于1,这当然不是我想要的。 在下面你可以看到我的代码的结果:

firm_id year   dyrstr   twodyrstr
1   1975    1974    1
1   1976    1974    
1   1977    1974    
1   1978    1974    
1   1979    1974    
3   1975    1941    1
3   1976    1941    
3   1977    1941    
3   1978    1941    
3   1979    1941    
4   1975    1963    1
4   1976    1963    
4   1977    1963    
4   1978    1963    
4   1979    1963        

twodyrstr 没有值意味着缺少值。 为什么我的代码不起作用?我做错了什么?

2 个答案:

答案 0 :(得分:4)

Stata正在按照您的要求行事:对于每个firm_id, 将当前观察与前一个观察结果进行比较并设置新变量 如果它们不同,则为1。这只发生在每次第一次观察时,因为 它与.(缺失)进行比较,这是Stata中的“非常高的数字”。

另一种策略是在sort之后检查每家公司的第一次和最后一次观察是否一致:

clear all
set more off

input firm_id year    dyrstr
1   1975    1974
1   1976    1974
1   1977    1974
1   1978    1974
1   1979    1974
3   1975    1941
3   1976    1941
3   1977    1941
3   1978    1941
3   1979    1941
4   1975    1963
4   1976    1963
4   1977    1963
4   1978    1966
4   1979    1963
end

bysort firm_id (dyrstr): gen twodyrstr = (dyrstr[1] == dyrstr[_N])

list, sepby(firm_id)

请注意,排序是firm_id dyrstr,但命令的右侧仅由firm_id执行。这是通过在左侧的括号之间包含dyrstr来实现的。

如果你有错过并且所有其他非缺失值彼此相等,你将不会得到1,因为缺失被排序到最后一个位置,与非缺失值相比,并且评估为false(0) 。避免这种情况的一种方法是:

clear all
set more off

input firm_id year    dyrstr
1   1975    1974
1   1976    1974
1   1977    1974
1   1978    1974
1   1979    1974
3   1975    1941
3   1976    1941
3   1977    1941
3   1978    1941
3   1979    1941
4   1975    .
4   1976    1963
4   1977    .
4   1978    1963
4   1979    1963
end

* Do not destroy original; make a copy
generate dyrstrmiss = dyrstr
* Sort
sort firm_id dyrstrmiss
* "Extrapolate" if missing
replace dyrstrmiss = dyrstrmiss[_n-1] if missing(dyrstrmiss)
* Compare first with last
bysort firm_id: gen twodyrstr = (dyrstrmiss[1] == dyrstrmiss[_N])

list, sepby(firm_id)

公司4对dyrstr具有唯一非缺失值,但也有缺失值。但是,我们给它分配了1个。第一个代码将分配0。

答案 1 :(得分:1)

@Roberto Ferrer的优秀答案可以扩展为明确

会发生什么
sort firm_id year
by firm_id: gen twodyrstr = 1 if (dyrstr[_n-1] != dyrstr[_n])

在每个小组的开头。对于第一次这样的观察,这减少到

by firm_id: gen twodyrstr = 1 if dyrstr[0] != dyrstr[1]

引用任何varname [0]并不是错误,但Stata总是将其评估为缺失,所以

dyrstr[0] != dyrstr[1]
每当dyrstr[1]没有丢失时,

将为真(评估为1)。