春劫来袭,大家是不是都躲在家里等待躲避****(种种通配符)?
学怪同学今天带来了一个小品文,讲解关于stata循环的知识。本着从简的原则,今天尽可能地多介绍一些内容。
1.常用循环的逻辑
常用的循环(当然不止stata一家的统计语言),其实是“流程--过程”的一种体现,在这个过程中,程序的运行和演算会遵从几个逻辑,或者可以说是特征:
(1)if语句,体现为条件:在哪里运行,在哪里终止;在哪里运行A部分,在哪里运行B部分....不一而足。
(2)变量标签的规律性,比如,在某量表中,对同一个维度,如“认知能力”采用了十个维度的衡量指标,那么,这是个问题的变量标签,在数据中通常都会体现为:(例)cog1_1, cog1_2, ...... cog1_10。这十个变量就构成未来进一步分析的基础。
(3)变量值的规律性。仍然以上面的“认知能力”作为衡量指标。每个问题的提问方式都是比较接近的,比如,“你的记忆力如何?”这个问题,以及相关其他维度的问题。接下来,我们针对每个问题给出五个答案:很差,较差,一般,较好,很好。分别赋值为0,1,2,3,4。那么,这十个问题对应的答案值域,就可以构成一个10X5的矩阵,然后再从其中选择具体值即可。
2.常用循环
(1)foreach命令
一般格式是:
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。
(2)Forvalue语句
其实,在之前几次课,我们已经隐隐约约的讲到了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来想一想,哪里可以用到?一定要敢想才可以~~
在这里,我举两个例子,非常实用的例子。
(1)forval运行回归模型
我们仍然使用auto.dta数据来做例子。
在这里,我们先利用price做因变量,之后生成三个price的次方,price^`i',并取对数。这样,相当于`i'*ln(price),即price对数的1至3倍。好了,介绍完毕,上程序:
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格式),出来之后基本不用特别多的修改,就可以直接作为学术文章中的表格,非常实用,强烈推荐。
(2)forval循环制作复合图形
由于前面很详细的介绍了一些制图的技巧。所以在这里,我简单介绍一下循环作图的方法。其实万变不离其宗,一个是循环,一个是作图,两个命令结构结合在一起,就可以做出循环的图形。
在这里,我们首先明确作图的意图:我们要做一个什么样的图形?
假设,我们使用auto.dta的数据(sysuse auto,clear),根据不同价格档次,来确定长度和重量之间的散点图。要求:根据价格等级,分成五等,我们看不同等级与总体之间的散点分布区别,如何去操作?
上命令(注意其中的断行):
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.合并
结果展示:
最后,可以把几张图合并来看:
转自:“量化研究方法”微信公众号
如有侵权,请联系本站删除!