查看原文
其他

Stata之post命令——数据邮递

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:温和铭,中南财经政法大学统计与数学学院

本文编辑:王玉洁

技术总编:戴   雯

Stata&Python云端课程来啦!

       为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~爬虫俱乐部推出了Python编程培训课程Stata基础课程Stata进阶课程Stata文本分析正则表达式网络爬虫基本字符串课程。报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦。我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~


引言
在Stata中有许多数据整理的利器,其中,post命令可谓是不得不提的“法宝”之一。在数据的存储和读入等方面,尤其是在执行蒙特卡罗类型实验时,post命令都发挥着不可小觑的威力,接下来,让我们一起看看这句命令具体有哪些神奇的作用吧!

一、语法介绍

1、postfile命令

通过help post,我们就能很轻松地get到post的语法,整个post的过程,相当于将文件“邮寄”到一个特定的收件地址,并实现输入邮件名和收件地址再次调用文件。在官方的介绍文档中,一共有如下五种命令:

postfile postname newvarlist using filename [, every(#) replace] #
命令拆解:

postname:收件地址,即内存中划出的区域的名字。


filename:邮件名,即表示保存的数据的名字。

newvarlists:邮件的具体信息,即数据中包含的变量名列表。

简单来说,postfile就是进行了一个声明,表示在postname内存区域中,生成一个filename数据文件,该数据包含的变量是newvarlists。

2、post命令

填写好了寄件信息,接下来开始传递文件。post命令起到的作用就是向先前postfile中声明的数据集追加新的观察值。具体语法规则如下:
post postname (exp) (exp) ... (exp)命令拆解:postname:收件地址,即内存中划出的区域的名字。filename:邮件名,即表示保存的数据的名字。newvarlists:邮件的具体信息,即数据中包含的变量名列表。简单来说,postfile就是进行了一个声明,表示在postname内存区域中,生成一个filename数据文件,该数据包含的变量是newvarlists。
命令拆解:

postname:收件地址,即需要将文件保存至哪个区域。


(exp) (exp) ... (exp):追加的数据内容,与postfile中的

3、postclose命令

当寄件过程结束,需要使用postclose命令关闭邮件系统,具体语法如下:
postclose postname

该命令的含义为:结束向postname的内存区域追加数据,将所有post的数据写入Stata内存中,可以使用use命令打开。

4、postutil dirpostutil clear命令

如果你是邮局的工作人员,要怎样才能查找到现在存放有哪些地区的邮件呢?这时postutil dir命令就派上用场了。输入postutil dir,我们就可以调取出所有当前打开的postfile中规定的“收件地址”,即在postfile命令中划出的名为postname的内存区域。此外,我们需要输入postutil clear将所有打开的postfile关闭。

综合上述介绍,我们可以将post的工作方式归纳为:首先使用postfile命令打开一个postfile,然后发出一个或多个post命令,最后使用postclose关闭文件。此外可以使用postutil dirpostutil clear命令来查看或关闭所有打开的postfile。纸上得来终觉浅,接下来,就让我们用具体的例子来展示这一过程吧。

二、案例实操——逐条存储回归中产生的统计量
很多时候,我们不能一次性生成所有的数据,而是需要在某个特定的循环中一条一条的去采集数据,然后再利用采集到的数据进行后面的数据分析。在这个过程中,我们可以使用mat命令,将采集到的中间数据存储到矩阵中,但是这种方法仅适用于数据量小于10000的情况,当处理大体量数据时,使用post命令才是正解。我们以伍德里奇计量经济学导论教材中的数据SMOKE.dta进行演示。(Note:相关数据集大家可以通过在公众号后台回复 SMOKE 获取哦)

1. 确定回归变量,定义统计量

我们的目标是利用SMOKE.dta中的数据估计日香烟消费量的需求函数,并收集多次随机抽样中回归的系数和对应的标准误。首先需要确定抽样次数和参与回归的变量。

cd "D:/"use SMOKE.dta, clearlocal reps = 10000 //设置抽样次数为10000次set seed 1234 //设定种子数,以便结果可以复现local varlist "cigs lincome lcigpric educ age agesq restaurn" //定义一个局部暂元,存储需要回归的变量gettoken y x: varlist //gettoken的作用是将暂元varlist的内容按照我们的要求以空格为切割点,分成两部分,第一空格之前的部分存入暂元y,剩余部分存入暂元xlocal word_num: word count `x' //对暂元x中的元素进行计数tokenize "`x'" //分解暂元x,并将结果分别存入暂元`1',`2',...

我们可以用display命令分别展示存储变量的暂元x,y和用于对自变量计数的暂元word_num。

可以看到,我们已经切分好了自变量和因变量,并存储在了对应的local中。

接下来,我们需要新建局部暂元,存储每次回归中新产生的各自变量的回归系数b和标准误_se。

local j = 1local st1 ""local st2 ""while "``j''" != "" { local st1 "`st1'b_``j'' se_``j'' " local st2 "`st2'(_b[``j'']) (_se[``j++'']) "}
其中,j的值就是在上一步tokenize分解自变量后,每一个自变量对应的编号,如变量lincome对应的j值为1,以此类推。st1是需要在postfile命令中加入的变量名,st2存储的是实际回归中产生的回归系数(b)和标准误(se)的值。我们实际要做的就是将st2中的数据一条条加到st1中。

2. 使用post系列命令“邮递”数据

做好了前期准备,接下来就只需要开始传递数据啦。我们的逻辑是:

(1)使用postfile命令进行一个声明:在我们命名为smokepost的内存区域中,要生成一个temp数据文件,该数据包含的变量是st1,也就是回归系数和标准误。
(2)使用post命令,结合forvalues和“起死回生”命令,将每一次抽样回归产生的回归系数和标准误,即st2中的数据,逐条追加到smokepost的内存区域中。
(3)使用postclose,停止追加数据。
代码如下:
capture postclose smokeposttempfile temp //定义一个临时文件postfile smokepost `st1' using "`temp'", replace //(1)forvalues i = 1/`reps'{ preserve bsample //自抽样 qui reg `varlist' //回归,不报告结果 post smokepost `st2' //(2) restore}postclose smokepost //(3)
最后,我们可以打开temp文件,查看邮件是否顺利送到了。
use "`temp'", clearsum

可以看到,回归模型中共有6个自变量,对每一个自变量,我们都保存了对应的10000次抽样回归中产生的回归系数和标准误,邮件成功送达!
以上就是关于post在多次重复存储数据中的妙用,除此之外,post还有更多的实践场景,感兴趣的读者可以自行探索,欢迎在后台交流!


END

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。




腾讯课堂课程二维码








            


 对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!











往期推文推荐       Seminar丨2002年萨班斯·奥克斯利法案的经济后果

        我几乎画出了“隔壁三哥”家的国旗

        Python基础——三大数字类型,你都了解吗?
        如何用Stata绘制带指向性箭头标注的图像       
        Seminar丨荐仆贷款——19世纪中国的信任辅助贷款       
       【技能篇】多进程队列间通信

        Seminar丨公司董事会的人才增长:来自中国的证据

        正则表达式--懒惰模式

        爬完独立董事的年薪,我的眼镜跌破了!        识别旅游“照骗”——看风景名胜是否名副其实        主成分分析的Python实现

正则表达式--贪婪模式

Seminar丨谁更重要:高管股权薪酬与财务报告欺诈DOS能量,超乎你想象!

爬虫实战丨走进哈利波特的魔法世界

数据集合并的新路子-frlink命令

Seminar丨附近的公司:利用卫星图像研究本地信息优势

线性同余法生成伪随机数 

[技能篇]多线程爬虫

“好哭”是衡量一部好电影的标准吗?

Stata&Python云端课程来啦!

带你了解Stata中的矩阵

Seminar|总统的朋友:政治关联与企业价值
爬虫实战 | 爬取中国天气网

爬虫实战 | 爬取东方财富网经济数据——以居民消费价格指数(CPI)为例

Seminar|媒体关联董事对融资和外部治理的影响神奇的组内交叉合并 PDF分章节转TXT并实现可视化——以胡景北知青日记1971至1978年为例

万物皆可开——shellout妙用

无处不在的系列配置项|从零开始的Pyecharts(三)

使用Python制作自动聊天机器人  

fillin一下,平衡回来~

order命令——快速改变变量顺序的利器 

关于我们 


   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存