如何解决计算面板数据集中分类变量的变化次数
我正在处理具有以下变量的面板数据集。这是我的数据片段:
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 将其返回为缺失,所以我为每个人得到 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版本Counting the number of changes of a categorical variable during repeated measurements within a category
关于插值的编辑:由于我的数据中有很多差距,对于缺失值的观察,我假设,例如,个人当前的城市价值与最后观察到的(非缺失)城市值。
例如:
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()
计算运行或累积总和,查看每个面板中的最后一个值会为您提供法术或运行变量的数量,每个法术或运行由所讨论的变量定义为常数。
重要的是要考虑在每个面板的第一次观察中会发生什么。这就是观察 1。正如您所说,Stata 对先前观察 0 中的值的隐式或显式引用感到满意,但始终返回缺失值。因此,在数据示例中,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:
前缀以及使用时间序列运算符是完全合法的,但不是必需的。时间序列运算符的部分白魔法在于,如果存在单独的面板,则可以保证单独的计算。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。