我的第一次SAS编程

时间:2022-02-04 19:23:06

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