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

如何解决计算面板数据集中分类变量的变化次数

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

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 将其返回为缺失,所以我为每个人得到 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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-