> 文章列表 > stata数据处理

stata数据处理

stata数据处理

stata数据处理–潘登同学的stata笔记

文章目录

    • stata数据处理--潘登同学的stata笔记
  • 数据导入、导出
    • 使表格第一行成为变量标注(label)
  • 数据合并
    • 横向与纵向合并
    • 一对多与多对一横向合并
  • 缺失值处理
    • 查看缺失值
    • 替换缺失值
    • 缺失值填充
  • 离群值处理
    • 取对数的方法
    • 截尾处理、缩尾处理
  • 分组统计
    • 列表统计
    • 分组回归
  • egen函数做数据处理
    • 其他egen函数
  • 文字日期变量的处理
    • 将季度数据调整为月度数据
  • 抽样
    • 不放回抽样
    • 有放回抽样

数据导入、导出

数据导入:

import excel auto.xls, firstrow sheet(Sheet1) clear 
br foreign
encode foreign, gen(Cartype2) label(foreign)
br Cartype2 
label list foreignsave myauto.dta, replace  //保存为 Stata 格式数据文件
  • firstrow 表示把 Excel 的第一行视为变量名称
  • sheet() 中填入 Excel 中的 sheet 名称
  • Excel2003 文件后缀为 .xls, Excel2007 文件后缀为 .xlsx

数据导出:

sysuse auto.dta, clear
export excel auto.xls, firstrow(variables) replace  //首行为变量名称
shellout auto.xls  // 打开 excel 文档 export excel auto.xlsx, firstrow(varlabels) replace  //首行为变量标签
shellout auto.xlsx  // 打开 excel 文档 
  • firstrow(varlabels):保存变量名称
  • nolabel:不保存变量名称

其他导入方式

help insheet  //导入 -tab- 分隔的数据help infile   //导入  逗号 分隔的数据 help usespss  //将 SPSS 格式的数据导入 STATAhelp fdasave  //Save and use datasets in FDA (SAS XPORT) formathelp usesas   //将 SAS 格式的数据导入 STATA 

使表格第一行成为变量标注(label)

有时在Excel整理数据时,会把第一行写为变量名,第二行写为变量标注(label)。在导入Stata中时,第一行可以自动转化为变量名,但第二行标注会在导入时成为第一个标量。

