Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
作者:初虹 (微信公众号-虹鹄山庄)
邮箱:ch2099058972@163.com
目录
CEIC 数据库可以通过 CDMNext 在线访问。CEIC 中国经济数据库涵盖超过 42 万条时间序列数据,18 个宏观经济部门,覆盖 297 个地级市和 2000 多个县。其丰富的数据、简洁的界面,已经成为笔者搜集地级市数据的最重要来源之一。
CEIC 数据库也提供了 API 功能,支持 Python、R 和 EViews 三种接口。做好相关配置后,我们可以直接在软件中访问 CEIC 数据库,非常方便。但是该功能取决于所在的机构是否购买了此服务,比如笔者所在的学校便没有购买 API 服务,因此无法使用该功能。
不过,CEIC 数据库也提供了 Excel 插件,可以直接通过插件下载和刷新 Excel 文件的数据 (操作系统需为 Windows 7 SP1 及以上、Office 版本需为 2007 及以上)。我本以为 CEIC 数据的 Excel 插件用起来不会太顺手,没想到从配置到使用都十分容易。本文便从数据的下载和更新说起,然后再通过 Stata 将数据整理成规范的面板数据。
首先,下载「CEIC Excel 插件」。插件版本需要根据自己的 Windows 系统和 Microsoft Office 版本进行选择。
下载后,双击 .exe
执行文件,默认安装即可。重启 Excel 便可看到 CDMNext 选项卡。
然后在连接校园网的前提下,点击登录,输入个人账号和密码 (需要注册),稍等片刻即可连接成功。
以下是选项卡中几个重要的选项的含义:
由于操作都十分基础,这里便不再演示。使用前推荐先浏览一遍「CDMNext 插件用户手册」。
我们可以通过网页端或 Excel 插件在线访问 CDMNext,并进行数据下载。选择数据表的下载方向为「行」,得到的数据结构如下图 2 所示,直接使用 CEIC 数据库的默认命名规则 (下图 3)。
我习惯为每个项目建立一个文件夹,在父文件夹下可以建立多个子文件夹。这样原始文件、临时文件和最终文件都不会混乱。
* 在当前工作目录下建立 lianxh_test 文件夹
cap mkdir lianxh_test
global path "./lianxh_test"
* 在当前路径下,生成 ceic 子文件夹,以及 Raw、Temp、Final 三个孙文件夹
cap efolder ceic, cd("$path") sub(Raw Temp Final) noc
global DR "$path/ceic/Raw" // 原始文件
global DT "$path/ceic/Temp" // 临时文件
global DF "$path/ceic/Final" // 最终文件
观察原始数据表,确定清洗顺序:首先,删除无用信息。B-Z 列多为数据的描述性统计量和其他不必要信息,可以仅保留 E 列 (下图 2)。接着,使用 labone
和 foreach
将首行处理成便于 reshape long
的格式 (下图 3)。
* 首行作为变量名称和变量标签
labone, nrow(1)
foreach v of varlist _all {
renvarlab `v', label
}
然后,根据 :
对首列进行分列操作 (split _0, p(":") gen(name)
),分离出省市名称等 (下图 4)。再将宽型数据转换成长型数据,这里使用的是比 reshape long
更简单的 gather
命令 (gather _*
),新生成变量名称默认为 variable 和 value (下图 5)。
接下来,通过 variable 生成年份变量 year,将 gather
生成的 value 重命名。我在这里通过 ustrregexra()
函数利用正则表达式仅保留中文字符, 再用一直保留的单位为 value 添加标签,便可得到下图 b。
最后,我们再仅保留必要变量、为省份和地级市行政名称变量重命名、destring
为数值型变量,便能清洗得到下图的效果。
drop variable name1 单位
rename (name2 name3) (prov_name city_name)
replace city_name = prov_name if (city_name == "")
destring, replace
save "$DT/国内生产总值.dta", replace
此部分完整的代码如下:
import excel "$DR/数列.xlsx", sheet("我的数列") allstring clear
drop B-D F-Z
labone, nrow(1)
foreach v of varlist _all {
renvarlab `v', label
}
split _0, p(":") gen(name)
drop in 1
drop _0
gather _*
gen year = real(substr(variable, -4, 4))
local value_name = ustrregexra(name1[1], ".[a-zA-Z_0-9\(\)]+", "", .)
rename value `value_name'
drop if `value_name' == ""
local label = 单位[1]
label var `value_name' "`label'"
drop variable name1 单位
rename (name2 name3) (prov_name city_name)
replace city_name = prov_name if (city_name == "")
destring, replace
save "$DT/国内生产总值.dta", replace
到这里,可能你会觉得太粗糙了些。是的,如果我们使用的变量不多时,一个个文件的处理也并非不可。但批量化、自动化的思维促使我们应该找到更简洁、智能的方式来提高效率。这里便可以使用 fs
、filesearch
、dir
等命令获取目录下的所有文件名,然后再用 foreach
循环上面的单个文件的处理操作即可。
cd "$DR/"
fs "*.xlsx"
foreach xlsx in `r(files)' {
import excel "`xlsx'", sheet("我的数列") allstring clear
...
save "$DT/`value_name'", replace
}
如果你也用过 CEIC 数据,应该会说上面的代码是有局限的。是的,CEIC 数据库将变量描述、省级行政名称、地市行政名称均存储在首列,并通过 :
分隔。容易出现的问题是,不少数据的变量描述不止一个,还会有细分描述,比如下图右侧。通过 split
分列后,首列会产生四个新列。
因此,我们就不能只用新生成的第一列变量描述给变量命名了,需要将所有的变量描述作为变量名称。同样 rename (name2 name3) (prov_name city_name)
也会有问题,需要进一步调整。
我这里的做法是,先将新生成的 name1-3 的第一行提取至 value_name
暂元里,然后去掉地级市标记,也便可以只保留变量描述了,再通过 forvalues
循环,确定出 city_name
和 prov_name
。
* city_name/prov_name 重命名
forvalues i = 1/`count' {
if (name`i'[1] == "") {
cap rename name`i' city_name
}
else if (name`i'[1] == "地级市合计") | (name`i'[1] == "北京") {
cap rename name`i' prov_name
}
}
该部分完整代码如下:
cd "$DR/"
fs "*.xlsx"
foreach xlsx in `r(files)' {
import excel "`xlsx'", sheet("我的数列") allstring clear
drop B-D F-Z
* 第一行作为标签
labone, nrow(1)
* 使用标签为变量重命名
foreach v of varlist _all {
renvarlab `v', label
}
* 使用:分列
split _0, p(":") gen(name)
local count = `r(nvars)'
* r(nvars) r(varlist)
drop in 1
drop _0
local value_name = name1[1]+name2[1]+name3[1]
local value_name = ustrregexra("`value_name'", "地级市合计|北京", "", .)
local label = 单位[1]
* city_name/prov_name 重命名
forvalues i = 1/`count' {
if (name`i'[1] == "") {
cap rename name`i' city_name
}
else if (name`i'[1] == "地级市合计") | (name`i'[1] == "北京") {
cap rename name`i' prov_name
}
}
replace city_name = prov_name if (city_name == "")
* reshape long
gather _*
gen year = real(substr(variable, -4, 4))
rename value `value_name'
drop if `value_name' == ""
label var `value_name' "`label'"
drop variable name* 单位
destring, replace
save "$DT/`value_name'", replace
}
上面的操作可以使得下载的 15 个变量表批量转为 DTA 文件。接下来,需要将下载的所有文件合并为一张表。可以先使用 fs
先获取文件名,然后 foreach
循环 merge
。
cd "$DT/"
fs "*.dta"
use "国内生产总值.dta", clear
foreach dta in `r(files)' {
merge 1:1 city_name year using `dta', nogen
}
encode city_name, gen(cid)
xtset cid year
order cid year
save "$DF/ceic.dta", replace
CEIC 数据库的 Excel 插件可以实现在 Excel 里访问 CDMNext 网页进行数据的下载和更新。在使用这个功能之前,为了数据保持最新状态,常常需要重新下载文件,不仅浪费了时间,也使得本地存储了同一个文件的好多不同版本。配置好 Excel 插件后,我们在用到的时候只需要点击一下便能自动更新,还是很方便的。
Note:产生如下推文列表的 Stata 命令为:
lianxh 清洗 local 循环, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
和songbl
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh