SS综合练习题答案.docx
《SS综合练习题答案.docx》由会员分享,可在线阅读,更多相关《SS综合练习题答案.docx(72页珍藏版)》请在冰点文库上搜索。
SS综合练习题答案
SAS金融数据处理综合练习题
1.创建一包含10000个变量(X1-X10000),100个观测值的SAS数据集。
分别用DATA步,DATA步数组语句和IML过程实现。
(1)用data步实现
datatest1a;
informatx1-x100009.2;/*创建100个变量,规定输出格*/
doi=1to100;/*做循环*/
output;/*每一次循环,输出所有的变量,包括i*/
dropi;/*去掉i*/
end;
run;
或者
datatest1a;
formatx1-x10000best12.;/*创建10000个变量x1-x10000,但未有初始化*/
doi=1to100;/*创建100个观测*/
output;/*且每一个观测都输出到数据集test1a*/
end;
dropi;
run;
(2)用data步数组语句实现
datatest1b;
arrayt{10000}x1-x10000;/*创建数组变量*/
doi=1to100;/*每个变量有100个观测*/
output;/*每一次循环,输出所有的变量,包括i*/
dropi;/*去掉i*/
end;/*循环结束*/
datatest1c;
arrayt{10000}x1-x10000;
doj=1to100;/*100次观测的循环*/
doi=1to10000;
t{i}=i;/*第i个变量等于i*/
end;
output;/*输出第i次观测的i个变量的值*/
end;
dropij;/*去掉i和j*/
run;
或者
datatest1b;
arrayt{10000}x1-x10000;
doj=1to100;/*100次观测的循环*/
doi=1to10000;
t{i}=i;/*第i个变量等于i*/
end;
output;/*输出第i次观测的i个变量的值*/
end;
dropij;/*去掉i和j*/
run;
(3)用IML过程实现
prociml;/*启用iml环境*/
x='x1':
'x10000';/*定义数组x1-x10000*/
t=j(100,10000,1);/*创建100行10000列的.同元素矩阵*/
printtx;/*打印两个矩阵察看*/
createtest1dfromt[colname=x];/*创建数据集c,变量数为列数,观测数为行数,列名更改为变量名,默认逻辑库为临时*/
appendfromt;/*将t中的值填充的数据集中*/
showdatasets;
showcontents;/*显示数据集的一些7788的属性*/
closetest1d;
run;
quit;
或者
prociml;
x='x1':
'x10000';
t=shape(1,100,10000);/*shape和j不太一样,顺序是元素,行,列,j的顺序为行,列,元素*/
printtx;
createtest1dfromt[colname=x];
appendfromt;
showdatasets;
showcontents;
closetest1d;
run;
quit;
(4)用宏实现
%macronames(name,number,obs);
dataa;
%doi=1%to&obs;
%don=1%to&number;
&name&n=1;
%end;
output;
%end;
run;
%mendnames;
%names(x,10000,100);
2.多种方法创建包含变量X的10000个观测值的SAS数据集。
3.数据集A中日期变量DATE包含有缺失值,创建包含日期变量DATE的数据集B,并填充开始到结束日之间的所有日期值。
prociml;/*启用iml环境*/
x={'date'price};/*注意所用的括号类型*/
t={11112,23412,21323,12345,123456,34566,67534,23457,21349};
printt;/*构造9行2列的向量*/
t[1,1]=.;
t[2,1]=.;
t[5,1]=.;
t[9,1]=.;/*令某些date的观测成为缺失值,包括第一个观测值*/
createafromt[colname=x];/*从矩阵构造数据集a,为变量命名date和price*/
appendfromt;/*填充矩阵已有的观测值*/
showdatasets;
showcontents;/*显示一些信息,可省略*/
closea;
run;
quit;/*退出iml环境*/
dataa;
seta;
formatdateyymmdd8.2;/*将数值型的改变为日期型的输出变量*/
run;
dataa1;
seta;
n=_n_;/*取出观测号,以方便进行排序*/
formatdateyymmdd8.2;
retaintemp;/*设定一个变量temp,规定如果没有新的观测读入,不清空原值,保留原来的观测值*/
ifdate^=.thentemp=date;/*如果读入的date的观测值不为空*/
elsedate=temp;
run;/*至此数据集填充了后面的部分,最之前的缺失值未能填充,后面将数据集逆序排列进行填充*/
dataa2;
n=_n_;/*创建数据集c,取出c的观测号,以方便进行逆向排序*/
seta1;
run;
procsortdata=a2;
bydescendingn;/*将c逆向排序*/
run;
dataa3;/*定义数据集d,填充数据集d的末尾的观测*/
seta2;
dropntemp;
run;
dataa4;
seta3;
retaintemp;
ifdate^=.thentemp=date;
elsedate=temp;
run;
dataa4;
n=_n_;
seta4;
run;
procsortdata=a4out=b(drop=ntemp);
bydescendingn;/*定义数据集e,将d中的观测最一次逆序,得到原序*/
run;
以下是助教的做法但是无法运行成功
procsortdata=a;
bydate;
datab(drop=date);
setaend=end;
bydate;
retainstart;
if_n_=1thenstart=date;
if_n_=endthendo;
last=date;
output;
end;
run;
datab(keep=date);
informatdateyymmdd10.;
formatdateyymmdd10.;
setb;
dodate=starttolast;
output;
end;
run;
4.创建包含日期变量DATE的SAS数据集,日期值从1900年1月1日到2000年1月1日。
datatest4a;
informatdate9.2xy;
formatdateyymmdd10.2;/*规定输出格式*/
x=mdy('1','1','1900');/*返回sas日期值,即以1960/1/1为0的日期值*/
y=mdy('1','1','2000');
doi=xtoy;
date=i;
output;
end;
dropixy;
run;
或者
datatest4b;
dodate='1jan1900'dto'1jan2000'd;
output;
end;
formatdateyymmdd10.;
run;
5.利用随机数函数RANUNI对某数据集设计返回抽样方案。
datasample(drop=samplesizen);
samplesize=5;/*样本容量为5*/
don=1tosamplesize;/*从1到样本容量的循环*/
readit=ceil(ranuni(0)*totobs);
putreadit=;
setresdat.classpoint=readitnobs=totobs;
output;
end;
stop;
run;
或者
datadat1;
setresdat.class;
keepname;
run;
%macrosample(i);
datadat2;
setdat1nobs=nobs;
ran=ceil(nobs*ranuni(&i));
run;
procsortdata=dat2;
byran;
run;
%mendsample(i);
%sample
(2);
datadat3;
setdat2;
if_n_<=6;
run;
%sample(3);
datadat4;
setdat2;
if_n_<=6;
run;
%sample(5);
datadat5;
setdat2;
if_n_<=6;
%sample(30);
datadat6;
setdat2;
if_n_<=6;
run;
dataa;
setdat3dat4dat5dat6;
run;
或者
dataa;
setresdat.class;
keepname;
run;
datab;
setanobs=nobs;
ran=ceil(nobs*ranuni(2007));
run;
procsortdata=b;
byran;
datac;
setb;
if_n_<=5;
run;
6.利用随机数函数RANUNI对某数据集设计不返回抽样方案。
dataa;
setresdat.class;
keepname;
run;
datab;
setanobs=nobs;
ran=ceil(nobs*ranuni
(1));
putran=;
run;
procsortdata=b;
byran;
datac;
setb;
if_n_<=15;
run;
或者
dataa;
setresdat.class;
keepname;
run;
datab;
setanobs=nobs;
ran=ceil(nobs*ranuni(2007));
run;
procsortdata=b;
byran;
datac;
setb;
ifran=lag(ran)thendelete;
run;
datad;
setc;
if_n_<=15;
run;
7.计算数据集A中变量X的累乘。
prociml;
x='x';
m=do(1,10,0.5);
t=t(m);
printmt;
createafromt[colname=x];
appendfromt;
quit;/*用IML生成数据集a*/
datab;
seta;
retainy1;
y=y*x;
run;
或者
dataa;
inputx;
y=y*x;
retainy1;
cards;
1
2
3
4
;
run;
8.如何改变一个SAS数据集的变量顺序?
dataa(keep=name)b(keep=age)c(keep=weight)d(keep=height);
setresdat.class;
run;
datatest8a;
mergebdca;
run;
或者
datatest8b;
formatheightweightagename;
setresdat.class;
run;
9.数据集A和B包含同样两变量DATE和PRICE,以DATE为标识变量合并数据集A和B为C。
合并时应该注意什么?
在合并前必须先排序,并且mergeab;bydate;与mergeba;bydate;结果不一样。
procsortdata=a;
bydate;
run;
procsortdata=b;
bydate;
run;
datac;
mergeab;
bydate;
run;
10.给下段程序的主要语句加注释。
STOP语句能否删除?
为什么?
dataa;/*创建数据集a*/
doobsnum=1tolastby20;/*做循环,从第一个观测到最后一个观测数,间隔20*/
setResDat.stk000001point=obsnumnobs=last;/*指针选项和观测总数选项*/
output;/*强制输出当前值,否则只会在最后输出现值*/
end;/*命令选换结束*/
stop;/*强制结束数据步,因为set语句在数据步程序中会反复执行数据步的程序直到遇到文件结束(最后一跳观测)的标志,这里使用了指针选项可能碰不到这种标志,所以要用stop,否则就有可能无休止地执行下去*/
run;
11.假设数据集A中的变量logdate为如下形式的字符格式:
1998-12-2
1999-8-6
1999-8-10
将其转换为日期格式变量date。
如果字符格式的数据为:
19981202
19990806
19990810
又怎样转换为日期格式变量。
dataa;
inputlogdate$10.;
cards;
1998-12-2
1999-8-6
1999-8-10
;
run;
datab;
seta(rename=(logdate=date));
date=input(date,yymmdd10.);
labeldate='日期';
run;
或者
dataa;
inputlogdate$9.;
cards;
1998-12-2
1999-8-6
1999-8-10
;
run;
datab;
formatdateyymmdd10.;/*规定输出格式*/
seta;
date=input(logdate,yymmdd10.);/*转变格式*/
droplogdate;
run;
12.运行SAS程序过程中,SAS系统创建的自动变量是否包含在创建的数据集?
一般情况下,怎样查看系统自动变量的值?
自动变量是由数据步语句自动创建的,这些自动变量不输出到数据集中,在重复过程中被保留。
dataa;
setresdat.class;
put_n__error_;
keep_numeric_;
run;
13.SAS系统显示表达式、函数、数据集、数组或矩阵的具体值时,常需要哪些语句和过程?
put;procprint;print;show;list;
14.写出下面各段程序创建数据集的所有观测值,并指出PUT语句分别在LOG窗口输出什么结果?
dataa1;
n=6
don=1to5;
output;
end;
putn=;
run;
数据集a1中有一个变量n,5个观测值为1-5,日志窗口输出n=6;
dataa1;
don=1to5;
n=1n=2n=3n=4n=5n=6
output;
putn=;
end;
putn=;
run;
数据集中有一个变量n,5个观测为1-5,日志窗口输出n=1-n=6
dataa1;
n=1n=2n=3n=4n=5n=6
don=1to5;
putn=;
end;
putn=;
run;
数据集中有一个变量n,只有一个观测值6,日志窗口输出n=1-n=6
dataa1;
n=6
don=1to5;
end;
putn=;
run;
数据集中有一个变量n,只有一个观测值6,日志窗口输出n=6
dataa2;
n=1;
n=5
dountil(n>=5);
n+1;
output;
end;
putn=;
run;
数据集中有一个变量,4个观测,n=2-n=5,日志窗口输出n=5
dataa3;
n=1;
n=5
dowhile(n<5);
n+1;
output;
end;
putn=;
run;
同上一题一样的情况,数据集中有一个变量,4个观测,n=2-n=5,日志窗口输出n=5
dataa4;
n=7;
n=8
dountil(n>=5);
n+1;
output;
end;
putn=;
run;
数据集中有一个观测,n=8,日志窗口n=8。
因为执行了一次数据步
dataa5;
n=7;
n=7
dowhile(n<5);
n+1;
output;
end;
putn=;
run;
数据集中一个变量n,没有观测,日志窗口n=7
15.数据集A有一个变量n,5个观测值1,2,3,4,5。
数据A1由下面程序2产生,同样有一个变量n,5个观测值1,2,3,4,5。
试分析下面两段程序中,PUT语句在Log窗口输出结果的差异,为什么?
程序1:
Dataa;
Seta;
Putn=;
Run;
在日志窗口中输出n=1-n=5
程序2:
dataa1;
don=1to5;
output;
end;
putn=;
run;
在日志窗口中输出n=6
理解了set语句就不难得到这个结果。
dataa;
don=1to5;
output;
end;
run;
Dataa;
Seta;
Putn=;
Run;
dataa1;
don=1to5;
output;
end;
putn=;
run;
16.试由以下的9种德国马克对美元汇率看跌期权和9种英镑对美元汇率的看跌期权产生81种组合。
一年期,DM/USD汇率的9种不同看跌期权的执行价格和成本
执行价格Kdm
成本Cdm
0.66
0.085855
0.65
0.032191
0.64
0.020795
0.63
0.017001
0.62
0.013711
0.61
0.010851
0.60
0.008388
0.59
0.006291
0.55
0.001401
一年期,BP/USD汇率的9种不同看跌期权的执行价格和成本
执行价格Kbp
成本Cbp
1.30
0.137213
1.25
0.082645
1.20
0.045060
1.15
0.028348
1.10
0.016146
1.05
0.007860
1.00
0.003277
0.95
0.001134
0.90
0.000245
创建样本数据集:
datadm;
inputKdmCdm;
cards;
0.660.085855
0.650.032191
0.640.020795
0.630.017001
0.620.013711
0.610.010851
0.600.008388
0.590.006291
0.550.001401
;
run;
databp;
inputKbpCbp;
cards;
1.300.137213
1.250.082645
1.200.045060
1.150.028348
1.100.016146
1.050.007860
1.000.003277
0.950.001134
0.900.000245
;
run;
解答:
datatest16a;
setdm;/*依次读入数据集dm中的第1至9个观测*/
doj=1to9;
setbppoint=j;/*在读入dm的第i个观测后,依次读入bp中的所有观测*/
output;
end;
run;
或者
datatest16b;
doi=1to9;
setdmpoint=i;/*依次读入数据集dm中的第1至9个观测*/
doj=1to9;
setbppoint=j;/*在读入dm的第i个观测后,依次读入bp中的所有观测*/
output;
end;
end;
stop;
run;
17.不用SAS函数,用宏%a(n,p)计算二项分布的概率分布和累计概率(k=1,2……,n)。
。
(此处留有空白)
18.创建组标识变量GROUP,将数据集A中的观测等分为10组,观测值不能整除10时,前余数组各多加一个观测值。
dataa;
n=_n_;
retaingroupid0;
settestnobs=totobs;/*选项nobs观测的总数,赋值给totobs*/
x=mod(totobs,10);/*观测个数除以10的余数*/
y=int(totobs/10);/*观测个数除以10的整数*/
run;
dataa;
setanobs=totobs;
if(n>0andn=<(y+1)*x)then
groupid=int((n-1)/(y+1))+1;/*前x组的号码*/
else
groupid=int((n-x-1)/y)+1;/*不多元素的组号*/
dropxy;
run;
19.现有一个数据流:
a2b3cd46,按下面要求创建SAS数据集。
用语句inputid$no;变量id取值上面数据流里的a,b,c,d,变量no取值2,3,4,6。
但是这个数据流存在问题:
如有的id没有no,有的no没有id。
创建SAS数据集,删除只有id没有no或者只有no没有id的观测,即把上面的c和6去掉,最后得到三个观测,a2,b3与d4。
datab;
inputno$@@;
id=lag(no);
cards;
a2b3cd46
;
run;
datad;
formatid$8.no$8.;
setb;
if'a'<=no<='z'or'1'<=id<='9'thenlostcard;
run;
或者
dataa;
inputt$@@;/*指针*/
cards;
a2b3cd46
;
dataa;
seta;retain;
if'a'<=lowcase(t)<='z'thenid=t;/*如果是字符串,则用专门的函数判断*/
elsedo;
no=