Stata学习笔记

命令 解释 示例 备注
pwd 显示当前路径 pwd  
dir 显示当前路径下所有文件 dir  
mkdir 当前路径下新建文件夹 mkdir d:/mydata  
cd 更改路径为 cd d:/mydata  
append 纵向合并 ,个案拼接 append using math  
merge 横向合并,变量合并 merge using  
xpose 转置 xpose,clear  
cap 悄悄运行,但无论正误继续do命令 cap 与quiet 区别
qui 悄悄运行,遇错停止 qui  
duplicate 重复值

duplicate report 报告重复值

duplicate list 将重复值列表呈现

duplicate drop 删除重复值

 
bys sort by简写,字符型变量分组    
sort 升序    
gsort 降序    
gen 生成新变量,无函数 gen newvar=var/10  
egen 生成新变量,有函数 egen newvar=mean(var)  
xtile    ,nq(n) n等分分组    
record 重新赋值   简洁
*使用日志文件
log using c:\logfile			//设置为smcl格式
log using c:\logfile.log,text	//设置为文本格式
log using c:\logfile.log,text replace	//覆盖日志文件
log using c:\logfile.log,text append	//添加到原有文件之后
log off							//暂时关闭
log on							//重新打开,对应的是log off
log close						//完全关闭,对应log using

*其他常用第三方命令,首次使用需运行"ssc install 程序名"下载安装
*回归结果导出
outreg2 被解释变量 解释变量1 解释变量2 using regfile,replace seeout
*日志文件导出,以计算pearson相关系数为例
logout,save(my) excel replace:pwcorr lwt bwt,sig star(0.05) 
*最小二乘回归表导出
esttab using test.rtf

cd		//查看当前工作目录
cd "d:/CHFS_tracking"	//设置当前工作目录

by foreign : count if rep78 > 4
describe
codebook foreign
list foreign price mpg rep78 in 1/5
browse foreign price mpg rep78 in 1/5

generate epi001=1 if foreign==1
replace epi001=0 if foreign==0


ttest price,by(foreign)		//成组t检验
logit foreign rep78 price

*----------------------------------------*
*=========      描述变量       ==========*
*----------------------------------------*

sysuse auto,clear

tabstat price,by(foreign) stat(mean sd min max)		//分层描述


*summarize语句:描述连续性变量
sysuse auto				//使用软件自带的数据auto
summarize price				
summarize mpg			//
summarize mpg,detail	//显示其他更多信息
summarize,separator (8)	//显示所有变量的信息,且每八个变量分割一下

*tabulate语句:描述分类变量
tabulate foreign			
tab1 rep78 foreign			//对多个变量逐个描述 
tabulate rep78 foreign      //rep78和foreign的交叉表
tab2 rep78 foreign 			//为指定变量列表中的变量生成任意可能组合的交叉表

*----------------------------------------*
*=========      循环语句       ==========*
*----------------------------------------*
*----------forvalues循环语句
*带条件语句(if else)的循环语句
forvalues x=1/9{
	if mod(`x',2){
	display "`x' is odd"
	}
	else{
	display "`x' is even"
	}
}
*带条件语句(if continue)的循环语句
forvalues x=1/9{
	if mod(`x',2){
	display "`x' is odd"
	continue
	}
	display "`x' is even"
}
*提前终止(if continue break)循环的循环语句
forvalues x=1/9{
	if mod(`x',2)==0{
	display "The first odd is `x'"
	continue,break
	}
}

*-----foreach循环语句in/of都可,但of效率更高,推荐使用
*循环变量list为字符变量(变量名也可以简写,只写前几个字母,t*表示t开头的变量)
 foreach var of varlist pri-rep t*{
 quietly summarize `var'
 summarize `var' if `var' > r(mean)
 }
 *循环新变量(list为新建字符变量)
 foreach var of newlist z1-z4{
 generate `var' = runiform()
 }
 *循环数字,list为数值
 foreach num of numlist 1/4 8 103{
 display `num'
 }
 *注:foreach上述三种方法不够稳健,推荐使用下面的宏的方法
 *foreach of local macro,list为局部宏
 local grains "rice wheat flax"
 foreach x of local grains{
 display "`x'"
 }
 *foreach of global macro,list为全局宏
 global money "dollar lira pound"
 foreach y of global money {
 display "`y'"
 }
 
 
*-------while循环语句------------*
*continue,break可使命令跳出整个循环
local i = 1
while `i' < 4{
	if mod(`i',2)==0{
	display "The first odd is `i'"
	continue,break
	}
display "The i is `i'"
local i = `i' + 1
}
*exit命令可以退出当前程序或do命令
local i = 1
while `i' < 4{
	if mod(`i',2)==0{
	display "The first odd is `i'"
	exit
	}
