Stata笔记-A2-连

创建变量

_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值