2008年4月13日星期日

我常用到的stata命令之三

(续)
在生成新数据库的过程中,往往需要用原始变量派生出新的变量。生成新变量的命令有gen,egen和replace。它们的基本语法是

gen (或replace)(变量名)=(表达式)

二者的不同之处是gen生成新变量,replace重新定义旧变量。

虚拟变量是取值为0或1的变量,用来标记样本中主体的某种性质。虚拟变量在实证分析中广泛使用,所以略述如何生成的新的虚拟变量。有两种基本的方法。一种较简明,

gen(变量名)=((限制条件))

这里“限制条件”最外面的小括号是语法要求的,里面的小括号表示括号中间的内容是解释性的。如果某个观察满足限制条件,那么这个虚拟变量在该处取值为1,否则为0。另一种是

gen (变量名)=1 if (取值为1限制条件)
replace(相同的变量名)=0 if (取值为0的限制条件)

二者有一个小小的区别。如果限制条件的表达式里面没有任何缺失值,那么两种方法的结果一样。如果有缺失值,第一种方法会把是缺失值的观察的虚拟变量都定义为0。而第二种方法可以将虚拟变量的取值分为三种,一是等于1,二是等于0,三是等于缺失值。避免了把本来信息不明的观察错误地放到回归中去。

需要生成的虚拟变量不多时,依次定义新变量即可,如果需要生成大量类似的虚拟变量,基本方法就很费时费力。比如,希望在一个包含大量社区的数据中生成社区虚拟变量时,社区的数目可能有成百上千个,太费事了。如果每个社区有一个编码标记,就可以入下命令批量生成相应的虚拟变量。

ta (变量名), gen((变量名))

第一个括号里的变量名是已知变量,即上面例子中的社区编码。后一个括号里的变量名是新生成的虚拟变量的共同前缀,后面跟数字表示不同的虚拟变量。如果我在这里填入d,那么,上述命令就会新生成d1,d2,等等,直到所有社区都有一个虚拟变量。

补充一句。在回归中控制这么多社区变量,如果一个一个地输入变量名会很累。可以用省略符号简化,d*表示所有d字母开头的变量;或者是用破折号,d1-d150表示第一个到第150个社区虚拟变量。

还有一种方法可以在回归中直接控制虚拟变量,而不必真的生成这些虚拟变量。如下。

areg (被解释变量) (解释变量), absorb(变量名)

absorb选项后面的变量名和前面讲的命令中第一个变量名相同,即上面例子中的社区编码。回归的结果和在reg中直接加入相应的虚拟变量相同。
(待续)

没有评论: