统计面板数据集中分类变量的变化次数

Counting number of changes in categorical variable in panel data set

我正在使用具有以下变量的面板数据集。这是我的数据片段:

i     region urban year
8431  3      1     1979
8431  3      1     1980
8431  3      1     1981
8431  3      1     1982
8431  3      0     1983
8431  3      0     1984
8431  3      0     1985
8431  3      0     1986
8431  3      0     1987
8431  3      0     1988
8431  3      0     1989
8431  3      1     1990
8431  3      1     1991
8431  3      1     1992
8431  3      1     1993
8431  3      1     1994
8431  3      1     1996
8431  3      0     1998
8431  3      1     2000
8431  3      1     2002
8431  3      1     2004
8431  3      1     2006
8431  2      0     2008
8431  3      1     2010
8431  3      1     2012

面板非常平衡,但我通过插值处理的数据中存在一些缺失的观察结果。

我想计算每个人在观察期间 regionurban 发生变化的总次数。

我尝试的第一件事是滞后值:

bysort i: gen urban_lag = l1.urban
bysort i (year): gen urbanchange = 0 if urban==urban_lag & !missing(urban)
replace urbanchange = 1 if urban!=urban_lag & !missing(urban)

出于某种原因,这会产生很多缺失值,即使对于 region 没有缺失值的个人也是如此。有谁知道为什么会这样吗?

然后我尝试了这个:

sort i year
by i: gen byte urbanchange = urban != urban[_n-1]

这主要是有效的,让我稍微接近我想要的地方,除了每个人的第一次观察等于 1,因为 change[0] 在数据开始之前,所以 Stata returns 它丢失了,所以我得到每个人的 urbanchange[1] = 1

这是我想要的输出:

i     region urban year  regionchange  urbanchange
8431  3      1     1979  0             0
8431  3      1     1980  0             0
8431  3      1     1981  0             0
8431  3      1     1982  0             0
8431  3      0     1983  0             1
8431  3      0     1984  0             0
8431  3      0     1985  0             0
8431  3      0     1986  0             0
8431  3      0     1987  0             0
8431  3      0     1988  0             0
8431  3      0     1989  0             0
8431  3      1     1990  0             1
8431  3      1     1991  0             0
8431  3      1     1992  0             0
8431  3      1     1993  0             0
8431  3      1     1994  0             0
8431  3      1     1996  0             0
8431  3      0     1998  0             1
8431  3      1     2000  0             1
8431  3      1     2002  0             0
8431  3      1     2004  0             0
8431  3      1     2006  0             0
8431  2      0     2008  1             1
8431  3      1     2010  1             1
8431  3      1     2012  0             0

这个问题基本上是我一年前问的这个问题的Stata版本

关于插值的编辑:因为我的数据中有很多差距,对于有缺失值的观察,我假设,例如,个人当前的城市价值与上次观察到的(非缺失)城市值相同。

例如:

region  urban   year
1       1       1979
1       1       1980
1       1       1981
3       1       1982
3       1       1983
3       1       1984
.       .       1985
1       1       1986
1       1       1987
1       1       1988
1       1       1989
.       .       1990
.       .       1991
.       .       1992
.       .       1993
.       .       1994
        

我这样填写缺失值:

gen urban1 = urban
bysort i (year): replace urban1 = urban1[_n-1] if missing(urban1)
gsort i -year 
replace urban1 = urban1[_n-1] if urban1 >=. 

并对地区执行相同的操作。

输出:

region  urban   year   region1  urban1
1       1       1979   1        1
1       1       1980   1        1
1       1       1981   1        1        
3       1       1982   3        1
3       1       1983   3        1        
3       1       1984   3        1        
.       .       1985   3        1
1       1       1986   1        1
1       1       1987   1        1
1       1       1988   1        1
1       1       1989   1        1
.       .       1990   1        1
.       .       1991   1        1
.       .       1992   1        1
.       .       1993   1        1
.       .       1994   1        1

我在这里做了一些强有力的假设,有些人可能不同意我在这里做的事情,但为了计算变化的数量,它不会影响我想要的结果,缺失值不会不要打扰我的输出。

本回答重点关注问题,即统计一个面板的变化次数。您想要的输出只是其中的一部分,因为它由指标组成,其中 1 表示更改,0 表示相同。

使用您的数据示例考虑此代码:

clear 
input i     region urban year
8431  3      1     1979
8431  3      1     1980
8431  3      1     1981
8431  3      1     1982
8431  3      0     1983
8431  3      0     1984
8431  3      0     1985
8431  3      0     1986
8431  3      0     1987
8431  3      0     1988
8431  3      0     1989
8431  3      1     1990
8431  3      1     1991
8431  3      1     1992
8431  3      1     1993
8431  3      1     1994
8431  3      1     1996
8431  3      0     1998
8431  3      1     2000
8431  3      1     2002
8431  3      1     2004
8431  3      1     2006
8431  2      0     2008
8431  3      1     2010
8431  3      1     2012
end 

bysort i (year) : gen change1 = sum(region != region[_n-1])
by i : replace change1 = change1[_N]

by i : gen change2 = sum(urban != urban[_n-1])
by i : replace change2 = change2[_N]

tabdisp i, c(change?) 

----------------------------------
        i |    change1     change2
----------+-----------------------
     8431 |          3           7
----------------------------------

sum() 计算 运行ning 或累积总和,查看每个面板中的最后一个值会给出一个变量的法术数或 运行s,每个法术或 运行 由相关变量定义为常量。

重要的是要考虑在第一次观察每个面板时会发生什么。那是观察 1。正如您所说,Stata 对先前观察 0 中的值的隐式或显式引用感到满意,但总是 returns 缺失值。所以在数据示例中 region[1] 为 1,region[0] 返回为缺失,因此 region[1] 不等于 region[0]。因此,即使变量在面板中完全不变,此代码生成的每个计数变量也将为 1。如果您只想在面板 更改,请在最后一条语句中减去 1。

更多关于识别法术的原则,参见this column

由于您面板中的空白,我使用了下标而不是时间序列运算符。我不能充分理解你提到的插值来计算出插值后数据的样子,无论如何数据示例包含间隙,这就是回答的人可以看到的。

那么,为什么会出现缺失值?首先,您的代码会在每个面板的第一次观察中产生缺失值,除非第一个值也缺失。其次,差距会导致时间序列运算符的缺失值。

你的第一个代码块

bysort i: gen urban_lag=l1.urban
bysort i (year): gen urbanchange = 0 if urban==urban_lag & !missing(urban)
replace urbanchange = 1 if urban!=urban_lag & !missing(urban)

取决于上一个

tsset i year 

但考虑到您之前这样做,块几乎减少到

gen urbanchange = urban != l1.urban & !missing(urban) 

在面板标识符中使用 by: 前缀以及使用时间序列运算符是完全合法的,但不是必需的。时间序列运算符的部分神奇之处在于,在存在单独面板的情况下,可以保证单独计算。