【stata】变量处理、虚拟变量生成和样本分组的常见操作

0. 变量导入

此处以美国1988年妇女工资(官方数据)为例进行演示,数据导入代码为:

* - 数据清除 -
clear all					// 清除所有
cls							// 清除屏幕

* - 数据导入 -
sysuse nlsw88.dta, clear		//导入美国1988年妇女工资数据

1. 变量生成

可以采用generate生成新的变量,并可以和if等条件语句自由组合。

  1. gen 新变量 = 生成方式 if 条件
generate L_wage = log(wage) if married == 1 	// 数据的对数处理【常用】
label var L_wage "log hourly wage"				// 注意引号
  1. 常见的取整方式:四舍五入取整(round)、向上取整(ceil)、向下取整(floor
generate round_wage = round(wage)				// 四舍五入取整
note: "ceil 向上取整;floor 向下取整"
gsort idcode, gen(numb)							// 产生编号
list *wage if married == 1 in 1/10 				// *wage *任意长度的任意量
  1. 变量编号和群体数量统计

可以利用stata本身自带的_n_N变量,达到对群体进行标号,或是统计群体样本数的目的。

  • _n:即每个样本对应的编号
  • _N:即所选样本的总数
bysort married: gen married_id  = _n	// 分群体编号
bysort married: gen married_num = _N	// 统计每个群体的样本数

2. 变量改名

对已经存在的变量,可以采用rename命令对变量名进行修改。

  1. 变量重命名:rename 现有变量 新的名字
rename wage WAGE 	// 将变量wage命名为WAGE 
rename race RACE	// 将变量race命名为RACE

需要注意的是,这里的需要和标签名进行区别,新的名字不能加引号(""),不然会产生报错

  1. 变量批量改名: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实现

  1. 变量值替换:replace 变量名 = 新值 if 变量名 = 原始值
sum wage
replace wage = 10 if wage > 10	// 将大于10的值都替换为10
sum wage
  1. 虚拟变量生成:generatereplace混用
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对变量和样本进行删除。

  1. 删除样本:drop if 条件
drop if tenure == . 	// 删除tenure缺失的样本
  1. 删除变量:drop 变量名
drop tenure				// 删除tenure这个变量
cap drop L_wage Old		// 删除变量且没有变量不进行报错
// cap: 执行命令,并吞掉报错,后边会有妙用,有机会的话谈谈

5. 克隆拆分

可以使用clonevar对变量进行克隆,使用separate进行变量的拆分

  1. 变量克隆:clone 新变量 = 原始变量
clonevar married_c = married	// 复制值和标签
generate married_g = married 	// 复制值

克隆变量和直接生成新变量的区别在于,值标签会不会被复制,亲自运行一下即可知道

  1. 变量拆分:sparate 拆分变量, by(拆分标准)
separate wage, by(married)		// 把变量按married拆分

6. 虚拟变量生成

可以通过tabxi两种方式,构造离散变量所对应的虚拟变量。

  1. 总共生成n个虚拟变量:``tab 变量名, gen(虚拟变量名)`
  2. 总共生成n-1个虚拟变量:``xi i.变量名`
tab race, gen(dum_race)			// 生成n个种族虚拟变量
xi i.race						// 生成 n-1个 虚拟变量(避免完全共线)
xi i.race, prefix(pr_)			// 增加前缀(避免覆盖)

通常使用xi i.变量名的方式进行生成,一是比较简洁;二是可以避免完全共线的情况。

7. 样本分组

  1. 等分分组:先排序sort再分组group
sort wage 				// 变量排序【注意】
gen g_wage = group(5)	// 变量分组
tab g_wage
  1. 断点分组:利用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清单即可理解

  1. 按条件进行分组:使用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
  • 30
    点赞
  • 311
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值