stata基本操作

  • Post author:
  • Post category:其他

目录

1. 更改工作路径和使用数据

2. 创建dummy变量(循环)

        【情况1】basic

        【情况1拓展】

        【情况2】交叉情况

3. 局部变量/全局变量 [local/global]

        (1)定义

        (2)Example 1:local

        (3)Example 2:global

        (4)优势


1. 更改工作路径和使用数据

假设你的数据集(Example.dta)在路径“D:\…\”下面,你想要将输出结果放在”D:\…\outcome”下,那就用【cd】命令更改工作路径,用【use】命令导入数据。

cd "D:\...\outcome\"
use "D:\...\Example.dta"

2. 创建dummy变量(循环)

stata更直接的方式是用xi命令

 【情况1】basic

假设现在有三个组,分别是1,2,3。这种属于分类变量,如果要加入回归,应该把分类变量转换成虚拟变量。

name_id group D_1 D_2 D_3
1 1 1 0 0
2 2 0 1 0
3 2 1 0 0
4 3 0 0 1

举个例子,橙色区域是原始数据,绿色区域是处理后的数据。第一列name_id代表姓名编号,是唯一标识符;group表示对应组别。对于name_id=1的对象来说,组别为1,所以应该有D_1=1,其他虚拟变量D_2和D_3取值为0。

那么在stata里面要如何处理呢,这里提供一个循环的思路。

forvalues i = 1/3{  # 对于在[1,3]区间的i来说
	gen D_`i' =1 if group== `i'  # gen表示生成新变量,`i'表示变量i。举个例子,当i=1的时候,如果该对象组别为1,那么D_1变量取值为1
	replace D_`i' = 0 if group!= `i'  #光有if还不够,不满足上面group==i的条件的数据会显示为空,所以要用replace把空数据替换成0
}   #这个花括号必须另起一行,因为stata是换行敏感的,如果和上面一行,stata无法识别

【情况1拓展】

说个题外话,假如我们的组别是ABC而不是123的话,这个循环还能写吗?当然可以,你可以选择在excel把A替换成1,也可以在stata里面对数据进行预处理,比如 gen group_new = 1 if group == A 然后replace group_new = 2 if group ==B

【情况2】交叉情况

name_id group treatment
1 1 0
2 3 1
3 2 1
4 1 0

假设group = 1代表控制组,group = 2代表接受药物A的实验组,group = 3代表接受药物B的实验组,现在我想要创建一个新变量treatment来区分控制组和实验组。很明显,控制组就是group=1的,实验组就是group=2或group=3的群体。

gen treatment = 1 if group == 2 | group == 3   //[|]表示或
replace treatment = 0 if group != 2 & group != 3  // yes or yes 的反面是 no and no
//当然这个例子里第二行更简洁的写法是:replace treatment = 0 if group == 1

3. 局部变量/全局变量 [local/global]

(1)定义

local是针对一次命令的,global定义的变量是在运行期间一直存在的。

举个例子方便理解。比如一个班里有很多不同的名字(变量),你懒得记了,所以给他们贴了一个临时座位号(local/global),这样在你希望点名回答问题(调用)的时候,你可以直接念座位号。如果你的座位号是仅限于这个学期的,那就是local局部变量;如果你的座位号是贯穿他们整个大学生涯的学号,那就是global全局变量。

当然,除了给每个人(变量)定义之外,你也可以给一部分人进行分组(变量列表)定义。

下面我们来看一下对应代码。

(2)Example 1:local

背景:假设你现在有三个因变量,var_1,var_2,var_3;三个自变量x1,x2,x3。你需要分别用三个因变量对三个自变量进行回归。

// Example 1: 定义临时列表(local)
// 要注意下面的代码要一起运行,因为local定义的变量只在单次运行中有效
local var_name "var_1 var_2 var_3"  # 定义临时列表var_name存放var_1,var_2,var_3三个变量

