本文申明

  • 如果本文出现逻辑或者学术错误,请在本页留言或者联系作者邮箱(caoyongzhuo@qq.com[国内邮箱];warnerjulia866@gmail.com[国外邮箱])

  • 虽然Markdown语法优雅且规范,但由于博客采用复杂的显示模式,部分文字或表格会被浏览器转义为较丑样式,后期优化,还请谅解

  • 任何转载复用,请遵守 Creative Commons 国际准则,未经授权禁止商业用途

  • 未对接任何广告,下文推荐的数据分发平台均为作者亲测后推荐,读者可以自行选择阿里云[建议]、腾讯云[建议]、百度云[不建议]等大厂平台

  • 如需广告对接请移步上述邮箱或下述WX号,请说明来意,否则一律拒接

Stata安装

  • 本文使用 Stata17 MP 中文和谐版(永久激活序列号)编写,内置常用命令库,如需安装与作者相同版本的Stata或有数据分析、一对一辅导需求,请移步WX号:15624552379

image-20230113163316287

Stata导入数据

[-] 导入方式(为方便示例,都使用Excel数据,不考虑SQL数据库数据)

  • 使用代码导入


    1. 优点:对于超大型数据(一般是5w以上)的数据来说,使用代码导入更加快速,不易出错
    2. 缺点:要提前对于Excel数据进行分析整理
  • 使用Stata图形化界面导入


    1. 优点:对于中小型数据、不懂复杂数据结构的人来说是一种友好方式
    2. 缺点:不适合超大型数据导入

[-] 示例数据如下(请读者自行下载)

  • 为了博客运转速度不被大型文件拖垮,本文所有数据将全部托管于”七牛云CDN“进行转储并全球分发,请读者自行下载

  • 下载模式:点击加粗或高亮超链接文字跳转下载

  • 特别说明:七牛云CDN的付费挺贵的,希望不要有任何不怀好意之人使用网络下载器或爬虫频繁发起请求,博客安装了IP探针并且和公安联网,访客IP都将被记录存档,每12小时上传云端,如果遇到不法分子恶意请求或攻击,后果自负!

  • auto示例数据.xlsx下载

[-] 使用代码方式导入

cd "F:\STATA测试数据" //切换工作目录
clear //清除内存中的数据
set more off //设置结果滚动显示
import excel using "auto示例数据.xlsx", firstrow clear //更多参数请在命令行窗口输入 help import 进行详细语法查看
  • 工作目录以自己电脑的Excel文件存储地址为准,前三行是stata编码的三部曲
  • auto示例数据.xlsx是需要导入的文件名,具体以自己的文件名为准
  • firstrow参数是将Excel的第一行作为Stata变量名

image-20230113163923153

image-20230113164101176

  • clear参数是将目前Stata内存中的数据清楚
  • import的类型不止Excel一种,具体可以参考手册进行查看,手册查看方式:在命令行窗口输入 help import

[-] 使用Stata图形化界面导入

  • 打开Stata,在顶部选择”文件“?”导入“?”Excel电子表格“

image-20230114100637190

  • 在接下来的界面中,选择”浏览“?找到你”存放Excel的目录“?选择”工作表“?选择”单元格范围“?勾选”将第一行作为变量名“?点击”确定“

image-20230114102322326

image-20230114102440649

  • 此时数据已经导入Stata的数据管理器中,我们可以在右侧的<变量窗口##中看到导入的数据变量名(Excel表的第一行)

image-20230114102753628

  • 如果需要查看每一个变量名所对应的具体数值,我们可以点击Stata上方的数据编辑器

image-20230114103013997

数据类型、数据结构辨析

[-] Stata的常用数据类型

  • str --- 字符串类型 (在Stata 17的数据管理器中显示为黄色)
  • byte --- 字节类型 (在Stata 17的数据管理器中显示为白色)
  • int --- 整形类型 (在Stata 17的数据管理器中显示为白色)
  • double --- 数值类型 (在Stata 17的数据管理器中显示为蓝色)

认识基本的数据类型有助于后期在数据预处理过程中如merge、append、duplicates drop等命令的正常运行

[-] Stata的常用数据结构

  • 截面数据 --- 作者口诀:多个体,单时间
  • 时间序列数据 --- 作者口诀:单个体,多时间
  • 面板数据 --- 作者口诀:多个体,多时间

作者在此处使用 山东大学 - 陈强 -《高级计量经济学》中的课件进行阐释,陈强博客地址:http://www.econometrics-stata.com/col.jsp?id=101

  1. 截面数据
2013 年中国分省 GDP (亿元)
省份 GDP
北京 19500.56
天津 14370.16
河北 28301.41
山西 12602.24
内蒙古 16832.38
辽宁 27077.65
吉林 12981.46
黑龙江 14382.93
上海 21602.12
江苏 59161.75
浙江 37568.49
安徽 19038.87
福建 21759.64
江西 14338.5
山东 54684.33
河南 32155.86
湖北 24668.49
湖南 24501.67
广东 62163.97
广西 14378
海南 3146.46
重庆 12656.69
四川 26260.77
贵州 8006.79
云南 11720.91
西藏 807.67
陕西 16045.21
甘肃 6268.01
青海 2101.05
宁夏 2565.06
新疆 8360.24
  1. 时间序列数据
