我的第一次SAS编程

数据分析与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;


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值