创建变量
_n,样本序号变量,不能用list,gen变量=_n 再list变量
_N,样本数指标值,scalar标量=_N
应用(先sort)
变量[_N]最大值,变量[_n]-变量[_N]与最大值的差,变量[_N]-变量[1]取值范围
变量[_n]-变量[_n-1]差分,ln(变量[_n]) - ln(变量[_n-1])对数差分
(变量[_n-1] + 变量[_n] + 变量[_n+1]) / 3移动平均
时间序列数据(先tsset)
L.变量滞后一期,L2.变量滞后两期,F.变量前推项,D.变量一阶差分
reg close L(1/3).(close open)1-3阶两个变量滞后项
增长率 D.变量/L.变量或D.ln变量
bysort industry: gen gid = _n分组标记序号
创建虚拟变量
gen虚拟变量=0,replace虚拟变量=1if条件满足
tab类别变量,gen(虚拟变量)产生n个虚拟变量
xi i.类别变量 自动定义虚拟变量名称并附加标签,再次使用xi.命令时之前产生虚拟变量会被覆盖,n-1个变量
解决方法:1.附加选项,prefix()增加不同的前缀 2.事先修改变量名称renvars 虚拟变量*\名称或,prefix(前缀)
noomit可以生成n个
因子变量
varlist命名规则 i.根据类别创建虚拟变量,c.后面是连续变量,#两个类别变量交互项,##单列类别变量再组合
i.race i.married race#married=race##married
对照组 ib#.类别#作为基准组,ib(##).第#个类别,ib(first).最小,ib(last).最大,ib(freq).频数最大,ibn.不设置
fvset base # 变量,永久设定变量值为#为对照组
存在连续变量想交互加c. c.#c.平方项
连续变量转换为类别变量
sort;gen 变量=group(#)等分为#组
recode 变量(min/#=1)(#/#=2)(#/max=3)右封闭区间
gen变量=irecode(变量,#,#)产生0,1,2
gen变量=recode(变量,39,42)产生39,39-42定义为42,大于42为42
利用条件函数产生虚拟变量
cond(s,a,b,c)s为条件
gen dum1 = cond(hours>40, 1, 0, .)
inlist(x, a,b,c,...) x=a,b…为真,返回1
gen dum_occu = inlist(occu, 1,2,7,12)
inrange(x, a,b) if a<= x <= b,真返回1
等价于gen 变量=(hours>=30&hours<=40)
clip(x, a,b) if x<=a; if x>=b ;截尾
创建交乘项
gen 交乘项=变量*变量
xi:reg 其他变量 i.类别变量*i.类别变量 批量产生交乘项
reg 其他变量 i.类别变量*连续变量 连续变量自动加入
gen变量=sum()累加 egen变量=sum()总体加总
gen无法处理缺失值,egen自动忽略缺失值
egen用法
等差序列egen year = seq(), from(2000) to(2004) block(5)重复5次
填充数据egen r2 = fill(2 4) 间隔为2递增数列
组内均值mean()median(),by(类别变量)
跨变量比较 egen avg_price = rmean(open close)
egen diff = diff(open close)
变量标准化x_s=(x-x_m)/x_sd
egen s_change2 = std(change), mean(20) std(3)指定变量标准化均值和标准差
变量平滑化 3期平均值
egen mv5_open_nomiss = ma(open), t(5) nomiss 5期,不要缺失值
egenmore
egen grade = ntos(rep78), from(1/5) to("优秀" 好 较好 较差 差) 字符串转为文字等价于ston()
egen banknum = nvals(objbank), by(id year) 根据id year分组,统计组内非重复值个数
egen tag = tag(id year objb) 标记第一个非重复值为1,再将1加总可以获得当年交易银行数量
egen isbank = incss(objbank), substr("银行") bank包含银行的变量为1
gmean()几何平均数[x1*x2*...*xn]^{1/n} hmean()调和平均数n/ 1/x1 + 1/x2 + ... + 1/xn
分位数 第 p_th 百分位数值,记为 x_|p| p = N_p/100
第 25 百分位的数值,则 N_p=25, p=0.25,每个观察值的权重为 w(i)=1/N
前 i 个观察值的权重之和为 W(i)=SUM_w(i) = i/N
第 p_th 百分位的数值定义为,第一个满足 W(i)>p 的值
x_|p| = {x[i-1]+x[i]}/2 if W(i-1)=p
x[i] otherwise
obs=101 x[6] obs=100 {x[5]+x[6]}/2
pctile p_price = price, nq(10)样本分为10组9个分位数 gen(percent) 分位数标识
xtile x_bp = bp, nq(4) 3个分位置,指定百分位值定义类别变量
cutpiont() 选项,定义新的分位点 input class命令自己定义
_pctile length, nq(10) 能够提供各个分位值的返回值
_pctile price, p(33.3 72 90 99) 可以自行指定分为点
重复样本值处理
类别:特殊意义 连续:错误
识别
isid 变量 变量能否作为区别所有观察值,关键字?
duplicates list 列示所有的重复值 duplicates report更详细的信息
duplicates example 列示所有重复的情况,组成多少种情况
标记重复样本组合
egen rm=group(race married),label六个组别自动创建标签
tab rm,gen(dum_rm)生成虚拟变量
egen rm_tag=tag(race married)第一个非重复样本为1,其他为零
duplicates tag race married, gen(rm_dtag)每一组里重复值个数
删除
duplicates drop race married,force
缺漏值 "."大于任何自然数
sum, regress, generate 等,会自动忽略缺漏值;count, keep 等,则会将 "." 视为一个无穷大的数值
标记
数值型缺漏值: mvdecode _all, mv(-97 -999),所有变量缺失值转换为stata可识别的"."
文字型缺漏值:replace x1 ="." if x1== "N/A" real()转换为实数
缺漏值形态,sum识别
misstable summarize对所有变量做缺漏值分析
misstable pattern缺漏值模式,bypat根据类型分类
misstable tree更详细
删除
egen miss = rmiss(wage industry occupation),1个缺漏值返回1,3个返回3
drop if miss!=0缺点:牺牲一个变量
drop if missing(grade,indus,occup,union,hours,tenure)
dropmiss, obs 以观察值为单位 dropmiss, any 以变量为单位
先回归 reg wage industry occup tenure hours eret list自动标识缺失值
gen byte nomis = e(sample) // 标示样本的虚拟变量
keep if nomis==1
填补空缺
1.单一缺漏值 replace x = x[_n-1] if x==. 前一个值 replace x = x[_n+1] if x==. 后一个值
2.多个缺漏值 replace x = x[_n-1] if mi(x)
3.面板数据 by id: replace x = L.x if mi(x)
多重补漏分析MI分析
不对缺漏值的产生机制做任何假设(不假设其为 Random),采用 Bayesian 或 MCMC 模拟分析
1.声明数据结构 mi set (wide)设置数据形态;mi register 定义哪些变量需要补漏;
2.补漏估计 mi impute 在给定假设下,使用某种模型进行 M 次插值,建立一个模型reg
3.目标模型估计 mi estimate 利用第二步中的 M 组数据进行 M 次回归分析,并将 M 次估计结果整合起来,得到最终的结果
mi set wide
mi register imputed price_R
mi impute regress price_R wei len mpg turn forei, add(20)
mi estimate: logit foreign price_R wei mpg turn
average RVI 缺漏值的存在会增加模型var,RVI越小影响越小
MI impute regress假设条件:满足正态分布
gen ln_price_U = ln(price_U)对数转换,后续估计不适用ln
mi register passive price_U;
qui mi passive: replace price_U = exp(ln_price_U);补漏值也转换回去
对比真实数据
logit foreign price wei mpg turn, nolog noheader
对比直接删除数据的情形
logit foreign price_U wei mpg turn, nolog noheader
其他补漏方法
mi impute pmm 对模型设定和分布假设不敏感,稳健性较高
mi impute logit 用于填补 {0/1} 变量的缺漏值
mi impute mlogit 用于填补 {0/1/2/3...} 序别变量的缺漏值
离群值的处理
查找离群值
第25、50、75百分位上的数值分别称为第1、2、3四分位
* 四分位间距(interquartile range): iqr = p75-p25
* 上界(upper adjacent) = p75 + 1.5*iqr
* 下界(lower adjacent) = p25 - 1.5*iqr
计算上界下界
adjacent 变量,by()
egen outby= outside(price), by(foreign) factor(2);2倍四分位间距,获得离群值
keep if outby==. 删除离群值
graph box price,by()箱型图,方块部分是上界和下界
删除
adjacent;drop if (price>8814&foreign==0) | (price>9735&foreign==1)
outside;drop if outby != .
对数转换后,样本排序一样
gen ln_wage = ln(wage)
缩尾处理
双边缩尾winsor wage, gen(wage_w2) p(0.025) 产生新变量,5%缩尾
单边缩尾 winsor wage, gen(wage_h) p(0.025) highonly/lowonly 只有右边
等同于
_pctile wage, percentile(1 99)
replace wage = r(r1) if wage<r(r1)
replace wage = r(r2) if wage>r(r2)
gen wage_w = clip(wage, r(r1), r(r2))
截尾处理
_pctile wage, percentile(1 99)
return list
drop if wage<r(r1)
drop if wage>r(r2)
先绘制直方图,根据分布情况判断
横向合并:增加变量
一对一合并 use merge_m.dta, clear原始数据
merge 1:1 date(关键字,链接两个表) using merge_u(调用数据)
产生新变量_merge 1来自原始;2来自调用;3都有
选项 keepusing(varlist) 合并部分数据,关注的变量
generate(new varlist)不用_merge,新的变量名
nolabel nonote 不改变数字-文字对应表
update 更新主数据中的缺漏值,注意只能更新"."
update replace 直接替换掉主数据中的所有值
多对一合并 use GTA_FS.dta, clear原始数据,多
merge m:1 id(关键字) using GTA_basic.dta, nogen不产生_merge变量
一对多合并 多对一逆向操作
横向关联:保留两份数据中有对应关系的数据,更加完整
use parent.dta, clear
sort family_id
joinby family_id using child.dta
对比 merge m:m fam using child 合并后保留缺失值,将调用数据导入主数据,非完整
纵向合并:追加样本
use append_m.dta, clear
append using append_u.dta 放在同一列中,变量名称要相同,有相同存储类型
选项 generate(new varlist)产生新变量,判断来源
解决存储类型不同 rename foreign ss
gen byte foreign=1
drop ss
重新组合样本
样本转置 xpose, clear // clear 选项必须加
横纵变换
wide->long reshape long inc ue, i(id) j(year)
replace year = real("19" + string(year))数据处理
long -> wide reshape wide inc ue, i(id) j(year)
交叉组合 fillin id choice原有观察值进行组合,产生_fillin变量
cross using sex.dta;dta中有两个变量
样本堆砌:向量化
stack a b c d, into(x)新的变量名称 clear 产生_stack来源第几列
stack a b c d, into(x1 x2) clear 堆成两列,按顺序
.txt读入后数值中有$、%、/、-可能识别为文字
文字转换为数字 destring code 误存为文字型
选项 gen(code1) 变量名 replace
ignore(" ") 清除 “ ”ignore("-/,%")多个清除
percent百分位自动转换为小数
纯文字转换为数字 encode 根据文字类型自动编号,会设定数字-文字对应表,不可以用replace
sdecode 根据出现顺序编号
rencode, replace
rdecodeall转换多个变量
选项 gen(var)
数字转换为文字
年月日组合 tostring year day, replace
gen date = year + "-" + month + "-" + day
gen edate = date(date, "YMD")
format edate %td
年月日分离 tostring date_pub, gen(date1) //产生新变量,存储文字类型
gen year = substr(date1, 1, 4) //第一位到第四位
gen month = substr(date1, 5, 2)
gen day = substr(date1, 7, 2) //截取可以用word
destring year month day, replace
文字样本值分解 split year, parse(-) 产生year1,year2文字型
split date,parse(/) destring ignore("/")
处理文字函数 help string functions lower( )更改大小写 length( )包含多少字母
wordcount( )统计变量个数 proper( )归整人名
strmatch( , )两个字符串是否相同 trim( )去掉两端空格 itrim( )中间空格,多余
subinstr(s,s1,s2,n)前n个字符串s中的s1替换为s2,若n为"."则全部替换
处理不规则日期 gen date=regexs(0) if regexm(date,"^[0-9]+")
^字符串开头部分 [0-9]0-9任何一个自然数 +至少一个对象匹配,*任何一个都匹配
?只有一个匹配 [a-zA-Z]阿拉伯字母 末尾$字符串末尾
regexm(s,re)字符串匹配函数 regexs(0)返回所有regexm中符合正则表达式的字符串
类别数统计 tab varlist 无法看到类别数
distinct varlist可以统计数目,joint组合个数;ret list
交叉类别变量生成 xgroup varlists ,gen()
选项 label lname( )生成数字-文字对应表
分组统计量
单层统计量: bysort race:sum wage
tabstat wage, by(race) stat(mean sd med min max) format (%6.2f) columns(statistics)
tab industry, sort summarize(wage) 计算工资统计量
二三层次: bysort race married: sum wage
bysort race married: tabstat wage, by(union) s(n mean sd p50 min max)三个类别
bysort race married: tab union, sum(wage)
多层次: table race married union, by(collgrad) c(mean wage freq) format(%4.2f)四个类别
其他方法
bysort industry: egen wage_p50 = pctile(wage), p(50)会有很多重复值
collapse (统计量1) 新变量名=原变量名 (统计量2) by( )无重复值,但会丢失原始变量标签
collapse (mean) wage hours (count) n_w=wage n_h=hours, by(industry race)
图示统计量
柱状图 graph bar (mean) wage基本统计量, over(smsa) over(married) over(collgrad)顺序从内到外
graph hbar横向柱状图 (mean) hours, over(union) over(married)over(race) percent各占百分比 asyvars(将第一个over选项变量视为纵轴)
graph bar wage hours, over(race) over(married) stack(堆叠方式)多变量
over(race, relabel(1 "白人" 2 "黑人" 3 "其他"))子选项
legend(label(1 "工资水平") label(2 "工作时数"))条形名称
箱型图 graph box hours, over(race) over(married) nooutsides(离群值不展示) 展示样本值分布情况
时间序列资料处理
声明时间序列:tsset 可以用L.
是否有断点:tsreport,report list
填充缺漏日期:tsfill 是一个缺漏值,填充方法一般为移动平均
追加样本:tsappend,add(5) 缺漏值,后续回归填补
面板资料处理
声明面板资料:xtset 两个变量
面板基本描述:xtdes, patterns(20)显示20种公司显示频率,默认为9
资料形态:xtpattern,gen(pp);tab pp,sort; pattern频率设为一个新文字型变量
统计公司数目: panels id;
tab province 以观察值为单位进行统计
panels id: tab province 以公司为单位进行统计
panels id: tabstat size tl roa tobin, c(s) stat(N)统计每个变量对应公司数目
连续公司编号:egen code_123 = group(code)
gen b = . 产生缺失值的列
forvalues i=1/438(1-438,步长为1) {
qui reg tl size tang tobin if code_123==`i'(quietly不显示输出信息)
replace b = _b[tobin] in `i'(_b表示系数,tobin估计参数)
}
gen i = _n
变为平行面板:xtbalance,range (1998 2005) miss(varlist)有缺漏值先删除
注意面板数据差分,同时考虑id和year,某一id下year的差分
删除面板数据首尾缺漏值
首部:bysort id (year): drop if sum(mi(x))==_n //missing判断函数,_n某家公司相应年度排序
尾部:gen nyear = -year 逆向排序
bysort id (nyear): drop if sum(mi(x))==_n
by id, sort: egen firstnonmis = min(cond(!missing(x), year, .))
有缺漏值返回".",无缺漏值返回当年年份,某个id显示有观察值的最小年份
by id: egen lastnonmis = max(cond(!missing(x), year, .))
返回观察值的最大年份,确定了观察值年份区间,不考虑中间的缺漏值
drop if (year<firstnonmis) | (year>lastnonmis) //删除观察值区间之外的样本
cond(x, a, b) true->a false->b
保留连续六年有观察值的公司
xtpattern, gen(pp)
gen p6 = strpos(pp, "111111")
drop if p6==0
进一步处理
…111111…退市或部分年度资料缺失,删除这些公司 tab pp观察
gen pbreak1 = strpos(pp,"1.")
drop if pbreak>0
…111111..1..删除某个间断年份后所有数据
gen Dyear = D.year
bysort id (year): replace Dyear=1 if _n==1 //第一年不是缺漏值
bysort id: egen firstyear_mis = min(cond(missing(Dyear), year, .))//返回存在缺漏值最小年份
bysort id: drop if year>=firstyear_mis
每隔 T 年保留一次资料
panelthin, min(3) gen(OK) 每隔3年,新变量OK,隔三年数据OK=1
对于日资料,min(5) 可能比较常用
对于月资料,min(3) 或 min(5) 会比较常用
采用 P 年平均值进行估计
paverage tl-tobin, p(2)每两年平均一次 ind(code) yr(year) 样本数变为1/2
面板缺漏值扩充
生成一个新变量:只要某家公司发放过股利则计为1
bysort id: egen div_mean = mean(div_yes)
gen div_s = 0
replace div_s = 1 if div_mean != 0
行业信息只有一年
sort id sicda_s1
bysort id: replace sicda_s1 = sicda_s1[1] if _n>1从第二家公司开始填,剩下的都填成第一个数值
简洁命令:enlarge sicda_s2, by(id)
标准化处理:bysort code: center tl fr size ndts tang tobin, prefix(c_)
数据的查验与比较
计数:count if (hours<10 | hours>70)
条件确认:assert,其返回值与count相反
比较:compare
两笔数据观察值是否一致:cf
use person1, clear
cf _all using person2, verbose all详细列出
两笔数据变量是否一致
cfvars xtcs.dta