0. 变量导入
此处以美国1988年妇女工资(官方数据)为例进行演示,数据导入代码为:
* - 数据清除 -
clear all // 清除所有
cls // 清除屏幕
* - 数据导入 -
sysuse nlsw88.dta, clear //导入美国1988年妇女工资数据
1. 变量生成
可以采用generate
生成新的变量,并可以和if
等条件语句自由组合。
gen 新变量 = 生成方式 if 条件
generate L_wage = log(wage) if married == 1 // 数据的对数处理【常用】
label var L_wage "log hourly wage" // 注意引号
- 常见的取整方式:四舍五入取整(
round
)、向上取整(ceil
)、向下取整(floor
)
generate round_wage = round(wage) // 四舍五入取整
note: "ceil 向上取整;floor 向下取整"
gsort idcode, gen(numb) // 产生编号
list *wage if married == 1 in 1/10 // *wage *任意长度的任意量
- 变量编号和群体数量统计
可以利用stata
本身自带的_n
和_N
变量,达到对群体进行标号,或是统计群体样本数的目的。
_n
:即每个样本对应的编号_N
:即所选样本的总数
bysort married: gen married_id = _n // 分群体编号
bysort married: gen married_num = _N // 统计每个群体的样本数
2. 变量改名
对已经存在的变量,可以采用rename
命令对变量名进行修改。
- 变量重命名:
rename 现有变量 新的名字
rename wage WAGE // 将变量wage命名为WAGE
rename race RACE // 将变量race命名为RACE
需要注意的是,这里的需要和标签名进行区别,新的名字不能加引号(""
),不然会产生报错
- 变量批量改名:
renvars 现有变量1 现有变量2 / 新的名字1 新的名字2
renvars WAGE RACE / wage race // 将变量名改回去
renvars wage race, postfix(_new) // 批量增加后缀
rename (wage_new race_new) (wage race) // 批量改名2:某些版本可用
需要说明的是renvars
为外部命令,需要进行安装,具体安装方式为
1. stata在命令窗口输入:search renvars
2. 点击第一个链接:dm88_1...
3. 点击install
3. 变量改值
有些时候我们还需要对变量的某些值进行修改,可以使用replace
实现
- 变量值替换:
replace 变量名 = 新值 if 变量名 = 原始值
sum wage
replace wage = 10 if wage > 10 // 将大于10的值都替换为10
sum wage
- 虚拟变量生成:
generate
和replace
混用
gen byte Old = 0 // 年龄是否大于40
replace Old = 1 if age > 40
// 如果大于替换为1 ['.'在stata里会被认为无穷大,被替换为1]
// replace Old = . if age = . // 替换缺省值
// 定义标签 -- 可见上一稿
label define label_Old 1 "是" 0 "否"
label values Old label_Old
4. 变量删除
可以使用dorp
对变量和样本进行删除。
- 删除样本:
drop if 条件
drop if tenure == . // 删除tenure缺失的样本
- 删除变量:
drop 变量名
drop tenure // 删除tenure这个变量
cap drop L_wage Old // 删除变量且没有变量不进行报错
// cap: 执行命令,并吞掉报错,后边会有妙用,有机会的话谈谈
5. 克隆拆分
可以使用clonevar
对变量进行克隆,使用separate
进行变量的拆分
- 变量克隆:
clone 新变量 = 原始变量
clonevar married_c = married // 复制值和标签
generate married_g = married // 复制值
克隆变量和直接生成新变量的区别在于,值标签会不会被复制,亲自运行一下即可知道
- 变量拆分:
sparate 拆分变量, by(拆分标准)
separate wage, by(married) // 把变量按married拆分
6. 虚拟变量生成
可以通过tab
和xi
两种方式,构造离散变量所对应的虚拟变量。
- 总共生成
n
个虚拟变量:``tab 变量名, gen(虚拟变量名)` - 总共生成
n-1
个虚拟变量:``xi i.变量名`
tab race, gen(dum_race) // 生成n个种族虚拟变量
xi i.race // 生成 n-1个 虚拟变量(避免完全共线)
xi i.race, prefix(pr_) // 增加前缀(避免覆盖)
通常使用
xi i.变量名
的方式进行生成,一是比较简洁;二是可以避免完全共线的情况。
7. 样本分组
- 等分分组:先排序
sort
再分组group
sort wage // 变量排序【注意】
gen g_wage = group(5) // 变量分组
tab g_wage
- 断点分组:利用
recode
进行分组或irecode
recode age (min/39 = 1) (39/42 = 2) (42/max = 3), gen(g_age_1) // 分组边界 顺序优先
gen g_age_2 = irecode(age, 39, 42) // 从0编号
gen g_age_3 = recode(age, 39, 42) // 边界编号
list age g_age* in 1/10
最常用的是第一种分组方式,如果觉得看备注不太好理解,将代码运行之后观察
list
清单即可理解
- 按条件进行分组:使用
cond
命令,缺陷在于只能构造0-1
类型的变量
gen dum1 = cond(hours>40, 1, 0, .) // 大于40为1,反之为0
list hours dum1
label list occlbl
gen dum_occu = inlist(occu, 1, 2, 7, 12) // 将occ = 1|2|7|12 定义为1
list occu dum_occu in 1/10