Stata:导入年度、季度、月度等频数面板数据-xtimportu

文摘   教育   2024-11-05 22:00   中国  

👇 连享会 · 推文导航 | www.lianxh.cn

🍓 课程推荐:2024 机器学习与因果推断专题
主讲老师:司继春 (上海对外经贸大学) ;张宏亮(浙江大学)
课程时间:2024 年 11 月 9-10 日 ;16-17日
课程咨询:王老师 18903405450(微信)

课程特色 · 2024机器学习与因果推断

  • 懂原理、会应用。本次课程邀请了两位老师合作讲授,目的在于最大限度地实现理论与应用的有机结合。为期四天的课程,分成两个部分:第一部分讲解常用的机器学习算法和适用条件,以及文本分析和大语言模型;第二部分通过精讲 4-6 篇发表于 Top 期刊的论文,帮助大家理解各类机器学习算法的应用场景,以及它们与传统因果推断方法的巧妙结合。
  • 以 Top 期刊论文为范例。目前多数人的困惑是不清楚如何将传统因果推断方法与机器学习结合起来。事实上,即便是 MIT 和 Harvard 的大牛们也都在「摸着石头过河」。为此,通过论文精讲和复现来学习这部分内容或许是目前最有效的方式了。张宏亮老师此前在浙江大学按照这一模式教授了「因果推断和机器学习」课程,效果甚佳:学生们能够逐渐建立起研究设计的理念,并在构造识别策略时适当地嵌入机器学习方法。

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

作者:朱菲菲 (中央财经大学)
邮箱:feifei.zhu@cufe.edu.cn

1. 简介

当处理不同时间频率的时间序列数据和面板数据时,Stata 的 xtimportu 命令提供了一个更高效的解决方案。使用传统的 import 命令将数据导入 Stata 时,我们可能需要进行以下多个步骤来处理数据:

  • 数据重塑:将宽格式数据转化为长格式数据,以适应面板数据分析。
  • 标识单位和时间:为数据中的单位(如公司或国家)和时间点创建唯一标识符。
  • 处理缺失值:检查并处理数据中的缺失值或异常值。
  • 时间格式转化:如果时间变量为字符串格式,可能需要将其转换为适当的日期或时间格式,例如 Stata 的 %t 格式。

与此不同,xtimportu 允许我们直接将矩阵形式的原始数据转换为面板数据并导入 Stata,省去了上述步骤。并且,当原始数据中存在合并单元格等问题时,该命令还允许用户定义预处理函数来解决这些问题。

注:宽格式数据(Wide Data)与长格式数据(Long Data)是两种常见的数据表示形式。宽格式数据是指每个观察单位在一行中拥有多个变量的数据形式,通常以多列的形式呈现。长格式数据是指每个观察单位在多行中拥有单个变量的数据形式,每个变量通常以一列的形式呈现,其他列为观察单位的标识符,标识符在每个观测值的行中重复出现。

2. 命令介绍

命令安装:

ssc install xtimportu, replace

命令语法:

xtimportu import syntax [, options]

其中,options 如下:

  • 导入数据 (Import Data)

    • import options:标准的 Stata 导入选项。
  • 预处理数据 (Preformat)

    • preformat(string):在导入前执行的命令或程序,针对复杂的原始数据,可以调用提前写好的预处理函数。
  • 处理数据 (Process)

    • panelvar(panelvar)unit 变量,默认为第一列变量;
    • regex(string):用于匹配变量名的正则表达式,多个匹配时用 "|" 分隔,注意区分大小写,支持 Unicode 字符统一码,可以省略;
    • encode(string):unit 的字符串替换,支持 Unicode 字符统一码,用“|”分隔。注意,字符串中的空格将替换为下划线 "_";
    • timevar(varname):待导入数据中时间变量的名称,如果 timevar 被省略则假设数据为宽格式;
    • tformat(string):用于设置时间格式,以便转换为数值。在格式化时,"[]" 表示可选部分,"##" 表示匹配两位数字,例如 "[##]YQ" 和 "M[##]Y",可以省略;
    • tfrequency(Y|H|Q|M):时间频率,主要为年度、半年度、季度或月度 (yearly,half-yearly,quarterly or monthly);
    • drop:删除半年、季度和月份按年度求和的数据;
    • tdestring:将 timevar 转换为 %t 格式,主要为 %ty (年度),%th (半年度),%tq (季度),%tm (月度)四种格式。
  • 完成数据处理 (Finalize)

    • generate(string):新值变量的名称,默认为 "value";
    • tostring:将值变量返回为字符串。
  • 保存输出数据 (Save Output)

    • clear:替换内存中的数据;
    • export:导出文件;
    • save:将处理后的数据保存到外部文件。

