统计面板数据集中分类变量的变化次数
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
面板非常平衡,但我通过插值处理的数据中存在一些缺失的观察结果。
我想计算每个人在观察期间 region
和 urban
发生变化的总次数。
我尝试的第一件事是滞后值:
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:
前缀以及使用时间序列运算符是完全合法的,但不是必需的。时间序列运算符的部分神奇之处在于,在存在单独面板的情况下,可以保证单独计算。
我正在使用具有以下变量的面板数据集。这是我的数据片段:
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
面板非常平衡,但我通过插值处理的数据中存在一些缺失的观察结果。
我想计算每个人在观察期间 region
和 urban
发生变化的总次数。
我尝试的第一件事是滞后值:
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:
前缀以及使用时间序列运算符是完全合法的,但不是必需的。时间序列运算符的部分神奇之处在于,在存在单独面板的情况下,可以保证单独计算。