foreach v of local var_name {   #对于每个在loca var_name里的变量v
    reg `v' x1 x2 x3   # 把v变量对x1-x3进行回归
    outreg2 using "Example_1a", excel, dec (3) //回归结果储存在名为"outcom_file"的excel里面(Example_1a会自己生成在工作路径下),保留至小数点后三位
}


/// Example 1的等效写法b(不用局部变量+循环)
foreach v of varlist var_1 var_2 var_3 {   #对于每个在loca var_name里的变量v
    reg `v' x1 x2 x3   # 把v变量对x1-x3进行回归
    outreg2 using "Example_1b", excel, dec (3) //回归结果储存在名为"outcom_file"的excel里面(Example_1会自己生成在工作路径下),保留至小数点后三位
}



/// Example 1的等效写法c(不用局部变量+不用循环)
reg var_1 x1 x2 x3   # 把var_1变量对x1-x3进行回归
outreg2 using "Example_1c", excel, dec (3)
reg var_2 x1 x2 x3   
outreg2 using "Example_1c", excel, dec (3)
reg var_3 x1 x2 x3   
outreg2 using "Example_1c", excel, dec (3)

(3)Example 2:global

背景:你需要进行回归,同时回归要加入个体固定效应(数据集里有5个城市,所以是加入5-1=4个虚拟变量;假如全部加入会造成完美多重共线性),所以需要把城市的虚拟变量city_1,city_2,city_3,city_4作为控制变量加入回归。最终结果不需要放控制变量的系数(这里解释一下,因为计量只关心核心变量(variable of interest)对因变量的影响,加入控制变量只是为了不让遗漏变量影响核心变量系数的无偏性)。变量设置见下:

三个因变量:y1,y2,y3

三个核心变量:treatment, eligibility, eligible_treat

控制变量:age,male,occupation;city_1,city_2,city_3,city_4

// Example 2: 定义全局变量
order treatment eligibility eligible_treat #排个序,方便后面用$x1-$x3表示变量,这个我会在这个代码块下面详细讲一下
global x1 treatment  //给treatment定义新变量名x1,后面要调用就【$x1】
global x2 eligibility 
global x3 eligible_treat
global xc_dummy city_1 - city_4  //把city_1, city_2,...,city_4 四个dummy变量放在一起,定义新变量集,名称为xc_dummy,后面调用【$xc_dummy】的时候实际上调用了4个dummy变量
global xc_base age male occupation


local var_f "y1 y2 y3"   #把要分别回归的y1-y3放入var_f里面
foreach v of local var_f{
	reg `v' $x1-$x3 $xc_dummy $xc_base  
	outreg2 using "Example_2a", keep($x1-$x3) excel dec(3)  #keep($x1-$x3)表示只输出$x1,$x2,$x3的系数,control variables会放进回归里,但结果不会被写出来。
}


// Example 2等效写法(无全局变量+循环)
local var_f "y1 y2 y3"   #把要分别回归的y1-y3放入var_f里面
foreach v of local var_f{
	reg `v' treatment eligibility eligible_treat city_1-city_4 age male occupation 
	outreg2 using "Example_2b", keep(treatment eligibility eligible_treat) excel dec(3) 
}

如果你想用【$x1-$x3】来替代【$x1 $x2 $x3】,那就一定要注意顺序问题。因为【$x1-$x3】实际指的是变量列表中从treatment开始到eligible_treat的所有变量。

也就是说,假如你的变量列表是“treatment eligible_treat”,那么【$x1-$x3】代替的就是“treatment eligible_treat”;假如你的变量列表是“treatment eligibility city_1 eligible_treat” 那么【$x1-$x3】代替的就是“treatment eligibility city_1 eligible_treat”

(4)优势

跑回归的时候定义一个全局变量的好处是什么呢?

① 代码简洁。对比Example2的两种写法,很明显能看到定义了全局变量之后代码更简洁,尤其是如果你的回归有很多变量的时候。同时如果要跑多个无法用循环写的回归的时候,即变量复用性较高的时候,使用全局变量无疑会减少很多工作量。

② 方便修改。假如你发现结果不理想,希望通过更改核心变量(比如取个对数)或者增删控制变量的时候,你只要修改global相应的语句就好了,不需要挨个修改下面的回归语句。


版权声明:本文为Lattewow原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。