display "The i is `i'"
local i = `i' + 1
}
*有多个嵌套循环,只想跳出当前循环,可以使用if break组合
local i = 1
while `i' < 4{
	if mod(`i',2)==0{
	display "The first odd is `i'"
	break
	}
display "The i is `i'"
local i = `i' + 1
}
*若while循环是递增或递减的,还可以使用以下方法:
local i = 0
while (`i++') < 4{
	if mod(`i',2) == 0{
	display "The first odd is `i'"
	continue,break
	}
	display "The i is `i'"
}

*----------------------------------------*
*=========      报表制作       ==========*
*----------------------------------------*

*-------------tabulate命令---------------*
*tabulate命令:生成二维频数表,一般简写为tab
*选项:column——每列相对频数;row——每行相对频数;cell——每个单元格相对频数
*expected——每个单元格期望频数;nofreq——不输出频数;nolabel——输出数值而不是数值标签
webuse citytemp2
tabulate region agecat,row column expected chi2

*------------- table命令------------------*
*table命令:生成概要统计表格
*注意:contents(clist)用于定义表格输出的统计量,最多可选5个统计量,且统计量后边需要跟上变量名,即c(mean varname)

*绘制一维表
webuse auto2
table rep78,c(n mpg mean mpg sd mpg med mpg)  format(%9.2f)  //按照rep78变量取值分组汇总mpg的频数、均值、标准差和中位数,且有小数的保留两位小数

*绘制二维表,表格内容居中对齐,增加行合计和列合计
table rep78 foreign,c(mean mpg) format(%9.2f) center row col

*绘制三维表
*sc——scolumn可以增加超级列合并,比如下面例子不仅按照race分为了other和white两大列,还会新形成一个total列
*fw为赋权
webuse byssin
table workplace smokes race [fw=pop],c(mean prob) format(%9.3f) sc col row

*绘制更高维度的表格——通过by()选项实现
webuse byssin1
table workplace smokes race [fw=pop],by(sex) c(mean prob)format (%9.3f) sc col row

*-------------tabstat命令--------------------*
*tabstat命令:生成精简统计表格
*statistics(statname)用于定义表格输出的统计量
webuse auto
tabstat price weight mpg rep78 ,by(foreign) stat(mean sd min max) long format

*----------------------------------------------*
*====  在数据集中生成包含统计信息的变量   =====*
*---------------------------------------------*

*-------------collapse命令--------------------*
*包含概要统计的数据集:collapse命令
*collapse命令用法:
collapse (stat) varlist
collapse (stat) target_var=varname
*stat选项是用来指定输出的变量的
webuse college,clear
list
collapse (mean) gpa hour (median) medgpa=gpa medhour=hour [fw=number],by(year)
list
*注意:此时的gpa和hour变量都是原gpa和hour的均值

*-------------contract命令--------------------*
*生成包含频数和百分数的数据集:contract命令
*把原始数据整理成频数形式
webuse auto2,clear
list rep78 foreign
contract rep78 foreign
list
expand _freq  //转换成原始数据格式

*-------------statsby命令--------------------*
*按分类生成统计量:statsby
webuse auto2,clear
statsby,by(foreign):regress mpg gear turn
list
*只看gear变量对应的系数
webuse auto2,clear
statsby gear=_b[gear],by(foreign):regress mpg gear turn
list


*----------------------------------------------*
*====         将回归表格导出到excel       =====*
*---------------------------------------------*

*命令1:比较全,可以把F统计量等信息也导出
sysuse auto,clear
regress price turn gear
putexcel set "C:\results.xlsx",sheet("regress results")
putexcel F1 = ("Number of obs") G1 = (e(N))
putexcel F2 = ("F") G2 = (e(F))
putexcel F3 = ("Prob > F") G3 = (Ftail(e(df_m),e(df_r),e(F)))
putexcel F4 = ("R-squared") G4 = (e(r2))
putexcel F5 = ("Adj R-squared") G5 = (e(r2_a))
putexcel F6 = ("Root MSE") G6 = (e(rmse))
matrix a = r(table)'
matrix a = a[.,1..6]   //指定输出的列数,现在只指定了输出回归表格前六列的内容
putexcel A8=matrix(a,names)

