Stata 当与[_n]和[_n-1]组合时,按运算符不起作用

Stata 当与[_n]和[_n-1]组合时,按运算符不起作用,stata,Stata,在我的数据集中,变量dyrstr对于每个公司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

在我的数据集中,变量dyrstr对于每个公司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的变量,如果关于单个公司iddyrstr有多个值

我的代码如下所示:

sort firm_id year
by firm_id: gen twodyrstr = 1 if (dyrstr[_n-1] != dyrstr[_n])
不幸的是,在这种情况下,如果公司id发生变化,那么由公司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没有值表示缺少值。
为什么我的代码不起作用?我做错了什么

Stata正在做你要求它做的事情:对于每个
公司id
, 将当前观测值与前一个观测值进行比较,并设置新变量 如果它们不同,则为1。这只发生在每次首次观察时,因为 它与Stata中的“非常高的数字”相比较

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

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。

Stata正在执行您要求它执行的操作:对于每个
公司id
, 将当前观测值与前一个观测值进行比较,并设置新变量 如果它们不同,则为1。这只发生在每次首次观察时,因为 它与Stata中的“非常高的数字”相比较

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

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。

@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)

@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)

谢谢你的回答,但这并不是我想要的。我不仅想检查“每个公司的第一个和最后一个观察结果是否一致”,还想检查每个公司是否有不同的观察结果。该策略使用对第一个和最后一个观察结果的检查来总结每个公司是否有不同的观察结果。如果一家公司有不同的观察结果,这必然意味着第一个和最后一个是不同的。如果它们都一样,那么第一个和最后一个是相等的。因此,这就足够满足您的需求(如果我正确理解您的问题的话)。注意
排序的重要性。这种逻辑在Stata中非常有用,一般来说,在任何编程语言中都是如此。@Roberto Ferrer的方法与之相匹配,现在我明白你的意思了!非常感谢你的回答。谢谢你的回答,但这并不是我想要的。我不仅想检查“每个公司的第一个和最后一个观察结果是否一致”,还想检查每个公司是否有不同的观察结果。该策略使用对第一个和最后一个观察结果的检查来总结每个公司是否有不同的观察结果。如果一家公司有不同的观察结果,这必然意味着第一个和最后一个是不同的。如果它们都一样,那么第一个和最后一个是相等的。因此,这就足够满足您的需求(如果我正确理解您的问题的话)。注意
排序的重要性。这种逻辑在Stata中非常有用,一般来说,在任何编程语言中都是如此。@Roberto Ferrer的方法与之相匹配,现在我明白你的意思了!非常感谢你的回答。