主要内容随机数的生成蒙特卡罗模拟重复抽样自助法实验15-1:随机数的生成实验基本原理服从在(0,1)区间上均匀分布的随机变量的样本值,被称为“均匀分布随机数”,简称“随机数”(randomnumber)。有了均匀分布的随机数后,就几乎可以产生任何分布的随机数了。然而,由电脑产生的所谓“随机数”只是“伪随机数”(pseudorandomnumber),因为它仍然由递推公式产生。尽管如此,这些“伪随机数”都能通过独立性与均匀分布的统计检验,故可以作为“随机数”来使用。“随机数”初始值被称为“种子”(seed)。为了使随机样本具有可重复性,保证以后抽样或别人抽样也能得到完全一样的样本,在生成随机数时通常需要设定“种子”。如果不给定“种子”,则Stata按照“电脑内置钟表”(computerclock)来自动选择“种子”,这样每次抽样的样本就会不同,模拟的结果也就不能完全复制。实验内容及数据来源本实验中,我们会介绍如何生成均匀分布和正态分布的随机数,以及如何设定随机数的种子。讲解这些内容不需要使用具体的数据文件,一些简单的命令就可以实现。实验操作指导1随机数的生成最基本而常用的随机数序列是均匀分布随机数序列。生成均匀分布随机数序列的基本命令为:generatenewvar=runiform()其中,generate为生成新变量的基本命令,newvar为新变量的名称,runiform()是生成均匀分布于区间[0,1)随机数的函数。需要注意的是,runiform()中没有参数,但括号却必不可少。如果要生成位于其他区间的均匀分布,我们可以进行简单的变形。例如,要生成均匀分布于区间[a,b)的随机数,相应的函数为:a+(b-a)*runiform()要生成均匀分布于区间[a,b]的随机数,相应的函数为:a+int((b-a+1)*runiform())其中,函数int()表示取整。生成标准正态分布的随机数的函数为:invnorm(uniform())生成均值为m、标准差为s的正态分布的随机数的函数则是:m+s*invnorm(runiform())例如,我们要生成一个均值为3、方差为5且服从正态分布的序列,可输入命令:setobs80gennorm=3+5*invnorm(uniform())这里,第一步为设定观测值的个数为80;第二步我们生成一个均值为3、方差为5且服从正态分布的序列,并将新生成的变量命名为norm。需要说明的一点是,如果不设定观测值个数,则新变量的观测值个数会与原序列的观测值个数相同;而未打开任何数据文件时,原观测值个数显然为0。下面,我们看一下变量norm的描述统计量。输入命令:sumnorm如果我们要作图看一下norm的分布,可输入命令:histnorm,normal这里,hist表示做直方图,选项normal表示画出相应的正态分布。2种子的设定设定种子的基本命令为:setseed{#|code}其中,setseed是设定种子的基本命令。#是正整数,代表runiform()迭代的初始值,Stata的初始设置是123456789。code是字符串,代表随机数生成器runiform()的状态,我们可以用“c(seed)”来查看其当前值。例如,我们输入命令:dispc(seed)这里,disp表示“显示”,c(seed)表示种子的当前值。例如,我们先设定种子,然后生成随机数序列,可输入如下命令:setseed1001setobs60genr=runiform()这里,第一步设定种子为1001,第二步设定观测值个数为60,第三步生成位于[0,1)随机数序列,并将其命名为r。实验15-2:蒙特卡罗模拟实验基本原理通过计算机模拟从已知分布的总体中抽取大量随机样本的计算方法被统称为“蒙特卡罗方法”(MonteCarloMethods)。在计量经济学中,常使用蒙特卡罗法来确定统计量的小样本性质。我们知道,许多统计量的精确分布没有解析解。一种解决方法是使用大样本理论,用渐近分布来近似真实分布。然而,现实中的样本容量常常较小。实验内容及数据来源本实验中,我们会介绍蒙特卡洛模拟的基本操作,以及如何编写程序并通过模拟获得真实的显著性水平。这里,我们不需要使用具体的数据文件,通过命令就可以实现相应的模拟。实验操作指导1蒙特卡罗模拟的基本操作2用蒙特卡罗模拟获得真实显著性水平为此,先使用命令program定义一个叫“reschi2”程序进行一次抽样与检验,然后用命令simulate来重复此程序1,000次。程序的命令为:programreschi2,rclass(定义一个叫reschi2的程序。rclass表示结果以r()形式储存)version10(设定所用程序版本为Stata10)drop_all(删去内存中已有数据)setobs50(确定随机抽样的样本容量为50)gendoublex=rchi2(1)(生成服从分布的解释变量x)geny=3+2*x+rchi2(1)-3(生成被解释变量)regyx(线性回归)returnscalart2=(_b[x]-2)/_se[x](计算t统计量的值,并将其命名为t2。这里,_b[x]代表x的系数,_se[x]代表系数的标准差,scalar表明t2是一个标量(数值))returnscalarr2=abs(return(t2))invttail(48,0.025)(是否拒绝原假设)end(程序结束)其中,命令的倒数第二行的invttail(48,0.025)表示自由度为48(样本容量50-参数个数2)、显著性水平为5%的双边检验的t统计量的临界值。return(t2)代表我们前面模拟计算并保存的样本t统计量的值t2。如果t2的绝对值大于invttail(48,0.025),则应拒绝原假设;这时,r2的返回值为1。此外,由于程序的首行定义结果的形式为rclass,所以,如果我们要引用计算的r2的值,其形式应该是“r(r2)”。对于上面的程序语句,我们可以将其写入一个“Do-FileEditor”,将程序保存为扩展名为“ado”的文件,并存放在Stata安装目录的ado文件夹下。这样,我们后面就可以直接使用该程序了。下面,我们进行1000次模拟,输入命令:simulatereject=r(r2),reps(1000)nodotsseed(101):reschi2这里,每次模拟的命令来自于程序“reschi2”,选项reps(1000)表明模拟次数为1000次,选项seed(101)表明设定种子为101,选项nodots表示不显示模拟过程的点。表达式“reject=r(r2)”表明我们将每次模拟的返回值r(r2)保存在reject中。因为我们在程序“reschi2”中,每次拒绝原假设时r2的返回值为1;这样,返回值为1的比例即为拒绝原假设的比例。也就是说,序列reject的均值反映了真实的显著性水平。为了获得reject的均值,我们输入命令:meanreject事实上,我们在模拟之前,可以先运行一次我们所编的程序,检查一下程序是否有问题。对于我们这个程序,可输入如下命令:setseed2010reschi2其中,第一步设定种子为2010,第二步为运行程序。要知道这一次模拟是否拒绝原假设,我们可以输入命令:dispr(r2)另一种返回程序结果的命令语句为:returnlist实验15-3:重复抽样实验基本原理实验内容及数据来源本书附带光盘data文件夹下的“gender.dta”工作文件,是我们为了讲解重复抽样而编制的文件。该文件包括5810个观测值,只有一个变量gender,表示性别。其取值为1时表示女性(female),取值为0时表示男性(male)。该文件中,女性观测值个数为3418,男性观测值个数为2392。此外,本实验中,我们还会利用本书附带光盘data文件夹下的数据文件“resample.dta”来介绍重复抽样部分选项的应用。该文件也是人为构造的,主要变量包括:group=分组变量(取值为A、B、C、D、E),strid=分层变量(取值为1或2,表明被调查者属于哪种类型),x=观测值。利用这些数据,我们来讲解重复抽样的基本命令和相关选项的应用。实验操作指导1重复抽样的基本命令此外,默认情况下,命令bsample会将内存中的数据替换为抽样的观测值,但设定选项weight()会将抽取的样本频数存放在变量varname中,也就是说,这时只有varname的值改变,原数据不会改变。但选项weight()和选项idcluster()不能同时设定。另外,在bsample命令之后,选项weight(varname)中的varname可以用在Stata的其他命令中作为fweight(如果该命令允许设定fweight)。下面,我们结合“gender.dta”和“resample.dta”数据,对各选项做进一步的说明。2简单随机抽样对于“gender.dta”的数据,假设我们要采用简单随机抽样法抽取300个样本,可输入命令:bsample300下面,我们来看一下数据文件现在的样本容量。输入命令:count如果要只对男性进行简单随机抽样,我们可以利用条件语句。输入命令:bsample200ifgender==0这里,我们对gender取值为0(表示male)的观测值抽取了200个随机样本。需要注意的是,条件语句中,gender后为两个等号。另外,需要说明的一点是,读者若要复制这个操作,则需要在前面简单随机抽样后重新打开一次数据;否则,这里的分层抽样就会在原来抽样结果的基础上进行。后面的操作也同理。下面,我们看一下抽取的样本的情况。输入命令:tabgender这里,命令tab表示显示变量gender的频数分布表。3分层抽样如果我们要令样本中包括100个女性和100个男性,可以采取分层抽样。输入命令:bsample100,strata(gender)这里,100表示每一层的样本容量都是100,选项strata(gender)表示按变量gender的不同取值来分层。下面,我们看一下分层抽样的样本情况。输入命令:tabgender此外,注意到原来的数据中约3000个为女性,2000个为男性。这样,我们考虑按照原数据的男女比例进行抽样;也就是说,抽取300个女性,200个男性。要做到这一点,要先生成一个新变量,令gender为female时新变量的值为300,gender为male时新变量的值为200。输入命令:genst=cond(gender,300,200)这里,我们将新变量命名为st。对于条件函数cond(x,a,b),其含义为:如果x为真(或取值不是0),则返回a的值;如果x为假(或取值为0),则返回b的值。对于本例,如果变量“gender”的值为female(1),则令变量st的值为300;如果变量“gender”的值为male(0),则令变量st的值为200。下面,我们就可以利用变量st作为“exp”来进行分层抽样。输入命令:bsamplest,strata(gender)这句命令的含义为,按变量gender的值进行分层抽样,且变量gender各个取值对应的样本容量为st的值。也就是说,对于gender取值为female的观测值,对应的抽样样本容量为300;对于gender取值为male的观测值,对应的抽样样本容量为200。下面,我们看一下样本的情况。输入命令:tabgender4扩展样本容量首先要说明的一点是,如果不设定要抽取的样本容量,则样本容量会与原数据相同。而如果同时又设定了选项strata(),则各层中抽取的样本个数会与原数据相同。此外,如果要抽取的样本容量超过现有的观测值个数,我们可以先对样本容量进行扩展。输入命令:expand2则我们将样本容量扩展为原