大家好!今天我来挖一个大大的坑:通过统计模拟学习Stata实用编程技巧。这个系列呢,我也不知道要开几讲,其实也没计划,随性写点吧。不过至少还会有第二讲。
这个第一讲呢,目的是讲讲如何通过循环和宏变量收集数据并制表。那么用来作为例子的呢,是来研究一下异方差性对于估计量效率的影响。
具体地说,就是要比较同一个模型的同一个参数估计值在同方差时和异方差时的分布上的区别。但是,我们希望观察这个区别是否受样本量大小的影响。
考虑两个模型:
Y1=bX+u, u是iid标准正态分布
Y2=bX+v, v是相互独立的正态分布,但是每个u_i的方差是x_i
我们要观察b的OLS估计值在不同样本量下的分布。样本量采用20, 50,100, 200, 和500。每个样本量做500次模拟。
这个模拟要求输出如下格式的表格(xxx表示数字):
我们如何用Stata编程实现呢?
首先,我们来用简单的语言描述一下这个程序需要干些什么
1. 按照上述要求生成数据
2. 跑上述两个模型
3. 储存每个模型b的估计值
4. 重复第1到第3步500次。
5. 重复第1到第4步5次,每次使用一个不同的样本量(20,50, 100, 200, 和500)。
好,那么为了实现上述功能,我们都有可能遇到什么问题呢?该用什么命令呢?
第一步:
生成数据的时候需要指定样本的大小。这个通过set obs 实现。生成变量使用generate命令。生成正态分布的随机变量使用rnormal()函数。
第二步:
跑回归模型使用regress命令。
第三步:
通过_b[x]来取得参数的估计值。使用local macro来保存这些值。注意:每一次模拟的值都需要保存,所以任何一次回归的结果都不能被之后的结果覆盖。也就是说,用于保存这些估计值的localmacro必须全部都有不同的名字。
第四步:
重复500次使用forvalues循环。
第五步:
重复5次,但是每次使用不同的样本量。这个需要使用foreach循环。
下面我们来看看写好的统计模拟的程序。
第2行使用set seed来初始化伪随机数生成器,这样可以保证结果可以被他人重现。
第3行和第4行把重复模拟的次数和样本量的选择保存在局部宏里,方便修改。
第5行执行的是上述第5步。
第6行注意不能使用clear all,不然会消除之前保存的所有结果。clear只消除数据。不消除其他保存的结果。
第7行设定样本量。
第8行注意:我们假定x的取值是给定的,非随机的。
第9行执行上述第4步,开始模拟。
第10到14行生成数据。注意,b的真实值为3。
第15和17行跑两个回归。注意,按照题目的要求,回归不包括常数项。
第16和18行保存参数的估计值。宏的名称包括两个变量,第一个表示样本量,第二个表示第几次模拟。这两个部分缺一不可。否则就无法保存每次回归的结果。原则是,有几次循环,保存结果的宏名字里就要有几个部分。这里有两个循环,一个foreach,一个forvalues,那么这里的宏名里就有两个变量。
下面我们来写保存和输出结果的程序。
这个部分是这一讲的关键所在,即,如何保存结果以便进一步处理或制表输出。
基本的思路是这样:
首先把所有要写进表里的数据保存在宏里。然后按照输出表格的格式建立一个数据集。接下来把保存的结果一个一个的写进表里。但是要注意的是我们需要保存所有的原始数据,而不是仅保留经过处理的数据。所以,最终的目标是保存一个数据集,让这个数据集可以通过table命令生成我们最终需要报告的表格。
我们这次的题目要求输出估计值的均值和标准差。而均值和标准差都是可以通过table命令计算的。这样我们就可以直接保存每次的估计值,而不用在保存之前就手动计算均值和标准差。
在上一步(程序的1到20行),我们已经将所有的估计值保存在宏里了。这里我们直接就可以建立新表。
第21行清除现有数据。注意,千万不要clear all。
第22到24行计算并设定我们需要的观测值数量。第22行通过数ssizes里的词数来确定我们有多少不同的样本量设定。对于每一个样本量设定,我们需要reps个观测值。这个乘积还需要乘以2,因为每次模拟我们有两个估计值需要保存(一个同方差的一个异方差的)。
第25到27行生成空变量。我们总共需要4个空变量。一个表示模型,一个表示样本量,一个表示模拟的次数,一个用来实际保存我们的估计值。
第28行生成一个计数宏。因为我们每次写入这个数据的一行,所以我们需要知道我们下一步应该写入第几行。这个计数宏从1开始,到_N结束。每写入一行数据就给这个计数宏加1(见第36行)。
第29到39行实际写入数据。注意32到35行使用的in条件。这就是我们需要一个计数宏的理由。
第40行使用table命令输出结果。注意这一行的开头是用了noi命令,保证输出的结果会显示在屏幕上。
输出的结果如下所示。在Stata的结果页面选择Copy as table,然后粘贴到Excel里,简单的整理一下就可以粘贴到Word里输出啦!
最后呢,输出结果的长相是这样的:
最后留一个思考题:这个结果到底应该如何解读呢?异方差性对估计值效率的影响如何随着样本量增加变化呢?