1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,会计与财务研究中常见问题的,SAS,实现,会计与财务研究中的常用软件,SAS,-,面向多数据处理,功能强大,但上手难度较大;,-,识别汉字;,-,特别适合于数据的初步整理阶段(程序可保存,容易再现历史);,STATA,-,软件小巧,便于安装,且上手较容易;,-,回归和检验功能非常强大;,-,升级快,命令包可以随时在网上下载,支持自我学习;,研究实践:,SAS,(数据整理),+STATA,(回归检验),会计与财务研究中的常用软件,会计研究中的,STATA,运用,-Clive Lennox,的个人网站,ihom
2、e.ust.hk/accl/Phd_teaching.htm,-,为中山大学会计系所授课程,课件和演示用数据,课程主要内容,SAS,的一些基本操作;,分组回归程序:计算,DA,;,CAR,程序:不使用宏和使用宏;,计算股票年度业绩,RET,的程序;,Proc SQL,:多表合并程序,-,配对程序;,参考书,高惠璇等编译,,SAS,系统,BASE SAS,软件使用手册,中国统计出版社,,1997,;,高惠璇等编译,,SAS,系统,SAS/STAT,软件使用手册,中国统计出版社,,1997,;,这两本书类似于字典,用来查,而不是用来读;,学,SAS,的最佳方法:,-,对照已有的程序和数据一步一步地
3、跑,碰到不懂的命令(有时可以不求甚解),便去查书;,SAS,的基本操作,创建新的数据集并输出,-,打开,SAS,,在编辑器中写入程序:,data wghtclub;input idno 1-4 name$6-24 team$strtwght endwght;loss=strtwght-endwght;cards;1023 David Shaw red 189 165 1049 Amelia Serrano yellow 145 124 1219 Alan Nance red210 192 1246 Ravi Sinha yellow 194 177 1078 Ashley McKnight r
4、ed127 118 1221 Jim Brown yellow 220.1095 Susan Stewart blue135 127 1157 Rose Collins green155 141 1331 Jason Schock blue187 172 1067 Kanoko Nagasakagreen135 122 1251 Richard Rose blue181 166,;,run;proc print data=wghtclub;title Fitness Center Weight Club;run;,-,结果:在,SAS,逻辑库的,Work,中,就会出现,wghtclub,数据集
5、SAS,的基本操作,将,EXCEL,数据导入,SAS,-,比如,要将,H,盘,SAS,目录中的,profit.xls,文件导入,SAS,,并命名为,profit,;,-,打开,SAS,,在编辑器中写入程序:,proc import,out=profit datafile=H:SASprofit.xls,dbms=excel2000 replace;,run;,-,结果:在,SAS,逻辑库的,Work,中,就会出现,profit,数据集;,SAS,的基本操作,右键点开,profit,数据集查看数据集情况;,将,Accper,转变成年度;,data,profit,;set,profit,;,y
6、ear,=substr(,accper,1,4)+0;,run;,Substr,:文本截取命令,即对,Accper,的第,1,个字符开始,取,4,个字符;如,accper,的一个观测值是,1991-12-31,,则,substr(accper,1,4),就为,1991,,而,Substr(accper,6,2),则为,12.,将文本变量转化为数值变量,直接让文本变量加,0,即可;,Data x2;set x1;,对,x1,数据进行加工,然后保存为,X2,;,SAS,的基本操作,数据排序,-,对,profit,数据按照,stkcd,和,year,进行排序;,proc sort,data=prof
7、it,nodupkey;,by stkcd year;,run;,变量改名,data profit1;set profit;,rename stkcd=code;,run;,SAS,的基本操作,数据横向合并,-,比如,要将,Profit,和,solvency,进行,merge:,先将,solvency.xls,文件导入,SAS,proc import,out=solvency datafile=“H:SASsolvency.xls,dbms=excel2000 replace;,run;,data,solvency;set solvency;,year=substr(accper,1,4)+0
8、run;,proc sort,;by stkcd year;run;,在对两个或多个数据集进行,merge,时,需,要首先按照关键变量,(,如公司代码和年度),进行排序;,省略时,默认对最近的数据集进行排序;,SAS,的基本操作,数据横向合并,data fin_ratio;,merge,profit(in=a)solvency;,by stkcd year;,if a;,run;,注意:,data x1;merge tmp1(in=a)tmp2;by var1 var2;if a;run,-,表示已,tmp1,为基础进行合并,合并后的数据集样本数同,tmp1,相同;,data x1;mer
9、ge tmp1 tmp2;by var1 var2;run,-,包括了,tmp1,和,tmp2,的所有观测值;,data x1;merge tmp1(in=a)tmp2(in=b);by var1 var2;if a=1 and b=1;run,-,只包括,tmp1,和,tmp2,中共有的观测值;,SAS,的基本操作,纵向合并(,append,),data x1;set tmp1 tmp2;,Run;,-SAS,自己会去找对应的变量;,SAS,的基本操作,产生新的虚拟变量,比如,要从,fin_ratio,产生一个,2006,以后的虚拟变量,即年度在,2006,年后的,取值为,1,,否则为,0,
10、则:,data fin_ratio;set fin_ratio;,after2006=0;,if,year=2006,then,after2006=1;,run;,SAS,的基本操作,剔除变量空缺的观测值,;,CSMAR,数据集中,有些变量空缺,导入,SAS,为,“,.,”,,有些无点,为一个空格,则可以通过如下命令剔除这些数据缺失的观测值,:,比如,希望剔除,fin_ratio,数据中,,ROS,缺失的样本;,proc sort data=fin_ratio;by ros;run;,data tmp1;set fin_ratio;,if ros=.or ros=then delete;,r
11、un;,SAS,的基本操作,假如要把,ROS,ROA,ROE,的缺失样本同时删除,:,data tmp2;set fin_ratio;,if ros+roa+roe=.then delete;,run;,SAS,的一些基本算符:,*,/=,等于,=,不等于,=,SAS,的函数分类可以参见高惠璇,SAS BASE 1997 pp.70-74,SAS,的基本操作,SAS,日期函数,在,CSMAR,的数据库中,导出的日期文件一般为,yyyy-mm-dd,,如,1999-12-31,日,这是一个文本格式,那么,如何将其转化为标准的日期格式呢?,比如,我们经常要计算公司上市年龄,上市公司年龄等于各个财政
12、年度末减去,IPO,日期所间隔的天数,然后除于,365,得到上市年龄,比如,一个公司,1995-05-23,日,IPO,,则,2007,年,12,月,31,日时,他的上市年龄多少?,SAS,的基本操作,SAS,日期函数,-SAS,日期值函数:,Mdy(month,day,year);,如,mdy(12,31,1991)=11687,,,11687,代表,1991-12-31,日同,1960-1-1,所间隔的天数;,-,还原出,sas,日期值的函数:,假定,date,是一个,SAS,日期值,则,year(date),得到年,,month(date),得到月,,day(date),得到日;,-,现
13、在,我们要计算,Fin_ratio,数据集中,各公司财政年末同,1990-05-07,(假定所有公司,IPO,日期都是这天)的时间距离;,SAS,的基本操作,SAS,日期函数,data tmp1;set fin_ratio(keep=stkcd accper ros);,ipodate=mdy(5,7,1990);,run;,data tmp2;set tmp1;,fiscal_year=substr(accper,1,4)+0;,fiscal_month=substr(accper,6,2)+0;,fiscal_day=substr(accper,9,2)+0;,fiscaldate=mdy
14、fiscal_month,fiscal_day,fiscal_year);,age=(fiscaldate-ipodate)/365;,run;,对数据进行,winsorize,处理,任务:对,fin_ratio,中的,ROS,,,ROE,ROA,,,Current,和,Acid,按上下,1%,进行,winsorize,处理;,data tmp1;set fin_ratio;d=1;run;,proc means noprint;,var roa roe ros current acid;,by d;,output out=tmp2(drop=_freq_ _type_)p1=x1-x5 p
15、99=y1-y5;,Proc means:,对数据进行描述性统计;,noprint:,统计结果不在,SAS,中显示;,Var:,指定需要分析的变量;,by:,按什么条件进行分析(,e.g.,by year,分年度进行分析),;,Output out=tmp2,:将分析结果保存于,tmp2,中;,p1,:变量,1,分位数的值,p1=x1-x5:5,个变量,1,分位数的值(,-,不是减号);,p99:,变量,99,分位数的值;,对数据进行,winsorize,处理,data tmp3;,merge tmp1 tmp2;by d;,array z1:5 roa roe ros current aci
16、d;,array x1:5 x1-x5;array y1:5 y1-y5;,do i=1 to 5;,if ziyi then zi=yi;,end;drop i d x1-x5 y1-y5;,run;,Winsorize,的原理:如果一个样本某变量的值大于该变量的,99,分位数,则该样本的值被强制指定为,99,分位数的值;类似的,如果一个样本某变量的值小于该变量的,1,分位数,则该样本该变量的值被强制指定为,1,分位数的值;,Array:,指定一组变量(向量),;,如这里:,z1,便为,roa,x1,为,x1,即,roa,的,1,分位数;,y1,为,y1,即,roa99,分位数;,由于需要,
17、winsorize,五个变量,因此需要循环,5,次;,对样本进行描述性统计,希望对一组样本进行描述性统计,包括均值、中位数、标准差等,可以采用,proc means,和,proc univariate,模块;,比如,希望对,fin_ratio,进行描述性统计:,proc means,data=fin_ratio;,var,roa roe ros current acid after2006;,run;,对样本进行描述性统计,如果希望按年度或按行业分组进行描述性统计:,proc sort data=fin_ratio;,by year indcd;run;,proc means data=fin
18、ratio;,var roa roe ros current acid after2006;,by year indcd;,run;,对样本进行描述性统计,如果希望保存每组样本的某个统计量(如均值,中位数或者标准差),则可以使用如下程序:,比如,希望计算,1990-2006,年按年和行业均值(中位数)调整后的,ROA,和,ROS,,则程序如下:,*由于,indcd,行业分类太细,我们只想使用,22,个行业,即,C,类分到二级代码,其余都使用一级代码,data tmp1;set fin_ratio(keep=stkcd year indcd roa ros);,if substr(indcd,
19、1,1)=C then ind=substr(indcd,1,2);,if substr(indcd,1,1)=C then ind=substr(indcd,1,1);,drop indcd;,run;,对样本进行描述性统计,*,产生各年、各行业,ROA,和,ROS,的均值和中位数,;,proc sort data=tmp1;by year ind;run;,proc means,noprint,;,var roa ros;,by year ind;,output,out,=tmp2,mean,=mean_roa mean_ros,median,=median_roa median_ros;
20、run;,对样本进行描述性统计,*,合并,tm1,和,tmp2,,以计算均值,中位数调整后的,roa,和,ros;,data tmp3;merge tmp1 tmp2;,by year ind;,run;,data tmp4;set tmp3;,roa_mean_adj=roa-mean_roa;,roa_median_adj=roa-median_roa;,ros_mean_adj=ros-mean_ros;,ros_median_adj=ros-median_ros;,run;,对样本进行描述性统计,如果只想看看样本更全面的统计变量,可以使用,proc univariate,命令,这个命
21、令还可以顺带检验样本的均值(中位数)是否异于,0,;,proc univariate data=fin_ratio;,var ros roa;,run;,计算,Discretion accruals,修正的,Jones,模型(,see.Bartov et al.,2001,JAE,),-,首先计算总应计利润,(ACCA):ACCA=,(,t,年营业利润,t,年经营现金流量),/At-1,,然后分年度、分行业对如下模型进行回归:,计算,Discretion accruals,业绩调整的,DA,模型,计算,DA,的,SAS,程序,假定我们已经有了,1998-2008,年所有,A,股上市公司的以下数
22、据:总资产,TA,,营业收入,REV,固定资产,PPE,,应收账款,REC,,营业利润,Earnings,和经营现金流量,OCF,,以及公司代码、年度和行业,这些数据已经做成名为,raw_em,的,SAS,数据集。,计算,DA,的程序:,step1:,调入,raw_em,数据集,libname,dd,“,H:SAS;,data tmp1;set dd.raw_em;run;,Step2:,计算相关变量:,-,先产生,TA,,,REV,和,REC,的滞后(上年度)变量(滞后变量的结果将导致样本量减少,1,年);,-,然后合并,计算相关变量;,计算,DA,的,SAS,程序,data tmp2;se
23、t tmp1(keep=stkcd year ta rev rec);,year=year+1;,rename ta=pre_ta rev=pre_rev rec=pre_rec;run;,data tmp3;merge tmp1(in=a)tmp2;,by stkcd year;if a;run;,data tmp3;set tmp3;,acca=(earnings-ocf)/pre_ta;,a1=1/pre_ta;,delt_rev=(rev-pre_rev)/pre_ta;,ppe_ta=ppe/pre_ta;,delt_rec=(rec-pre_rec)/pre_ta;,run;,产生
24、滞后变量,合并,计算相关变量,计算,DA,的,SAS,程序,Step 3,:对计算好的变量进行,winsorize,处理(上下,1%,),:,data tmp4;set tmp3(keep=stkcd year indcode acca a1 delt_rev ppe_ta delt_rec roa);,d=1;where year1998;run;,proc means,noprint;,var acca a1 delt_rev ppe_ta delt_rec roa;by d;,output out=tmp5(drop=_freq_ _type_)p1=x1-x6 p99=y1-y6;,d
25、ata tmp6;,merge tmp4 tmp5;by d;,array z1:6 acca a1 delt_rev ppe_ta delt_rec roa;,array x1:6 x1-x6;array y1:6 y1-y6;,do i=1 to 6;,if ziyi then zi=yi;,end;drop i d x1-x6 y1-y6;,run;,计算,DA,的,SAS,程序,Step 4,:计算估计的,Jones,模型的系数,proc sort;by year indcode;run;,proc reg,data=tmp6,outest,=tmp7;,model,acca=a1 d
26、elt_rev ppe_ta/,noint,adjrsq;,by year indcode;,run;,outest:,把回归模型的估计结果(参数)保存在,tmp7,文件之中;,noint:,不带截距项回归;,by year indcode,:按年,-,行业分组进行回归;,计算,DA,的,SAS,程序,data tmp8;set tmp7;,ea1=a1;,ea2=delt_rev;,ea3=ppe_ta;,n=_p_+_edf_;,keep year indcode ea1 ea2 ea3 n _adjrsq_;,run;,data tmp8;set tmp8;,where n=5;run;
27、proc sort;by year indcode;run;,proc sort data=tmp6;by year indcode;run;,data tmp9;merge tmp6(in=a)tmp8;by year indcode;if a;run;,Tmp7,中,已经包括了各组各变量的回归系数,现在把这些估计的回归系数找出来,并存为,tmp8.,计算每组回归的样本数,因为样本数太少的回归是无效的回归。,把回归系数同各个公司各年的变量(,tmp4,)进行合并,通过相乘得到正常的应,计利润;,计算,DA,的,SAS,程序,Step5:,根据估计得到的系数计算修正的,Jones,的,DA,
28、data tmp10;set tmp9;,nda=ea1*a1+ea2*(delt_rev-delt_rec)+ea3*ppe_ta;,da_jones=acca-nda;,run;,data da_jones;set tmp10;,abs_da_jones=,abs,(da_jones);,keep stkcd year indcode da_jones abs_da_jones;,run;,proc sort;by stkcd year;run;,计算,DA,的,SAS,程序,Step6:,计算业绩调整的,DA,proc reg data=tmp6;,model acca=a1 del
29、t_rev ppe_ta roa/adjrsq;,by year indcode;,output out=tmp11 r=da_perf;,run;,output out:,把回归结果保存于,tmp11,中,,r,是回归残差的意思,r=da_perf,,即把回归残差命名为,da_perf,;,计算,DA,的,SAS,程序,data tmp11;set tmp11;,keep stkcd year indcode da_perf;,run;,proc means,noprint;,var,da_perf;,by,year indcode;,output out=tmp12(drop=_freq_
30、 _type_ where=(nx=5),n,=nx;run;,data tmp13;,merge,tmp12(in=a)tmp11;,by year indcode;,if a;,run;,proc sort;by stkcd year;run;,要求各年各行业的样本数至少不小于,5,n,是一个统计量,统计各组的观测值个数;,计算,DA,的,SAS,程序,Step 7,合并和保存两种,DA,:,data da;merge da_jones tmp13(drop=nx);,by stkcd year;,run;,Data dd.da;set da;run;,CAR,程序,在事件研究(,even
31、t study),中,计算累计非正常报酬(,CAR,)是个常见问题;,两种计算,CAR,的方法:,-,市场均值调整,事件日的个股回报减去当天的市场回报;,-,市场调整法,首先要估算个股的,Beta,系数,然后根据,CAMP,模型计算事件日的,CAR,;,-,参考文献,:Chen,Su and Zhao,2000,CAR;,CAR,程序,CAR,程序,假定我们已经有了计算,CAR,的两个数据集,一个是日个股回报数据,(RET),一个是个股年报宣告日数据(,Andate):,RET,数据集包括:,stkcd,:股票代码,Traddt,:股票交易日;,Raw_ret:,每只股票每个交易日的日个股回报
32、考虑,现金红利再投资的日个股回报率);,Market_ret,:每日的市场回报(,考虑现金红利再投,资的日市场回报率(流通市值加权平均法),),Andate,数据集包括:,stkcd,:股票代码,year:,年报年度;,annodt:,年报宣告日;,CAR,程序,任务:计算,2000,和,2001,年年报宣告日前后共,3,天的,CAR;,-,方法一:不使用宏,但需要每年计算一次;,-,方法二:使用宏,可以一次得到多年宣告日的,CAR,;,CAR,程序:不使用宏,以计算,2000,年年报宣告日前后,3,天的,CAR,为例,Step1:,导入数据并日期加工,libname cc H:sas;,d
33、ata ret;set cc.ret;,tr_date=substr(trddt,1,4)*10000,+substr(trddt,6,2)*100,+substr(trddt,9,2);,drop trddt;run;,data ret2000;set ret(where=(20000430tr_date20010530);,year=2000;run;,CAR,程序:不使用宏,data andate2000;set cc.andate(where=(year=2000);,an_date=substr(annodt,1,4)*10000+substr(annodt,6,2)*100+sub
34、str(annodt,9,2);,drop annodt;,run;,data tmp1;merge andate2000(in=a)ret2000;,by stkcd year;,if a;run;,data tmp2;set tmp1;,t=tr_date-an_date;,run;,合并交易数据和宣告日数据,CAR,程序:不使用宏,step 2:,确定个股年报宣告日之前计算,beta,的窗口,;,data tmp3;set tmp2;,where t0;,run;,proc rank,data=tmp3 out=tmp4,descending,;,var t;,ranks t1;,by
35、stkcd;,run;,data tmp5;set tmp4;,t1=-t1;,run;,确保交易日在宣告日之前,Proc rank:,排序命令;,Descending:,逆排序(从大到小),t1,都是正的,取负号,使其为负,以确定(,-150,,,-30,)窗口;,CAR,程序:不使用宏,step3:,使用(,-150,,,-30,)窗口计算,beta,系数,data tmp6;set tmp5(where=(-150=t1-30);,proc sort;by stkcd;run;,proc reg,noprint,outest,=beta2000;,model raw_ret=market
36、ret/adjrsq;,by stkcd;run;,data beta2000;set beta2000;,alpha=intercept;,beta=market_ret;,n=_p_+_edf_;,adjrsq=_adjrsq_;,keep stkcd alpha beta n adjrsq;run;,CAR,程序:不使用宏,step4:,计算(,-30,,,+30,)窗口中,每日的非正常报酬,*,-,在,tmp5,中,已经确定了宣告日之前的窗口,因此,-;,data pre;set tmp5(where=(-30=t1=0,;run;,proc rank,out=after;,var
37、t;,ranks t1;,by stkcd;run;,data after;set after;,t1=t1-1,;run;,data car;set pre after;,proc sort;by stkcd t1;run;,由于,t1,的最小值也是,1,,因此,在确定事件窗口,时,应该减去,1,,以确定,0,30,的窗口;,合并,-30,,,-1,和,0,+30,窗口,CAR,程序:不使用宏,step 5:,合并,CAR,和,beta2000,data car2000;merge car beta2000;,by stkcd;,run;,step 6:,计算(-30,30)每天的AR,da
38、ta car2000;set car2000;,ar=raw_ret-(alpha+beta*market_ret);,mr=raw_ret-market_ret;,run;,CAR,程序:不使用宏,step7:,计算,-1,,,+1,三天的,CAR,data tmp10;set car2000(where=(-1=t1=0;,run;,data uprt,CAR,:使用宏,*,-,计算宣告日之前的窗口,-;,proc rank data=tmp,var t;,ranks t1;,by stkcd;,where t0;,run;,data downrt,*-,纵向合并宣告日之前和之后的窗口,-
39、data art,proc sort;,by stkcd tr_date;,run;,CAR,:使用宏,*-,使用(,-150,,,-30,)窗口估计,beta-;,data es,proc reg,noprint,outest,=beta,model raw_ret=market_ret/adjrsq;,by stkcd;,run;,data abeta,alpha=intercept;,beta=market_ret;,n=_p_+_edf_;,adjrsq=_adjrsq_;,keep stkcd alpha beta n adjrsq;,proc sort;by stkcd;run
40、CAR,:使用宏,*-,确定(,-30,,,+30,)的窗口,-;,data aart,if-30=t1=30;,proc sort;by stkcd;run;,*-,合并,beta,系数,-;,data abr,by stkcd;,if a=1;run;,CAR,:使用宏,*-,计算每日的非正常报酬,-;,data abr,ur=raw_ret-(alpha+beta*market_ret);,mr=raw_ret-market_ret;,run;,%mend;,%abr1(2000);,%abr1(2001);,CAR,:使用宏,*-,把,2000,年和,2001,年的,AR,合并,-
41、data public;set abr2000 abr2001;run;,*-,计算各年,-1,,,+1,的,CAR-;,%macro,sumcar(yr);,data car,if year=,proc means data=car,var mr ur;,by stkcd;,output out=sumcar,data sumcar,year=,%mend;,%sumcar(2000);,%sumcar(2001);,data sumcar;set sumcar2000 sumcar2001;run;,RET,程序,在计算公司的股票业绩时,常用的一个变量时,RET,,即经市场调整后的、以
42、月度计算的股票年度回报率。,一种算法是从,5,月开始到第,2,年,4,月,作为计算,BHAR,的期间;,另一种算法是从,1,月开始到,12,月,作为计算,BHAR,的期间;,Ri,指考虑现金红利再投资的月个股回报率(,CSMAR:,考虑现金红利再投资的月个股回报率),,Rm,指月度市场回报率(,CSMAR:,考虑现金再投资的月市场回报率,(,流通市值加权平均法,),)。,RET,程序,连乘的基本算法:,由于,Logx+logy=logxy,因此,,xy=exp(logx+logy),;,假定我们已经有了,stockret,数据集,该数据包括了,A,股,1991,年,4,月到,2008,年,12
43、月的如下数据:股票代码(,stkcd),、交易月份(,trdmnt,)、月度个股回报(,raw_ret,)、月度市场回报(,market_ret),;,任务:计算,1991,年到,2008,年各年从,5,月到次年,4,月的,RET,:,-,由于没有,2009,年,1-4,月的交易数据,因此计算的,2008,年,RET,是不完整的,到时应该删除;,RET,程序,libname cc H:sas;,data tmp1;set cc.stockret;,month=substr(trdmnt,6,2)+0;,lgret=log(1+raw_ret);,lgmret=log(1+market_ret
44、);,if month=5 then year=substr(trdmnt,1,4)+0;,run;,proc sort;by stkcd year;run;,RET,程序,proc means,noprint;,var,lgret lgmret;,by,stkcd year;,output out=ret0504,sum,=tlgret tlgmret;run;,data ret0504;set ret0504;,ret0504_raw=exp(tlgret)-1;,ret0504_adj=exp(tlgret)-exp(tlgmret);,run;,data ret0504;set ret
45、0504(keep=stkcd year _freq_ ret0504_raw ret0504_adj);,where 1991year2008;,run;,RET,程序,练习:,自行计算,1992-2008,年从,1,月到,12,月计算的年度,RET,。,Proc SQL,Proc sql,是一个功能非常强大的多表操作模块;,-,能从多个数据集中按照制定的条件创建新的数据集;,-,比如,在,Francis et al.(2005,JAE,The market pricing of accruals quality),中,他们首先使用,DD,模型计算每年操控性应计利润的残差,DAC,,然后,使
46、用之前,5,年的,DAC,的标准差计算盈余质量(,Accruals quality,AQ,),;,如何解决这一标准差的计算问题?,-,题外话:为什么国内从来没有人使用多年,DAC,的标准差计算,AQ,?,Proc sql,基本结构,比如,希望从,tmp1,和,tmp2,中按照一定条件生成一张新表,tmp3,;,proc sql;,creat tmp3 as select distinct,a.var1,a.var2,b.var3,b.var4,from tmp1 as a,tmp2 as b,where,a.var1=b.var1 and,a.var2b.var2,order by var1
47、var2;quit;,Distinct,表示删除重复的观测值,可省略,Tmp3,的构成,指定,tmp1,为,a,tmp2,为,b,Where,:指定,tmp3,的生成条件;,Order by:,对,tmp3,排序,Proc SQL,假定现有有一个数据集,DAC,,包括了,1974-2004,年美国所有上市公司各年按,DD,模型计算的,DAC,,现在要使用之前,5,年的,DAC,的标准差来计算各年的,AQ;,解决思路:,-,得先构造一个数据集,在这个数据集中,应该这样排列:,00001 1999 DAC1995,00001 1999 DAC1996,00001 1999 DAC1997,0000
48、1 1999 DAC1998,00001 1999 DAC1999,-,然后,就可以使用,std,命令分组求标准差了;,Proc SQL,导入数据,libname x H:sas;,data dac1;set x.dac;run;,data dac2;set x.dac;run;,之所以倒两次,是因为等下一个要做基本数据,,一个是要把之前年度的数据添加过去;,Proc SQL,proc sql;,create table AQ(where=(1970=year=2004)as select,distinct,put(b.gvkey,6.0)|.|put(b.year,4.0)as comb,n
49、a.dac)as dum,b.gvkey,b.fyenddt,b.year,std(a.dac)as aq,from dac1 as a,dac2 as b,where,a.gvkey=b.gvkey and,0=b.year-a.year=4,group by comb,having dum=5,order by gvkey,fyenddt,year;quit;,下面是逐条分解说明:,put(b.gvkey,6.0)|.|put(b.year,4.0)as comb,put sth as sth,,是指将某变量输出存为另一变量;,put(b.gvkey,6.0,)是指:输出表,b,中列变量
50、gvkey,,输出格式为,6,位,不带小数点,假定,1997,年的公司代码是,3978,,则,put(b.gvkey,6.0)|“.”|put(b.year,4.0)as comb,comb,的数值为,3978.1997,;,|,连接两个字符值,),n(a.dac)as dum,b.gvkey,b.fyenddt,b.year,这里,,n(a.dac),是指对数据表,a,中的,dac,个数;,std(a.dac)as aq,这里,对数据表求标准差,存为,aq,from dac1 as a,dac2 as b,dac1,作为,a,dac2,作为,b,where,a.gvkey=b.gvkey






