stata数据处理

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

数据导入、导出

数据导入:

import excel auto.xls, firstrow sheet(Sheet1) clear 
br foreign
encode foreign, gen(Cartype2) label(foreign)
br Cartype2 
label list foreign

save 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 格式的数据导入 STATA

help fdasave  //Save and use datasets in FDA (SAS XPORT) format

help 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

在这里插入图片描述

一对多与多对一横向合并

多对一横向合并

扫描二维码关注公众号,回复: 15543110 查看本文章
merge m:1 varlist using filename [, options]
  • varlist表示按照哪个变量来合并
use GTA_FS.dta,clear    //上市公司财务资料, id-year, Panel
br 
use GTA_basic.dta,clear //上市公司基本资料,只有 id 没有 year
br

use 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)==1

gen yes = e(sample)
sort yes
browse yes wage industry tenure hours

sum 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 k
  id   k
  1   3
  1   5
  1   .
  1   .
  1   7
  2   .
  2   .
  2   4
  2   8
  2   .
end

gen 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_wage

twoway (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, detail

replace 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, clear

tab 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 Full

local 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) 

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

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) wor

use P4_xtdata, clear
browse
gsample 40, cluster(id) wor percent //随机抽取 40% 的公司

有放回抽样

use P4_data1.dta, clear
browse
bsample
sort x

在这里插入图片描述

对面板数据的有放回抽样

use P4_xtdata, clear
browse

bsample, cluster(id) idcluster(idnew)
xtset idnew year

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

sysuse auto, clear
	
bootstrap, reps(300):  ///
        reg price weight mpg foreign, noheader

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

猜你喜欢

转载自blog.csdn.net/weixin_52185313/article/details/130118761