注:Unicode 是一个全球标准的字符编码系统,旨在为世界上的每一个字符——无论是字母、数字、标点符号还是符号——分配一个唯一的数字码点。这样做的目的是为了确保无论在哪个计算机系统或软件中,字符都能被正确地处理和显示。为了实现这一目标,Unicode 涵盖了包括但不限于:字母、数字、标点符号、货币符号、箭头、数学符号、技术符号、图形符号和表情符号在内的各种字符。以拉丁字母 "A" 为例,它在 Unicode 中的码点是 U+0041。

3. Stata实例

3.1 Example 1

Example 1 来自 help xtimportu,我们使用 xtimportu 命令处理捷克统计局人口档案文件,生成捷克共和国的人口时间序列数据。

首先定义文件链接和正则表达式:

****
* Example 1. 捷克共和国的人口时间序列
****

* 指标的正则表达式,区分大小写
. local regex "Počet"

* 数据来自捷克统计局人口档案文件网址
. local url "https://www.czso.cz/documents/10180/123502877/"
. local url "`url'32018120_0101.xlsx/"
. local url "`url'd60b89c8-980c-4f3a-bc0c-46f38b0b8681"
. local url "`url'?version=1.0"

在 Excel 中,我们可以看到目标 sheet 中的数据结构如下:

任务实现:使用 xtimportu 导入数据进行处理,cellrange(A3) 表示从 A3 开始的单元格范围内导入数据;通过正则表达式匹配 “Počet”,搜索出对应的数据,重新编码为 “Czech Republic”,此时新编码中的空格会自动转为下划线;tfreq(Y) 表示设定时间频率为“年”,tde 表示将 timevar 转换为时间格式。