*命令2:只导出了回归结果,比较简单,适合只需要回归系数的情况  
putexcel B3 = matrix(r(table)',names) using "C:\results1.xlsx"

*----------------------------------------------*
*====         reshape命令      =====*
*---------------------------------------------*
webuse reshape3,clear
reshape long inc@r ue,i(id) j(year)


*----------------------------------------------*
*====             对变量进行编码          =====*
*---------------------------------------------*
*recode x2 (1 2 = 1)(3 = 2)(4/9 = 3)   //会替代原始数据
recode x2 (1 2 = 1)(3 = 2)(4/9 = 3),prefix(rec)   //将编码后的数据放入新变量且新变量为原始变量名加前缀rec
recode x2 (1 2 = 1)(3 = 2)(4/9 = 3)(nonmissing = 9),prefix(rec)   //重新编码时其他非缺失值可以用nonmissing选项
recode x2 (1 2 = 1 Below)(3 = 2 Average)(4/9 = 3 Above),prefix(rec2) label(reclab)  //给新变量设置变量值标签
recode x2 (1 2 = 1)(3 = 2)(4/9 = 3)(10/max),prefix(rec3)

encode gender,gen(sex)  //将字符变量编码为数值变量,比如将female编码为0,male编码为1
decode sex,gen(gender1)	//将数值变量编码为字符变量

*----------------------------------------------*
*====             对缺失值进行编码        =====*
*---------------------------------------------*
*默认系统缺失值为","
*变量值标签不会随编码自动改变,必要时需手动加以调整
*将数值编码为缺失值的命令:mvdecode
mvdecode rep78 ,mv(998=.\999=.a)  //当rep78=998时将其编码为系统缺失值".",rep78=999时编码为扩展缺失值".a"
mvdecode _all,mv(998=.\999=.a)  //所有变量都按此规则编码
*将缺失值编码为数值的命令:mvencode
mvencode rep78 if foreign == 0,mv(998)  //foreign=0时将rep78的缺失值编码为998
mvencode rep78 if foreign == 1,mv(999)  //foreign=1时将rep78的缺失值编码为999
mvencode _all,mv(.=999\.a=998\.b=997\else=996)

*----------------------------------------------*
*====      数值变量和字符变量的转换       =====*
*---------------------------------------------*
*字符变量转换为数值变量:destring和real()
destring foreign , gen(foreignd)
gen foreignd = real(foreign)   //另一种方法

destring foreign,replace
destring foreign,replace force
destring foreign,gen(foreignd) ignore(x)  //变量中除了数值,还有x值,可选择忽略x值(设为缺失值)
destring foreign,gen(foreignd) ingore(" ")  //忽略空格
destring trunk weight length turn,gen(trunkd weightd lengthd turnd) ignore("$,%") percent  //同时忽略多个字符,百分数用小数表示

*----------------------------------------------*
*====          数据集的纵向追加           =====*
*---------------------------------------------*
sysuse auto,clear
keep if foreign == 0
keep make price mpg rep78 headroom foreign
save domestic

sysuse auto,clear
keep if foreign == 1
save foreign

use domestic,clear
append using foreign,gen(_append)  //_append为0表示来自主数据集,为1表示来自using的第一个数据集
append using foreign,gen(_append) keep(make price mpg rep78 headroom foreign)  //只选择某些变量追加到主数据集

*----------------------------------------------*
*====          数据集的横向合并           =====*
*---------------------------------------------*
*1:1
webuse autosize
merge 1:1 make using http://www.stata-press.com/data/r13/autoexpense
merge 1:1 make using http://www.stata-press.com/data/r13/autoexpense,keep(match)  //仅保留完全匹配的记录

*1:m
webuse overlap2,clear
merge 1:m id using http://www.stata-press.com/data/r13/overlap1  //如果主数据和using数据有重复变量,保留主数据的变量值
merge 1:m id using http://www.stata-press.com/data/r13/overlap1,update
merge 1:m id using http://www.stata-press.com/data/r13/overlap1,update replace

*m:1
webuse overlap1,clear
merge m:1 id using http://www.stata-press.com/data/r13/overlap2
merge m:1 id using http://www.stata-press.com/data/r13/overlap2,update
merge m:1 id using http://www.stata-press.com/data/r13/overlap2,update replace

*1:1序贯合并:没有关键变量,按记录号合并
webuse sforce,clear
merge 1:1 _n using http://www.stata-press.com/data/r13/dollars


*注:1:m和m:1合并时,数据库间存在同名变量时:
	*默认以主数据中同名变量的变量值作为合并后的变量值
	*用update选项时:匹配的缺失值用using数据集的数据代替
	*用update replace选项时:匹配记录的值用using数据集的数据代替
	*在横向合并前使用cf命令查看主数据和从数据的变量的差别,具体可以help(cf)

cf _all using http://www.stata-press.com/data/r13/autoexpense,all

isid id   //用来判断id的值是否唯一

*----------------------------------------------*
*====       数据集的交叉合并:组内交叉   =====*
*---------------------------------------------*
*joinby命令:实现了m:m,具体help joinby
use "D:\黄静\child.dta",clear
describe 
list


webuse parent,clear
save "D:\黄静\parent.dta"

use "D:\黄静\parent.dta",clear
describe 
list

sort family_id
joinby family_id using child  //只保留匹配上的记录
joinby family_id using child,unmatched(both)  //保留主数据和从数据的所有记录
joinby family_id using child,unmatched(master)  //保留主数据记录
joinby family_id using child,unmatched(using)  //保留从数据记录

describe 
list

 

你可能感兴趣的:(stata)