投稿问答最小化  关闭

万维书刊APP下载

stata循环:巧用循环语句,力求事半功倍

2023/7/4 9:26:00  阅读:37 发布者:

春劫来袭,大家是不是都躲在家里等待躲避****(种种通配符)?

学怪同学今天带来了一个小品文,讲解关于stata循环的知识。本着从简的原则,今天尽可能地多介绍一些内容。

1.常用循环的逻辑

常用的循环(当然不止stata一家的统计语言),其实是“流程--过程”的一种体现,在这个过程中,程序的运行和演算会遵从几个逻辑,或者可以说是特征:

1if语句,体现为条件:在哪里运行,在哪里终止;在哪里运行A部分,在哪里运行B部分....不一而足。

2)变量标签的规律性,比如,在某量表中,对同一个维度,如“认知能力”采用了十个维度的衡量指标,那么,这是个问题的变量标签,在数据中通常都会体现为:(例)cog1_1, cog1_2, ...... cog1_10。这十个变量就构成未来进一步分析的基础。

3)变量值的规律性。仍然以上面的“认知能力”作为衡量指标。每个问题的提问方式都是比较接近的,比如,“你的记忆力如何?”这个问题,以及相关其他维度的问题。接下来,我们针对每个问题给出五个答案:很差,较差,一般,较好,很好。分别赋值为0,1,2,3,4。那么,这十个问题对应的答案值域,就可以构成一个10X5的矩阵,然后再从其中选择具体值即可。

2.常用循环

1foreach命令

一般格式是:

foreach x in varlist...{

rename `x '  abc_`x'

}

这段命令有几个特点:

第一,foreach命令需要前后两个大括号{}包裹起来;

第二,x在此为varlist--变量列表的暂元(local局部宏),所以在命令中,需要加上左右撇号。注意,左撇号是英文输入法下的“~键”,右撇号是英文输入法下的单引号键。这个非常关键。

第三,函数、命令的句柄在这里只要正常使用即可。

举例来说:

sysuse auto,clear

foreach x in make-mpg weight-turn{

sum `x'

}

解释一下:在这里,我想要做的是sum一下make price mpg weight length turn这六个变量的值,这六个变量构成了varlist。因为前三个相邻,后三个相邻,所以中间用省略号“-”连接。这样可以节省一些空间。

参考结果

给变量重命名,也遵从此法。在这里,我给各个变量加上前缀。

       

命令:

foreach x of varlist make-foreign{

rename `x' a_`x'

}

执行结果:

空间有限,关于foreach的命令就介绍到这里。下面,介绍一种更常用的方法:forvalue

2Forvalue语句

其实,在之前几次课,我们已经隐隐约约的讲到了forval的循环用法,在数据分析专题的第一讲(参考公众号上次推送的文章)就介绍了forval在处理相应结构的数据时候,如何用forval来处理重复结构的变量。为了节约大家时间,我简要回顾一下:

第一,生成若干个结构相近的变量,并用某些值来代替,

forval i=1/15{

gen x`i'=.

replace x`i'=_n

}

第二,根据不同层再进一步设置循环。

forval j=1/15{

gen f`j'=0

label var f`j' "有第`j'项设施的村子"

forval i=1/15{

replace f`j'=1 if ca3_s_`i'==`j' & ca3_s_`i' !=.

}

}

*

接下来,可以参考之前的介绍,来重复演练一下即可。

3.forvalue循环的更广泛用途

其实,话说回来,forval这个命令的用途当然不止这么局限,不光在生成变量、赋值这些地方可以运用,在其他地方同样可以用到。大家可以open mind来想一想,哪里可以用到?一定要敢想才可以~~

在这里,我举两个例子,非常实用的例子。

1forval运行回归模型

我们仍然使用auto.dta数据来做例子。

在这里,我们先利用price做因变量,之后生成三个price的次方,price^`i',并取对数。这样,相当于`i'*ln(price),即price对数的13倍。好了,介绍完毕,上程序:

sysuse auto,clear

forval i=1/3{

gen price_new_`i'=`i'*ln(price)

reg price_new_`i' mpg rep78 weight length

est store m`i'

}

*

请看结果:

m1的结果。

m2的结果

m3的结果

补充一点,我们可以用esttab命令更方便的比较这几个模型的系数:

其实呢,esttab还可以输出这个系数对应的表格(输出word-rtf格式),出来之后基本不用特别多的修改,就可以直接作为学术文章中的表格,非常实用,强烈推荐。

2forval循环制作复合图形

由于前面很详细的介绍了一些制图的技巧。所以在这里,我简单介绍一下循环作图的方法。其实万变不离其宗,一个是循环,一个是作图,两个命令结构结合在一起,就可以做出循环的图形。

在这里,我们首先明确作图的意图:我们要做一个什么样的图形?

假设,我们使用auto.dta的数据(sysuse autoclear),根据不同价格档次,来确定长度和重量之间的散点图。要求:根据价格等级,分成五等,我们看不同等级与总体之间的散点分布区别,如何去操作?

上命令(注意其中的断行):

sysuse auto,clear

xtile grade=price, nq(5)

set scheme s1color

forval i = 1/5 {

 scatter length weight if grade != `i', xsc(log) ysc(log) xla(1500 2000 3000 5000) ///

 yla(150 200 250 300) ms(oh) mc(blue*0.2) || scatter length weight if grade ///

 == `i', xsc(log) ysc(log) xla(1500 2000 3000 5000) yla(150 200 250 300) ///

 ms(O) mc(blue) yla(, ang(h)) subtitle("`: label (grade) `i''", place(w)) ///

 legend(off) name(g11_`i', replace)

 }

*

scatter length weight, xsc(log) ysc(log)  xla(1500 2000 3000 5000) yla(150 200 250 300) ///

ms(O) mc(blue) yla(, ang(h)) name(g11_6, replace) subtitle("all", place(w))   

graph combine g11_1 g11_2 g11_3 g11_4 g11_5 g11_6, saving(g11, asis replace) imargin(small)

主要的处理思路:

1.根据price设置等级;

2.每一个等级都画一张散点图,对比全图;

3.画一张全图;

4.合并

结果展示:

最后,可以把几张图合并来看:

转自:“量化研究方法”微信公众号

如有侵权,请联系本站删除!


  • 万维QQ投稿交流群    招募志愿者

    版权所有 Copyright@2009-2015豫ICP证合字09037080号

     纯自助论文投稿平台    E-mail:eshukan@163.com