【Stata】数据批量季节调整教程

一、关于季节调整:

之前是一直在用 Eviews 做 X-12 的季节调整,但是调整选项和 Stata 的相比确实有点少了,影响精度。
另外,做 BigData 的模型动则 几千个 个体不可能一个个在 Eviews 里手动调整,有人提到过用 Eviews 命令行批量执行,但是控制选项又很困难(我也没试过,命令行能不能跑起来也是个问题),总的来说用 Stata 季节调整是最优的。

二、问题:

用 Stata 最大的问题就是不好批量做季节调整,于是踩了一些坑,思考了一套最快的批量调整方案,附代码。

  1. 在调整前你需要具备 Stata 季节调整程序,可以在 人大经济论坛 下。
    没有人大经济论坛的可以进网盘下全套程序:下载链接,提取码: 2vjy
  2. 下完之后只需要把 x12a 文件夹里的 x12a.exe 放到你的 Stata 的 plus 目录就可以,下面介绍如何找 plus 目录:
    (1)在 Stata 里执行 sysdir ,就会显示你的 PLUS 目录
    (2)直接把 x12a.exe 放到 plus 目录下即可
  3. 安装季节调整包,命令:
	findit sax12
	net install st0255.pkg

三、解决方案

注:假如你只需要调整几个变量,不需要查看本教程,直接输入命令 db sax12 调整即可,可以参考 Lee_iris 这套不错的设定方案。

  1. 先把大量数据导进 Stata ,我们这里假设的是 多变量 、 面板数据 ,注意变量名字统一用英文,中文 x12a.exe 不识别,建议使用 var01 或者 var1 这种形式的命名,为后续操作提供便利。

  2. 生成时间序列,确定时间区间。在 Stata 执行以下代码:

	gen t=tm(2009m1)+_n-1
	tsset t, monthly

这段代码的作用是先生成时间数据,之后设定,下面介绍修改项:
(1)其中 tm() 函数要根据你的时间形式来选取,如果是 2009m1 也就是只有到月度的数据(最常用的),使用 tm() 函数即可,如果是精确到 ,请自行百度找到相应函数替换,有关函数可参考 这篇文章
(2)其中 tm() 函数内是数据的起始时间,这里是假定为了 2009m1 开始,可以自行替换自己的起始时间,注意 tsset 之后根据显示的确认一下你的时间区间是否正确。

  1. Python 批量拼接生成执行代码,拼接完成的 Stata 执行季节调整命令举例:
sax12 var01, satype(single) inpref(z1.spc) outpref(z1) transfunc(none)  regpre( const td ) ammaxlag(2 1) ammaxdiff(2 1) ammaxlead(12) x11mode(add) x11seas(x11default)

注:这套调整方案是参考 Lee_iris 的,如果想自己设定调整方案,先用 db sax12 界面化执行一次你的方案,再把自动执行的代码拷贝过来即可作为方案。

Python 拼接方案代码:

import os

# 面板数据个体数 + 1
n = 35

text = 'sax12 var'
text1 = ', satype(single) inpref(z'
text2 = '.spc) outpref(z'
text3 = ') transfunc(none) \
    regpre( const td ) ammaxlag(2 1) ammaxdiff(2 1) ammaxlead(12) x11mode(add) x11seas(x11default)'

stata = ''

for i in range(1,n):
    stata += text
    if i<=9:
        stata += '0' + str(i)
    else:
        stata += str(i)
    stata += text1 + str(i) + text2 + str(i) + text3 + '\n\n'

with open('BatchSeasonalProcessingStatementGeneration.txt', 'w') as f:
    f.write(stata)

注:这里变量名假设成了 z01z09 这种,所以要手动在前十个补 0,你也可以设定成不带 0 前缀的。当然你用 var01var1 这种类型也可以,不过后面清扫文件的时候要小心。

(1)有三个需要拼接的地方,第一个是上面 Stata 例子语句里变量 var01 部分,也是你 Stata 里给变量设定的名字,第二个是 .spc 文件,我们这里用 Python 拼接的时候,假定为了 z+序号 形式的,为了给后续操作提供便利,建议使用相同格式,第三个是输出前缀,这里同样使用 z+序号 的前缀格式。
(2)注意要修改 n 为你的面板个体数。(假定有 34 个省,那就是 35

如果你不熟悉 Python ,可以参考格式自行用熟悉的语言拼接生成。另外如果你只有 几十个个体 ,网盘文件里还提供了生成好的 几十个 命令行,无需进行这一步。

  1. 将批量生成的代码在 Stata 里跑完,执行过程会不断有 控制台 窗口弹出,不要点击,否则会导致暂停。另外,还会自动打开 季节调整报告 ,无需理会,最后一并关掉即可。

注:如果报错,说明你的 季节调整程序x12a.exe 没有放对位置,或者 sax12 库没有安装,亦或是 空格出错 ,单词中断了,自行检查,可以先跑一条试试看。

  1. 跑完之后打开你的 Stata 安装根目录,下面会有一大堆 z+序号 格式的文件,全部复制备份起来,如果你想了解每一个文件的内容并做 X-12 季节调整 分析和预测,请打开以 .out 为结尾的文件查看 季节调整报告
    之后用以下代码执行这些文件的汇总和清扫工作,一劳永逸:
import os

# n 为面板数据个体数 + 1
n = 35
# t 为时间期数
t = 11 * 12

data = {}

for i in range(1,n):
    data[str(i)] = []
    with open('z' + str(i) + '.d11', 'r') as f:
        lines = f.readlines()
        for line in lines:
            lineList = line.strip().split('\t')
            if lineList[0] != 'date' and lineList[0] != '------':
                data[str(i)].append(lineList[1])

with open('SeasonalAdjustmentDataExtraction.csv', 'w') as f:
    for i in range(t):
        lineData = ''
        for j in range(1,n):
            lineData += data[str(j)][i] + ','
        lineData = lineData[:-1]
        lineData += '\n'
        f.write(lineData)
# 清扫
file_dir = r'./'
files = os.listdir(file_dir)
for i in range(len(files)):
    if files[i].find('z') != -1:
        os.remove(files[i])
for i in range(1,n):
    fileName = 'var'
    if i<=9:
        fileName += '0' + str(i)
    else:
        fileName += str(i)
    fileName += '.dat'
    os.remove(fileName)

注:需要修改的只有 nt ,按自己情况来。

  1. 执行完毕之后,自动清扫了冗余的 z+序号 文件,同时生成了·SeasonalAdjustmentDataExtraction.csv 汇总表格,点开即为 季节调整 后的 面板数据 结果,横向为时间期数,纵向为按 var01 即 Stata 命名顺序排列的个体。

注:清扫的时候是把所有 z 开头的文件都清扫了,如果要自定义清扫,可以手动删除或者写别的规则,之所以用 z 开头的变量是因为 Stata 根目录没有带 z 字母的文件。

后记

虽然流程有点小复杂,但是都有相应的机械化方案,还是比较快的,Eviews 即使有最新的 X-13 解决方案, 自动化 还是问题,另外没有国内相适配的假期设定。

评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值