foreach var of varlist * {                                // 对每一个变量label     variable    `var'             "`=`var'[1]'"   // 把变量标注为第一行的内容replace               `var' = ""   if   _n == 1         // 把第一行改为空destring              `var'        ,    replace         // 把变量destring}
drop in 1                                                 // 删除第一行

数据合并

横向与纵向合并

merge 1:1 varlist using filename [, options]
  • varlist表示按照哪个变量来合并

横向合并:增加变量
在这里插入图片描述

// 查看待合并的数据
use merge_m.dta, clear
browse
use merge_u.dta, clear
br 
// 横向合并:增加变量
use merge_m.dta, clear        // master dataset
merge 1:1 date using merge_u  // using  dataset
des

在这里插入图片描述

纵向合并:追加样本
在这里插入图片描述

use append_m.dta, clear
br
use append_u.dta, clear
br// 纵向追加
use append_m.dta, clear
append using append_u.dta
des

在这里插入图片描述

一对多与多对一横向合并

多对一横向合并

merge m:1 varlist using filename [, options]
  • varlist表示按照哪个变量来合并
use GTA_FS.dta,clear    //上市公司财务资料, id-year, Panel
br 
use GTA_basic.dta,clear //上市公司基本资料,只有 id 没有 year
bruse GTA_FS.dta, clear
merge m:1 id using GTA_basic.dta
br

在这里插入图片描述

_merge 变量的含义:

  • _merge==1 obs. from master dataset
  • _merge==2 obs. from only using dataset
  • _merge==3 obs. from at least both datasets

一对多横向合并

merge 1:m varlist using filename [, options]

本质上跟上面的一样,只是master dataset不同

use GTA_basic.dta, clear
merge 1:m id using GTA_FS.dta, nogen
browse
order id year
xtset id year 

在这里插入图片描述

缺失值处理

查看缺失值

sysuse auto, clear
count if rep78==.

需要注意的是:

  • 有些命令,如 sum, regress, generate 等,会自动忽略缺漏值;
  • 有些命令,如 count, keep 等,则会将 “.” 视为一个无穷大的数值

使用回归的方式来标记不包含缺失值的样本(注意是样本层面,只要有一个变量缺失,整个样本就算缺失)

sysuse nlsw88.dta, clear
sum wage industry tenure hours
reg wage industry tenure hours  //回归不是我本意
ereturn list
//	e(sample) 如果一个样本中至少有一个变量有缺失值,则为0,变量齐全则为1
sum wage industry tenure hours if e(sample)==1gen yes = e(sample)
sort yes
browse yes wage industry tenure hourssum wage industry tenure hours if yes==1
keep if yes==1  // 删除缺漏值

在这里插入图片描述

替换缺失值

常见的缺漏值标记符号:N.A. | N/A | -99 | -97 | -9999

insheet using "D3_miss01.txt", clear
mvdecode x1 x2, mv(-97 -99 -999)    // 批量替换

在这里插入图片描述

// 数值型缺漏值
mvdecode x1 x2, mv(-97 -99 -999)    //批量替换
// 文字型缺漏值
replace x3 ="."  if x3== "N/A"
replace x3 ="."  if x3== "N.A."
destring x3, replace  // 转换为数值变量

在这里插入图片描述

缺失值填充

fillmissing语法

[bysort varlist]: fillmissing varname [if] [in], [with(with_options)]
  • with(any):最好用来填充常量变量 (constant variable),因为会任意从非缺失值中填充缺失值。如果未指定 with_options,则作为默认值;
  • with(previous):使用前面的值填充当前的缺失值。如果前面的值也缺失,则当前值保持缺失状态。另外,该选项并不对数据进行排序操作,因此无论当前数据的排序如何,填充都将使用当前的排序状态来标识当前缺失值和前面的观测值;
  • with(next):与 with(previous) 类似,使用后面的值填充当前的缺失值。如果后面的值也缺失,则当前值保持缺失状态。另外,该选项并不对数据进行排序操作,因此无论当前数据的排序如何,填充都将使用当前的排序状态来标识当前缺失值和后面的观测值;
  • with(first):使用当前排序状态下的第一个值替换所有的缺失值。或者搭配 bysort,将使用每个组的第一个值;
  • with(last):使用当前排序状态下的最后一个值替换所有的缺失值。或者搭配 bysort,将使用每个组的最后一个值;
  • with(mean):使用非缺失值的平均值替换缺失值。变量类型只能为数值型 (numeric variable);
  • with(median):使用非缺失值的中位数替换缺失值。变量类型只能为数值型 (numeric variable);
  • with(min):使用非缺失值的最小值替换缺失值。变量类型只能为数值型 (numeric variable);
  • with(max):使用非缺失值的最大值替换缺失值。变量类型只能为数值型 (numeric variable)。
clear all
input id kid   k1   31   51   .1   .1   72   .2   .2   42   82   .
endgen any = k
bys id: fillmissing any, with(any)
gen previous = k
bys id: fillmissing previous, with(previous)
gen next = k
bys id: fillmissing next, with(next)
gen first = k
bys id: fillmissing first, with(first)
gen last = k
bys id: fillmissing last, with(last)
gen mean_ = k
bys id: fillmissing mean_, with(mean_)
gen median_ = k
bys id: fillmissing median_, with(median_)
gen min = k
bys id: fillmissing min, with(min)
gen max = k
bys id: fillmissing max, with(max)
list,noobs

在这里插入图片描述

离群值处理

取对数的方法

sysuse nlsw88, clear
gen ln_wage = ln(wage)histogram wage
histogram ln_wagetwoway (histogram    wage, color(green))  ///(histogram ln_wage, color(yellow))

在这里插入图片描述

注意:对数转换后,系数估计值的含义会发生变化,解释结果时要慎重

截尾处理、缩尾处理

截尾处理:

// 以 1th 和 99th 百分位数值为临界点
sysuse nlsw88, clear
winsor2 wage, cuts(1 99) by(collgrad) suffix(_tr) trim 
sum wage*
des wage*

在这里插入图片描述

缩尾处理:

// *-基本原理
sysuse nlsw88, clear
sum wage, detailreplace wage=1.930993 if wage<1.930993 
replace wage=38.70926 if wage>38.70926// *-winsor2 命令
sysuse nlsw88, clear
winsor2 wage, cuts(1 99) // cuts(1 99) 选项可以省略; 会自动生成新变量 wage_w
sum wage*
des wage*// *-一次性处理多个变量
sysuse nlsw88, clear
winsor2 wage hours tenure, cuts(1 99) replace
des wage* hours* tenure*

在这里插入图片描述

分组统计

列表统计

一维列表:

sysuse nlsw88.dta, clear// *-频数列表
tabulate industry      // tabulate 可以简写为 tab
// *-柱状图
graph hbar (count) idcode, over(industry)         ///blabel(bar, position(outside) format(%3.0f) ///color(blue) size(small))

在这里插入图片描述

在这里插入图片描述

二维列表:

sysuse nlsw88.dta, cleartab industry collgrad  // 频数
tab industry collgrad, column nofreq //占比tabplot industry collgrad ,  ///bfcolor(none) horizontal barw(1)  ///percent(collgrad) subtitle(% at each industry) ///showval(offset(0.05))

在这里插入图片描述

在这里插入图片描述

变量的统计特征:

sysuse nlsw88.dta, clear// *-变量的统计特征
tab industry collgrad, summarize(wage) means// *-图形呈现
graph hbar (mean) wage, over(industry) over(collgrad) ///intensity(*0.4) scheme(s1mono)                  ///blabel(bar, position(outside) format(%3.1f)     ///size(small)) 

在这里插入图片描述

在这里插入图片描述

分组回归

先将连续变量转换为类别变量

sysuse nlsw88, clear
sort wage
gen g_wage = group(5)  //工资等分为五组
br wage g_wage
tab g_wage

在这里插入图片描述

做分组的描述性统计

label define g_wage_label 1 "Low" 5 "High"
label value  g_wage g_wage_label
tabstat wage age married union collgrad south, ///stat(mean) by(g_wage) format(%4.2f)

在这里插入图片描述

做分组回归

local x "age ttl_exp married union collgrad south c_city"
reg wage `x' if g_wage==1, robust
est store Low
reg wage `x' if g_wage==3, robust
est store Mid  
reg wage `x' if g_wage==5, robust
est store High
reg wage `x'             , robust
est store Fulllocal m "Low Mid High Full"
esttab `m', mtitle(`m') nogap s(r2 r2_a N) b(%6.3f) ///star(* 0.1 ** 0.05 *** 0.01) 

在这里插入图片描述

其他方法:根据分位数进行分组

// 在每个行业内部根据 33th, 66th 百分位分成三组
bysort industry: quantiles wage, gen(p_wage) nq(3) 
tab p_wage

在这里插入图片描述

egen函数做数据处理

egen函数是官方命令提供的函数,egenmore是Stata 用户提供的外部函数,文子处理的利器

sysuse "nlsw88.dta", clear// 行业中位数
bysort industry: egen wage_p50 = median(wage)
gen wage_diff = wage-wage_p50// 行业标准差	
bysort industry: egen wage_sd = sd(wage)// 重新编码
sort industry occupation
browse industry occupation
egen indocc123 = group(industry occupation) 

应用实例:计算几何加权实际汇率
ERR=∏i=1N(xiwi)ERR = \\prod_{i=1}^{N}(x_i^{w_i}) ERR=i=1N(xiwi)
其中xxx是汇率,www是权重

clear
input firm country   exch     export 1 		1 	    8 	  	  60 1 		2 	    0.03 	  50 1 		3 	   10 	  	  80 2 		2 	    0.03 	  68 2 		4 	    3 	  	  80 3 		2 	    0.03 	  200 3 		3 	   10 	  	  90 3 		4 	    3 	  	  250 3 		5 	    1.1 	  120
end

计算权重

bysort firm: egen weight = pc(export), prop
list, sepby(firm)

在这里插入图片描述

计算EER:思路是将连乘积的问题转化为求和问题,对数化

gen lnexch = ln(exch)
gen lnexch_x_weight = lnexch*weight
bysort firm: egen sum_exch = total(lnexch_x_weight)
gen EER = exp(sum_exch)
list, sepby(firm)

在这里插入图片描述

其他egen函数

  • egen_inequal // 生成不平等和贫困指数的函数
  • egenmmed // create a moving median
  • egenmsd // create a moving standard deviation
  • egenms // create a moving sum
  • asgen // generates weighted average mean using an existing variable as weight
  • egenmisc // provide various egen functions
  • egenmore // 各类新增的扩展函数
  • ereplace // 这个一定要介绍
  • ewma // calculates an exponentially weighted moving average
  • gtools // provide a fast implementation of common group commands
  • tsegen // call an egen function using a time-series varlist

文字日期变量的处理

导入数据

clear
input str10 date 	str10 date_str 1967q1    	"01/29/1960"1967q2		"01/30/1960"1967q3		"01/31/1960"1967q4		"02/01/1960"1968q1		"02/02/1960"
end

在这里插入图片描述

gen date_back1 = date(date_str, "MDY") // 转化为数字格式
format date_back1 %td //定义日期显示格式

在这里插入图片描述

将季度数据调整为月度数据

* 示例数据
clear
input str10 date float value
"2017-03-31" 10
"2017-06-30" 20
"2017-09-30" 30
"2017-12-31" 40
end* 将日期格式转换为日期变量
gen date_var = date(date, "YMD")* 按日期排序并设置为时间序列
sort date_var
tsset date_var* 将季度数据扩展到月度
expand 3
sort date_var
scalar start_mon = mofd(date_var)
gen month = start_mon + _n - 3* 输出结果
format month %tm
list

在这里插入图片描述
日期变量互转参考表
在这里插入图片描述

抽样

不放回抽样

随机抽样

// 生成随机数
clear 
set obs 10
gen x = _n
save P4_data1.dta, replace// *-抽取 30% 的观察值
use P4_data1, clear
browse
sample 30// *-随机抽取 5 个观察值             
use P4_data1, clear
sample 5, count
browse

分组抽样

// *-抽取 50% 的观察值 by(id)
use P4_xtdata, clear
browse
sample 50, by(id)
xtset id year// *-抽取 50% 的观察值 by(race)
sysuse nlsw88, clear
table race
sample 50, by(race)
table race

在这里插入图片描述

分块抽样

// 机抽取三家公司 cluster(id)将id相同的样本合并为一个 wor 不放回抽样
use P4_xtdata, clear
browse
gsample 3, cluster(id) woruse P4_xtdata, clear
browse
gsample 40, cluster(id) wor percent //随机抽取 40% 的公司

有放回抽样

use P4_data1.dta, clear
browse
bsample
sort x

在这里插入图片描述

对面板数据的有放回抽样

use P4_xtdata, clear
browsebsample, cluster(id) idcluster(idnew)
xtset idnew year

有放回抽样的应用:bootstrap 标准误

sysuse auto, clearbootstrap, reps(300):  ///reg price weight mpg foreign, noheader// *-等价写法:
reg price weight mpg foreign,  ///vce(bootstrap, reps(300) seed(1357))

五月天