1994-2013 年山东省 GDP (亿元)
年份 GDP
1994 3844.5
1995 4953.35
1996 5883.8
1997 6537.07
1998 7021.35
1999 7493.84
2000 8337.47
2001 9195.04
2002 10275.5
2003 12078.2
2004 15021.8
2005 18366.9
2006 21900.2
2007 25776.9
2008 30933.3
2009 33896.6
2010 39169.9
2011 45361.9
2012 50013.2
2013 54684.3
  1. 面板数据
1994-2013 年中国分省 GDP (亿元)
省份 年份 GDP
北京 1994 1145.31
北京 1995 1507.69
... ... ...
北京 2012 17879.4
北京 2013 19500.56
天津 1994 732.89
天津 1995 931.97
... ... ...
天津 2012 12893.88
天津 2013 14370.16
... ... ...
新疆 1994 662.32
新疆 1995 814.85
... ... ...
新疆 2012 7505.31
新疆 2013 8360.24

在一般情况下,对于面板数据,我们可以拆分成截面数据和时间序列数据,但是这个过程无法逆向拆分,只可以逆向补充。原因是面板数据作为多个体、多时间的数据结构来说,想要拆分成截面数据的话,只需要提取单个时间节点的数据;想要拆分成时间序列数据的话,只需要提取单个个体的数据,这是一个十分有趣的过程,在下面我们进行详细介绍。

[-] 面板数据拆分为截面数据

** 面板数据拆分截面数据演示
cd "F:\STATA测试数据" //切换工作目录
clear //清除内存中的数据
set more off //设置结果滚动显示
import excel using "1994-2013年分省.xlsx", firstrow clear //导入面板数据

image-20230114144448416

  • 我们假设只需要截取1994年的界面数据
keep if 年份 == 1994 //第一种方式,使用keep保留符合要求的数据
drop if 年份 != 1994 //第二种方式,使用drop删除不符合要求的数据

此处Markdown语法与Stata语法出现了转义,请读者按照下图第14行代码中的"!="描述<不等于##逻辑判断

image-20230114145114977

[-] 面板数据拆分为时间序列数据

keep if 省份 == "北京" //第一种方式,使用keep保留符合要求的数据
drop if 省份 != "北京" //第二种方式,使用drop删除不符合要求的数据

此处Markdown语法与Stata语法出现了转义,请读者按照下图第14行代码中的"!="描述<不等于##逻辑判断

image-20230114181202928

字符串拼接

[-] 原始数据结构

| var1 | var2 | //变量名

% str % str % //数据类型

[-] 语法

gen new_var = var1 + var2

[-] 示例原始数据

| var1 | var2 |
| 12345| 5678 |

[-] 示例语法

gen sum_string = var1 + var2

[-] 示例结果数据

| var1 | var2 | sum_string | //变量名
| 12345 | 5678 | 123455678 | //变量名所对应的数值

字符串拆分

[-] 原始数据结构

| sum_string |

% str %

[-] 语法

gen new_var = substr(sum_string,m,n)

  • m : 从单元格第几个字符开始
  • n :从开始字符选择几个字符
  • 注意:一个汉字占用2个字符,一个数字占用1个字符

[-] 示例原始数据

| sum_string |

| 12345678 |

[-] 示例语法

gen var3 = substr(sum_string,2,4)

[-] 示例结果数据

| var3 |

| 2345 |

分组求和(单、多层级)

[-] 原始数据结构

数据结构不限

[-] 语法

bysort var1 : egen new_var = sum(var2) // 以var1为分类,对var2分组求和

bysort var1 var3 : egen new_var = sum(var2) // 以var1为一级分类,var3为二级分类,对var2分组求和

  • 其中的sum()函数可以更换为count()分组计数、max()分组求最大值
  • 其中的new_var变量名换成自己想要的就行

[-] 示例原始数据

| var1 | var2 | var3 |
| 1 | 3 | A |
| 1 | 2 | A |
| 1 | 2 | A |
| 1 | 3 | B |
| 1 | 2 | B |
| 1 | 3 | B |
| 2 | 1 | A |
| 2 | 1 | A |
| 2 | 2 | A |
| 2 | 2 | B |
| 2 | 2 | B |

[-] 示例语法

bysort var1 var3 : egen newvar = count(var2)

[-] 示例结果数据

| var1 | var2 | var3 | new_var |
| 1 | 3 | A | 3 |
| 1 | 2 | A | 3 |
| 1 | 2 | A | 3 |
| 1 | 3 | B | 3 |
| 1 | 2 | B | 3 |
| 1 | 3 | B | 3 |
| 2 | 1 | A | 3 |
| 2 | 1 | A | 3 |
| 2 | 2 | A | 3 |
| 2 | 2 | B | 3 |
| 2 | 2 | B | 3 |