在我的数据集中,变量 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 没有值意味着缺少值。 为什么我的代码不起作用?我做错了什么?
答案 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)。