我的第一次SAS编程

来源:互联网 发布:代理服务器ip和端口 编辑:程序博客网 时间:2024/05/01 12:25

数据分析与SAS课程结课作业要写一个数据分析报告,哎,平时没怎么努力,上课也没听见,到了期末的时候就痛苦了。

不过还好,折腾了两天,看了一本书,上网搜资料,总算是接触了一门全新的课程,我费了好大力气,总算是把SAS程序给做出来了~

本次数据分析做的是时间序列分解预测~

libname mylib "d:\sas\fx";run;/*****************************************************//*一、读取数据                                       *//*    从Excel中读取农业总产值表                        *//*    数据包括2003~2011年1、2、3季度全国农业总产值     *//*    以及农产品指数(去年同期=100)                   *//*    总产值单位:亿元                                 *//*****************************************************/PROC IMPORT OUT= mylib.T01 /*总产值表(单位:亿元)*/            DATAFILE= "D:\sas\nyzcz.xls"             DBMS=EXCEL             REPLACE;     SHEET="Sheet1{1}quot;;      GETNAMES=yes;     MIXED=NO;     SCANTEXT=yes;     USEDATE=YES;     SCANTIME=YES;    RUN;proc sort data=mylib.T01;    by nf jd;/*****************************************************//*二、计算相对总产值                                 *//*    由总产值和价格指数计算相对价格指数,以消除价格   *//*    变动对实际农业产出的影响                         *//*    具体做法:将所有总产值转换到以2003年为基准的     *//*    水平,即有总产值除以价格指数(累乘)     *//*****************************************************/data mylib.T02; /*相对产值表*/    set mylib.T01;    where t^=.;/*过滤空行*/proc sort data=mylib.T02;    by jd t;data mylib.T02;     set mylib.T02;                  /* 计算累计价格指数*/    retain  ljjgzs ;            /* 记住: retain 非常实用 */        if first.jd then ljjgzs=jgzs;        else ljjgzs=ljjgzs*jgzs/100;    by jd;    /*计算相对2003年的产值*/    xdcz=nyzcz*100/ljjgzs;run;/*****************************************************//*三、中心化移动平均及季节指数                       *//*    先将相对产值进行3周期移动平均,然后对移        *//*    动平均结果再进行2项移动平均,得到中心化        *//*    移动平均值(CMA),用相对产值除以CMA得到        *//*    季节指数                                       *//*****************************************************/proc sort data=mylib.T02;    by t;data mylib.T02;        /*相对产值:计算移动平均及季节指数*/    set mylib.T02;    ydpj=(xdcz+lag1(xdcz)+lag2(xdcz))/3;    cma=(ydpj+lag(ydpj))/2;         /* SAS中lag函数、diff函数很有用,有记忆功能 */    jjzs=xdcz/cma;    label        rq='日期'        nf='年份'         jd='季度'         t='时间编号'     nyzcz='农业总产值'       jgzs='价格指数'    ljjgzs='累计价格指数'      xdcz='相对产值'      ydpj='3周期移动平均'       cma='中心化cma'      jjzs='季节指数';run;/*****************************************************/proc print data=mylib.T02;    title "相对2003年总产值/亿元";run;title '';/*****************************************************//*四、计算季节指数平均值                             *//*    按季度分组计算季节指数平均值,并将加过         *//*    保存在数据表中                                 *//*****************************************************/proc sql;     /* 可以这么说吧,SQL知识学好了对SAS有莫大的帮助,SAS中很大部分是对表格的操作*/    create table mylib.T03 as         select jd,avg(jjzs) as jjpjzs                 from mylib.T02 group by jd;      data mylib.T03; /* 季节指数平均值表    */    set mylib.T03;    label jjpjzs='季节平均指数';    run;/*****************************************************//*五、回归分析                                       *//*    对表T02中变量cma、t进行线性回归分析            *//*    并保存结果                                     *//*****************************************************/data temp;    set mylib.T02;    keep t cma;title "";proc reg data=temp;    var cma t;    model cma=t;    output out=mylib.T04           p=yccma;/*保存预测值*/    title "线性回归";  plot cma*t; data mylib.T04;    set mylib.T04;    label yccma='预测值cma';run;/*****************************************************//*六、由预测cma计算预测相对产值                      *//*    预测相对产值=预测cma * 季节指数                *//*    缺失季节指数按照平均季节指数计算               *//*****************************************************/data mylib.T05;    merge mylib.T02 mylib.T04;    keep nf jd t xdcz jjzs cma yccma;    /*缺失值处理:用季节指数均值代替缺失值*/data temp1;    set mylib.T05;    where jjzs=.;data temp2;    set mylib.T05;    where jjzs^=.;proc sql ;    update temp1 set jjzs=        (select jjpjzs from mylib.T03                where jd=temp1.jd);data mylib.T05;    set temp1 temp2;proc sort data=mylib.T05;    by t;/*计算:相对产值预计值以及误差*/data mylib.T05;    set mylib.T05;    ycxdz=yccma*jjzs;    wc=xdcz-ycxdz;    wcp=abs(wc)*100/xdcz;    label ycxdz='预测相对值'             wc='误差'            wcp='误差百分比';title "";proc print data=mylib.T05;    title "预计值";run;/*绘制实际值和预测值折线图*/title "";proc gplot data=mylib.T05;    title "实际值和预测值比较";    symbol1 color=black i=join v=star line=1;    symbol2 color=blue i=join v=star line=2;    plot xdcz*t=1 ycxdz*t=2 / overlay; /* overlay将几个系列绘制在一张图上*/run;quit;