* 将时间序列数据导入内存
. xtimportu excel "`url'", cellrange(A3) regex(`regex') ///
> encode("Czech Republic") tfreq(Y) tde clear

* 将下划线恢复为单元中的空格
. replace unit = ustrregexra(unit, "_", " ")

* 将数据设置为时间序列数据
. tsset year

通过 list 命令,可以看到内存中已经处理好的时间序列数据:

     +-----------------------------------+
| unit year value |
|-----------------------------------|
1. | Czech Republic 1989 10362.102 |
2. | Czech Republic 1990 10364.124 |
3. | Czech Republic 1991 10312.548 |
4. | Czech Republic 1992 10325.697 |
5. | Czech Republic 1993 10334.013 |
|-----------------------------------|
6. | Czech Republic 1994 10333.161 |
7. | Czech Republic 1995 10321.344 |
8. | Czech Republic 1996 10309.137 |
9. | Czech Republic 1997 10299.125 |
1. | Czech Republic 1998 10289.621 |
|-----------------------------------|
2. | Czech Republic 1999 10278.098 |
3. | Czech Republic 2000 10266.546 |
4. | Czech Republic 2001 10206.436 |
5. | Czech Republic 2002 10203.269 |
6. | Czech Republic 2003 10211.455 |
|-----------------------------------|
7. | Czech Republic 2004 10220.577 |
8. | Czech Republic 2005 10251.079 |
9. | Czech Republic 2006 10287.189 |
10. | Czech Republic 2007 10381.13 |
11. | Czech Republic 2008 10467.542 |
|-----------------------------------|
12. | Czech Republic 2009 10506.813 |
13. | Czech Republic 2010 10532.77 |
14. | Czech Republic 2011 10505.445 |
15. | Czech Republic 2012 10516.125 |
16. | Czech Republic 2013 10512.419 |
|-----------------------------------|
17. | Czech Republic 2014 10538.275 |
18. | Czech Republic 2015 10553.843 |
19. | Czech Republic 2016 10578.82 |
20. | Czech Republic 2017 10610.055 |
21. | Czech Republic 2018 10649.8 |
|-----------------------------------|
22. | Czech Republic 2019 10693.939 |
+-----------------------------------+

3.2 Example 2

Example 2 来自 help xtimportu

首先定义文件链接和正则表达式:

****
* Example 2. 贸发会议双边外国直接投资统计数据
* (历史数据, 2000–2014)
****

* 设定EU-28对应国家的正则表达式
. local regex "Austria|Belgium|Bulgaria|Croatia|Cyprus|"
. local regex "`regex'Czech Republic|Denmark|Estonia|Finland|"
. local regex "`regex'France|Germany|Greece|Hungary|Ireland|"
. local regex "`regex'Italy|Latvia|Lithuania|Luxembourg|Malta|"
. local regex "`regex'Netherlands\W{0,}$|Poland|"
. local regex "`regex'Portugal|Romania|Slovakia|Slovenia|Spain|"
. local regex "`regex'Sweden|United Kingdom"

* 数据来自 UNCTAD (联合国贸易和发展会议)中EU-28各国出口到美国的贸易额文件
. local url "https://unctad.org/system/files/"
. local url "`url'non-official-document/webdiaeia2014d3_USA.xls"

在 Excel 中,我们可以看到目标 sheet 中的数据结构如下:

任务实现:使用 xtimportu导入数据进行处理,从名为 “inflows” 的表单导入数据,从 E5 开始的单元格范围内导入数据,通过正则表达式筛选对应国家的数据,设定时间频率为“年”,将 timevar 转化为时间格式,最终导出 usa_fdi_matrix.csv 文件。

* 将面板数据导入内存,将副本导出为 CSV 文件
. xtimportu excel "`url'", sheet("inflows") cellrange(E5) ///
> regex(`regex') tfreq(Y) clear tde ///
> export(delimited "./usa_fdi_matrix.csv", replace)

* 变量重命名
. rename unit from
. rename value to_USA

* 设定面板数据
. encode from, gen(id)
. xtset id year

通过 list 命令,可以看到内存中已经处理好的面板数据,此处只展示前 30 行:

     +-------------------------------------------------+
| from year to_USA id |
|-------------------------------------------------|
1. | Austria 2001 -189 Austria |
2. | Austria 2002 1118 Austria |
3. | Austria 2003 42 Austria |
4. | Austria 2004 241 Austria |
5. | Austria 2005 -1033 Austria |
|-------------------------------------------------|
6. | Austria 2006 -179 Austria |
7. | Austria 2007 590 Austria |
8. | Austria 2008 370 Austria |
9. | Austria 2009 . Austria |
1. | Austria 2010 136 Austria |
|-------------------------------------------------|
2. | Austria 2011 198 Austria |
3. | Austria 2012 441 Austria |
4. | Belgium 2001 243 Belgium |
5. | Belgium 2002 -2712 Belgium |
6. | Belgium 2003 1770 Belgium |
|-------------------------------------------------|
7. | Belgium 2004 1299 Belgium |
8. | Belgium 2005 -1561 Belgium |
9. | Belgium 2006 541 Belgium |
10. | Belgium 2007 12835 Belgium |
11. | Belgium 2008 -989 Belgium |
|-------------------------------------------------|
12. | Belgium 2009 13262 Belgium |
13. | Belgium 2010 7405 Belgium |
14. | Belgium 2011 10297 Belgium |
15. | Belgium 2012 11876 Belgium |
16. | Cyprus 2001 1 Cyprus |
|-------------------------------------------------|
17. | Cyprus 2002 0 Cyprus |
18. | Cyprus 2003 -16 Cyprus |
19. | Cyprus 2004 . Cyprus |
20. | Cyprus 2005 . Cyprus |
21. | Cyprus 2006 . Cyprus |
|-------------------------------------------------|

3.3 Example 3

Example 3 来自 New commands xtimportu and xtmipolateu。

在 Excel 中,我们可以看到目标 sheet 中的数据结构如下:

Excel 中看到,原始数据集的时间标识较为复杂,同时存在年度、季度标识,并且有合并单元格,因此需要先进行预处理。

自定义如下函数,该函数首先删去了 C-G 列,即删去 2017 年之前的数据。然后使用 ds 命令遍历变量,对每一个变量的变量名进行了修改 (后期可通过在 xtimportu 调用该自定义函数从而实现对数据进行预处理):

****
* Example 3. 贸发会议双边外国直接投资统计数据
****

*定义一个名为 '_fix' 的函数
program def _fix
* 我们需要 2017 年第一季度以后的值
drop C-G
* 连接年份和季度 (Q#)
qui ds B, not
foreach var of varlist `r(varlist)' {
cap replace `var' = `var' + "-Q" + ustrregexra(`var'[_n + 1], "\D", "", .) if _n == 1
* 删除空列
if missing(`var'[1]) {
drop `var'
}
}
end

接着使用 xtimportu 导入数据进行处理,从 B3 单元格导入数据,调用自定义 program 处理数据,通过正则表达式筛选出 "Gross domestic product" 对应的数据,重新编码为 "GDP %change",设定时间频率为“季度”,并将 timevar 转化为时间格式。

. xtimportu excel "https://www.bea.gov/sites/default/files/2020-09/gdp2q20_3rd.xlsx", ///
> sheet(Table 1) cellrange(B3) preformat(_fix) regex(Gross domestic product) ///
> encode(GDP %change) tfreq(Q) tdestring clear

通过 list 命令,可以看到内存中已经处理好的数据:

     +-------------------------------+
| unit quarter value |
|-------------------------------|
1. | GDP_%change 2017q1 2.3 |
2. | GDP_%change 2017q2 1.7 |
3. | GDP_%change 2017q3 2.9 |
4. | GDP_%change 2017q4 3.9 |
5. | GDP_%change 2018q1 3.8 |
|-------------------------------|
6. | GDP_%change 2018q2 2.7 |
7. | GDP_%change 2018q3 2.1 |
8. | GDP_%change 2018q4 1.3 |
9. | GDP_%change 2019q1 2.9 |
1. | GDP_%change 2019q2 1.5 |
|-------------------------------|
2. | GDP_%change 2019q3 2.6 |
3. | GDP_%change 2019q4 2.4 |
4. | GDP_%change 2020q1 -5 |
5. | GDP_%change 2020q2 -31.4 |
+-------------------------------+

3.4 完整代码

****
* Example 1. 捷克共和国的人口时间序列
****

* 指标的正则表达式,区分大小写
local regex "Počet"

* 数据来自捷克统计局人口档案文件网址
local url "https://www.czso.cz/documents/10180/123502877/"
local url "`url'32018120_0101.xlsx/"
local url "`url'd60b89c8-980c-4f3a-bc0c-46f38b0b8681"
local url "`url'?version=1.0"

* 将时间序列数据导入内存
xtimportu excel "`url'", cellrange(A3) regex(`regex') ///
encode("Czech Republic") tfreq(Y) tde clear

* 将下划线恢复为单元中的空格
replace unit = ustrregexra(unit, "_", " ")

* 将数据设置为时间序列数据
tsset year


****
* Example 2. 贸发会议双边外国直接投资统计数据
* (历史数据, 2000–2014)
****

* 设定EU-28对应国家的正则表达式
local regex "Austria|Belgium|Bulgaria|Croatia|Cyprus|"
local regex "`regex'Czech Republic|Denmark|Estonia|Finland|"
local regex "`regex'France|Germany|Greece|Hungary|Ireland|"
local regex "`regex'Italy|Latvia|Lithuania|Luxembourg|Malta|"
local regex "`regex'Netherlands\W{0,}$|Poland|"
local regex "`regex'Portugal|Romania|Slovakia|Slovenia|Spain|"
local regex "`regex'Sweden|United Kingdom"

* 数据来自 UNCTAD (联合国贸易和发展会议)中EU-28各国出口到美国的贸易额文件
local url "https://unctad.org/system/files/"
local url "`url'non-official-document/webdiaeia2014d3_USA.xls"

* 将面板数据导入内存,将副本导出为 CSV 文件
xtimportu excel "`url'", sheet("inflows") cellrange(E5) ///
regex(`regex') tfreq(Y) clear tde ///
export(delimited "./usa_fdi_matrix.csv", replace)

* 变量重命名
rename unit from
rename value to_USA

* 设定面板数据
encode from, gen(id)
xtset id year


****
* Example 3. 贸发会议双边外国直接投资统计数据
****

*定义一个名为 '_fix' 的函数
program def _fix
* 我们需要 2017 年第一季度以后的值
drop C-G
* 连接年份和季度 (Q#)
qui ds B, not
foreach var of varlist `r(varlist)' {
cap replace `var' = `var' + "-Q" + ustrregexra(`var'[_n + 1], "\D", "", .) if _n == 1
* 删除空列
if missing(`var'[1]) {
drop `var'
}
}
end

xtimportu excel "https://www.bea.gov/sites/default/files/2020-09/gdp2q20_3rd.xlsx", ///
sheet(Table 1) cellrange(B3) preformat(_fix) regex(Gross domestic product) ///
encode(GDP %change) tfreq(Q) tdestring clear

4. 参考资料

  • Bolotov I. XTIMPORTU: Stata module to import monthly, quarterly, half-yearly or yearly time series and panel data as panelvar timevar valuevar from a supported file format to memory or a file[J]. 2022. -Link-
  • New commands xtimportu and xtmipolateu -Link-

5. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 面板数据, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

  • 专题:Stata教程
    • 连玉君Stata33讲:面板数据模型简介-FE和RE有何区别?
  • 专题:Stata命令
    • Stata:评估面板数据模型的样本外预测性能-xtoos
    • Stata新命令-tobalance:非平行面板转换为平行面板数据
  • 专题:数据处理
    • Stata数据处理:面板数据的填充和补漏
  • 专题:面板数据
    • Stata:面板数据的稳健回归-xtrobreg和robreg
    • Stata绘图:面板数据可视化-panelview
    • 因果面板数据模型的矩阵补全方法
    • Stata:动态面板数据模型与xtabond2应用
    • Stata:面板数据的莫兰指数计算与散点图绘制-xtmoran
    • Stata:面板数据缺失值与多重补漏分析-twofold
    • xtewreg:面板数据存在衡量偏误-测量偏误时如何估计?
    • 面板数据模型-xtdcce2:动态共同相关和截面相关
    • Stata:动态面板数据模型OLS估计的偏差
    • Stata实操陷阱:动态面板数据模型
    • Stata面板:suest支持面板数据的似无相关检验
    • Stata新命令-tobalance:非平行面板转换为平行面板数据
    • Stata: 面板数据模型一文读懂
  • 专题:内生性-因果推断
    • fect:基于面板数据的因果推断(上)-T218a
    • fect:基于面板数据的因果推断(下)-T218b
  • 专题:空间计量-网络分析
    • 空间面板数据模型及Stata实现
  • 专题:其它
    • 50问-T2:面板数据因果推断常见问题-对话徐轶青老师

🍓 课程推荐:2024 机器学习与因果推断专题
主讲老师:司继春 (上海对外经贸大学) ;张宏亮(浙江大学)
课程时间:2024 年 11 月 9-10 日 ;16-17日
课程咨询:王老师 18903405450(微信)

尊敬的老师 / 亲爱的同学们:

连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。 请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。 我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!https://www.wjx.cn/vm/YgPfdsJ.aspx# 再次感谢大家宝贵的意见!

New! Stata 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


连享会
连玉君老师团队分享,主页:lianxh.cn。白话计量,代码实操;学术路上,与君同行。
 最新文章