SAS IML交互式矩阵语言模块原理与实现.docx
- 文档编号:5427063
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:25
- 大小:89.23KB
SAS IML交互式矩阵语言模块原理与实现.docx
《SAS IML交互式矩阵语言模块原理与实现.docx》由会员分享,可在线阅读,更多相关《SAS IML交互式矩阵语言模块原理与实现.docx(25页珍藏版)》请在冰豆网上搜索。
SASIML交互式矩阵语言模块原理与实现
SAS/IML
交互式矩阵语言
模块
版权:
桂林电子科技大学
数学与计算科学学院
创新基地统计部
2011-10-18
SAS/IML模块与矩阵运算语言
我们的学习目的:
1.了解SAS/IML模块的功能和特点;
2.掌握SAS/IML语言建立矩阵变量及矩阵的运算;
3.掌握IML常用函数的调用;
4.掌握自定义函数与过程的定义与调用;
1、SAS/IML模块
1.1SAS/IML模块简介
IML是InteractiveMatrixLanguage的缩写,即交互式矩阵语言,也是一种程序设计语言,它提供了条件转移、循环等流程控制语句,还提供了用户自定义函数和子程序的功能,它是用户研究新算法或解决系统中没有现成方法可用的问题的工具。
1.2IML变量
IML的基本数据元素是一个矩阵,最小为1×1阶矩阵。
矩阵元素可为数据型,也可为字符型,缺失值用“.”表示。
多维矩阵每一行的元素个数必须相同。
(1)数值型矩阵中元素可以是整数、小数,也可用科学计数法表示。
(2)字符型矩阵中,若元素中含有空格或某些特殊字符,如“?
”、“=”、“*”、“:
”等,则须将字符串用单引号或双引号括起来。
在同一个字符型矩阵中,每一个元素的字符串长度不必相等,但存储的长度最大不超过32676.
(3)IML变量的取名规则:
①.可由下划线,字母和数字组成,但不能以数字开头。
②.不可超过32个字符
③.不区分大小写
1.3启动和退出SAS/IML模块
启动语句为:
ProcIML;
退出语句为:
Quit;
1.4设置和关闭IML交互模型
⑴设置交互模式
SAS/IML模块提供了一个交互式环境,在此环境下,用户按照输入IML语句,然后系统将交互地输出每一执行语句的计算结果而不需额外使用输出语句,这在调试程序时非常有用。
使用这一功能前需将交互模型状态打开,设置交互模型的语句为:
Resetprint;
2关闭交互模式
如果不需要一些中间计算结果,则应将IML交互模型关闭,使得程序输出比较简洁。
关闭交互模型的语句为
ResetNoPrint;
2.矩阵变量的建立
2.1一般方式建立矩阵
格式:
矩阵变量名=矩阵初值;
(1)定义1×1阶矩阵(标量)
如a1=12;
a2=.;
a3='Hello';
printa1a2a3;/*输出矩阵*/
(2)定义行向量
如b1={12345};
b2={abCDDEF};
b3={'adCD'DEF};/*比较b2与b3的结果*/
(3)定义列向量
如c1={1,2,3};
(4)定义2×3阶矩阵
如c2={123,456};
详细见程序如下:
prociml;
resetprint;
/*定义1×1阶矩阵(标量)*/
a1=12;
a2=.;
a3='Hello';
/*定义行向量*/
b1={12345};
b2={abCDDEF};
b3={'adCD'DEF};/*比较b2与b3的结果*/
/*定义列向量*/
c1={1,2,3};
/*定义2×3阶矩阵*/
c2={123,456};
quit;
run;
输出结果如下图所示:
2.2通过赋值建立矩阵变量
格式:
矩阵变量名=IML表达式;
如:
X={1,2,3};
Y={3,2,1};
Z=X+Y;
2.3行向量的特殊产生方式
格式1:
矩阵变量名=起始值:
结束值;
说明:
矩阵的第一个元素值为起始值,起始值小于结束值时,矩阵元素依次增加1,直到最后一个元素的值小于等于结束值,反之依次减少1,直到最后一个元素的值大于等于结束值
格式2:
矩阵变量名=do(起始值,结束值,步长);
程序如下:
prociml;
resetprint;
i=1:
10;
i=10:
1;
i=do(1.1,10,2);
i=do(10,0,-2);
quit;
run;
输出结果如下图:
3.矩阵运算
3.1矩阵的算术运算
除以通常意义下的矩阵相加、减和乘运算外,SAS/IML还定义了矩阵的除、乘方、对应元素相乘、对应元素乘方等算术运算。
详见下表(A、B为矩阵,C为向量,k为实数)
运算表达式
含义
加法
A+B
A+k
矩阵A中元素与矩阵B中元素对应相加
矩阵A中元素都加上数k
减法
A-B
A-k
矩阵A中元素与矩阵B中元素对应相减
矩阵A中元素都减去数k
乘法
A*B
A*k
矩阵A乘矩阵B
矩阵A中元素都乘以实数k
除法
A/B
A/k
矩阵A中元素与矩阵B中元素对应相除
矩阵A中元素都除以数k
乘方
A**k
A**(-1)
矩阵A的k次幂,即为k个矩阵A相乘(幂次k为大于等于-1的整数,若非整数将自动取整
求A的逆矩阵
对应元素元素相乘
A#B
A#C
A#k
矩阵A中元素与矩阵B中元素对应相乘
矩阵A中每一行或每一列中的元素与向量C中元素对应相乘(注:
向量C可为行向量也可为列向量)
矩阵A中元素都乘以数k
对应元素元素乘方
A##B
A##k
矩阵A中元素为底,矩阵B中元素为指数作乘方运算
矩阵A中元素为底,数k为指数作乘方运算
元素取相反数
-A
将矩阵A中元素均取相反数
矩阵的基本运算程序如下:
prociml;
resetprint;
A={12,34};
B={43,21};
C=A+B;
D=A+2;
e=A/B;
f=A/2;
g=A**2;
h=A**(-1);
j=A#B;
m=A#2;
n=A##B;
o=A##2;
quit;
run;
输出结果如下图:
3.2矩阵的比较运算
矩阵的比较运算是指比较矩阵相应元素大小关系,结果产生一个与相比较矩阵同阶的矩阵。
若比较关系成立,则结果矩阵中的相应元素为1,否则为0。
运算表达式
含义
A>B
大于
A
小于
A>=B
大于等于
A<=B
小于等于
A=B
等于
A^=B
不等于
注:
上述矩阵A和B中某一个可用一实数代替,此时将另一矩阵的每一个元素与此数值进行比较。
详见程序如下。
prociml;
resetprint;
A={137,642};
B={082,413};
C=A>B;
D=a>2;
quit;
输出结果如下图:
3.3矩阵的合并与拆分
将两个满足一定条件的矩阵按照一定规则合成一个矩阵的过程为矩阵的合并,矩阵合并有水平合并与垂直合并之分。
从一个矩阵中分出一个阶数较小的矩阵的过程称为矩阵的拆分。
运算表达式
含义
A||B
将矩阵A中的每行元素分别接在矩阵B中相应行的右边,结果矩阵的行数与A,B相同
A//B
将矩阵A中的每列元素分别接在矩阵B中相应列的下边,结果矩阵的列数与A,B相同
A[i,j]
矩阵A的第i行第j列的元素
A[i,]
矩阵A的第i行所有元素
A[,j]
矩阵A的第j列所有元素
A[c1:
c2,d1:
d2]
矩阵A的第c1行到第c2行和第d1列到第d2列的所有元素
A[+,]
矩阵A的各列元素之和所形成的行向量
A[,+]
矩阵A的各列元素之和所形成的列向量
详见程序如下。
prociml;
resetprint;
A={111;777};
B={000;888};
C=A||B;
D=A//B;
x={111213,212233};
E=x[1,2];
F=x[+,];
G=x[,+];
quit;
run;
输出结果如下图所示:
3.4其它常用矩阵运算
运算表达式
含义
I(n)
产生一个n阶单位阵
J(m,n,k)
产生一个元素全为k的m×n阶矩阵
Diag(C)
以向量C的各元素为主对角线元素(顺序不变)的对角矩阵
Trace(A)
矩阵A的迹(主对角线元素之和)
Inv(A)或A**(-1)
矩阵A的逆矩阵,即A-1
T(A)或A`
矩阵A的转置(`为右斜撇,一般为键盘的左上方)
Det(A)
矩阵A的行列式值
Eigval(A)
矩阵A的全部特征值
Eigvec(A)
矩阵A的每个特征向量为列所形成的矩阵(单位化)
例详见程序如下。
prociml;
resetprint;
A1=i(3);
A2=j(2,3,2);
C={123456};
A3=diag(C);
A={1-1,24};
B1=trace(A);
B2=inv(A);
B3=det(A);
B4=A`;
B5=eigval(A);
B6=eigvec(A);
quit;
run;
4.矩阵函数
4.1常用数学函数
函数名
功能含义
Abs(A)
将矩阵A中的每个元素取绝对值
Exp(A)
以自然数e为底,将矩阵A中的每个元素作为指数,构造同阶矩阵
Int(A)
将矩阵A中的每个元素取整数
Log(A)
将矩阵A中的每个元素取对数
Max(A)
将矩阵A中的每个元素取最大值
Min(A)
将矩阵A中的每个元素取小值
Sqrt(A)
将矩阵A中的每个元素开平方
Sum(A1,A2,….)
将矩阵A1,A2,..中所有矩阵的所有元素求和,自变量矩阵最多为15个,如果有缺失将忽略它们。
4.2常用概率统计函数
函数名
功能含义
SSQ(A1,A2,….)
求矩阵A1,A2,..中所有矩阵的所有元素的平方和,自变量矩阵最多为15个。
CuSum(A)
产生一个与自变量矩阵A同阶的矩阵,其元素为A中元素的累积和(按行为从左到右,再从上到下)
ProbNorm(x)
计算标准正态分布的分布函数在x处的值,x为数值型变量
Probit(p)
计算标准正态分布的p分位数,0
ProbChi(x,df<,nc>)
计算自由度为df的
分布的分布函数在x处的值。
当非中心参数nc=0或缺省时,即为中心分布的
分布。
Cinv(p,df<,nc>)
计算自由度为df的
分布的p分位数,0≤p<1,非中心参数nc≥0.
ProbT(x,df<,nc>)
计算自由度为df的T分布的分布函数在x处的值。
当非中心参数nc=0或缺省时,即为中心分布的T分布。
Tinv(p,df<,nc>)
计算自由度为df的T分布的p分位数,0
ProbF(x,df1,ddf2<,nc>)
计算分子、分母自由度为分别为df1和df2的F分布的分布函数在x处的值。
当非中心参数nc=0或缺省时,即为中心分布的T分布。
Finv(p,df1,ddf2<,nc>)
计算分子、分母自由度为分别为df1和df2的F分布的p分位数,0≤p<1,非中心参数nc≥0.
RanNor(seed)
产生标准正态分布随机数。
种子seed可是一个整数或一个矩阵,元素值小于231-1,seed≤0时将用系统时间作为初始化的种子。
若seed为矩阵,则函数值为与seed同阶的矩阵。
Uniform(seed)
产生(0,1)上均匀分布随机数。
种子seed可是一个整数或一个矩阵,元素值小于231-1,seed≤0时将用系统时间作为初始化的种子。
若seed为矩阵,则函数值为与seed同阶的矩阵。
注:
其功能等价于数据步中的ranuni()函数。
应用举例如下:
prociml;
resetprint;
x={01};
y={0.5};
a=ssq(x,y);
b1=cusum({1234});
b2=cusum({56,34});
c1=Probnorm(x);
c2=probit(y);
d1=probT(x,100);
d2=Tinv(y,100);
e1=10+2*rannor(x);
quit;
run;
5.IML语句
与SAS语句相同,类似于C语言,每一IML语句以“;”结尾,但不区分大小写。
5.1循环语句
1)计数型循环
格式:
Do循环变量=初值to终值[By步长];
循环体;
End;
例如:
doi=1to5by2;
Print‘ThevalueofIis:
’I;
End;
2).直到型循环
格式:
DoUntil(表达式);
循环体;
End;
3).当型循环
格式:
DoWhile(表达式);
循环体;
End;
应用举例如下:
prociml;
doi=1to5by2;
print'ThevalueofIis:
'I;
end;
quit;
prociml;
x=1;
dountil(x>100);
x=x+1;
end;
printx;
quit;
prociml;
x={123};
ifmax(z)<2thenp=0;
elsep=1;
printp;
quit;
run;
5.2条件判断语句
格式:
If表达式then语句1;
Else语句2;
5.3退出语句
格式:
Quit;
执行此语句退出IML模块。
5.4返回语句
格式:
Return(表达式);
执行此语句后,将计算表达式的值并返回此值。
此语句常用于自定义过程或函数中。
5.5过程(子程序)调用语句
格式:
Run过程名(变量列表);
6.IML自定义函数和过程
6.1自定义一般格式
START过程名或函数名[(形式变量列表)][Global(全局变量列表)];
函数或过程中语句;
Finish[过程名];
6.2自定义过程示例
/*定义一个名为mymod的过程,其功能是计算a*x+b,其中a和b为形势变量,x是全局变量,最终结果通过全局变量y带出来*/
prociml;
x={3};
startmymod(a,b)global(x,y);
y=a*x+b;
finish;
runmymod(1,2);
printy;
quit;
run;
6.3自定义函数示例
startLSE(x,y);
b=inv(x`*x)*x`*y;
return(b);
finish;
上述例子定义了一个名为LSE的函数,其功能是计算y关于x的线性回归方程系数的最小二乘估计,结果以函数值的形式返回。
6.4线性回归IML模块程序
线性回归IML模块程序
prociml;
x={111,
124,
139,
1416,
1525};
y={1,5,9,23,36};
b=inv(t(x)*x)*t(x)*y;
yhat=x*b;
r=y-yhat;
sse=ssq(r);
dfe=nrow(x)-ncol(x);
mse=sse/dfe;
startregress;/*定义模块开始*/
xpxi=inv(t(x)*x);/*矩阵X'X的逆*/
beta=xpxi*(t(x)*y);/*参数估计*/
yhat=x*beta;/*预测值*/
resid=y-yhat;/*残差*/
sse=ssq(resid);/*SSE*/
n=nrow(x);/*观测值数*/
dfe=nrow(x)-ncol(x);/*误差自由度DF*/
mse=sse/dfe;/*MSE*/
cssy=ssq(y-sum(y)/n);/*校正平方和*/
rsquare=(cssy-sse)/cssy;/*RSQUARE*/
print,"RegressionResults",ssedfemsersquare;
stdb=sqrt(vecdiag(xpxi)*mse);/*参数估计的标准差*/
t=beta/stdb;/*参数的t检验*/
prob=1-probf(t#t,1,dfe);/*p-值*/
print,"ParameterEstimates",,betastdbtprob;
print,yyhatresid;
finishregress;/*模块结束*/
resetnoprint;
runregress;/*执行REGRESS模块*/
resetprint;/*打开自动打印*/
covb=xpxi*mse;/*参数估计协方差阵*/
s=1/sqrt(vecdiag(covb));
corrb=diag(s)*covb*diag(s);/*参数估计的相关系数*/
x1={1,2,3,4,5};/*矩阵X的第二列*/
x=orpol(x1,2);/*产生正交多项式*/
resetnoprint;/*关闭自动打印*/
runregress;/*运行REGRESS*/
resetprint;
covb=xpxi*mse;
s=1/sqrt(vecdiag(covb));
corrb=diag(s)*covb*diag(s);
resetfuzz;
corrb=diag(s)*covb*diag(s);
x=orpol(x1,2);注释;
产生矩阵a的正交多项式
6.5综合例子
某长途运输公司对同类卡车统计了行行驶里程y与行驶天数x的数据如表:
x
3.5
1.0
4.0
2.0
1.0
3.0
4.5
1.5
3.0
5.0
y
825
215
1070
550
480
900
1350
325
670
1215
希望通过此数据建立行驶里程y关于行驶天数x的线性回归方程。
SAS/IML程序如下:
prociml;
startLSE(x,y);/*定义函数LSE用于求统计回归方程*/
b=inv(x`*x)*x`*y;/*求统计回归方程的最小二乘估计*/
return(b);/*以函数值的形式返回求得系数的最小二乘估计*/
finish;
startmain;/*定义主程序*/
x={13.5,11.0,14.0,12.0,11.0,13.0,14.5,11.5,13.0,15.0};
y={825,215,1070,5500,480,900,1350,325,670,1251};
beat=LSE(x,y);
printbeat;
finish;
run;/*运行主程序*/
quit;
输出结果如下:
7.打开与使用SAS数据集
7.1打开一个SAS数据集
在访问一个SAS数据集前,你必须发布一个命令来打开它。
如果只是从已存在的数据集中简单地读取数据,可使用USE语句来打开数据集,一般格式为:
USE数据集名
例:
prociml;
usesashelp.class;
listall;/*显示数据集的观测值*/
quit;
7.2由SAS数据集创建矩阵
可以使用READ语句,从SAS数据集传递数据到矩阵里,注意该数据集必须先打开,READ语句的一般格式为
READ<范围>
prociml;
usesashelp.class;
listall;/*显示数据及观测值*/
readallvar{namesexage};/*把数据集class中的变量namesexage读取出来并形成一个矩阵*/
printnamesexage;
quit;
prociml;
usesashelp.class;
listall;
readallvar{namesexage}intotemp;
printtemp;
quit;
run;
注:
第二段程序执行后会在Log窗口中显示警告信息:
WARNING:
VariableAGEexcludedbecauseoftypemismatchwithA.,提示age变量没有导入矩阵temp中,因为它的数据类型与其它两个变量不一致。
思考:
如果只要求将女性的观测读取出来,则需加入where选项。
readallvar{namesexage}where(sex='F');
7.3由矩阵创建SAS数据集
SAS/IML提供了从矩阵创建一个新SAS数据集的能力,主要使用create和append语句来实现,有两种方式分别来创建只有一个变量和多个变量数据集。
格式为:
方式一:
CREATE数据集名FROM矩阵名<[COLNAME=列名ROWNAME=行名]>;
AppendFrom矩阵名;
方式二:
CREATE数据集名;
Append;
例:
/*创建只有一个变量的SAS数据集*/
prociml;
usesashelp.class;
listall;
readallvar{heighweight};/*从数据集中读取变量,形成矩阵*/
printheightweight;
htwt=height/weight;
createratiofromhtwt[colname='htwt'];/*由矩阵创建数据集ratio,并修改列名col1为htwt*/
appendfromhtwt;/*注:
必须使用append向数据集中添加数据,且形式与创建时的对应*/
listall;
quit;
prociml;/*创建只有多个变量的SAS数据集*/
usesashelp.class;
listall;
readallvar{nameheighweight};
printheightweight;
htwt=height/weight;
createratiovar{namehtwt};
append;/*注:
必须使用append向数据集中添加数据,不能用上面的from格式*/
listall;
quit;
练习题:
1.已知矩阵X和向量Y的值同第5题,请用SAS/IML编写一个程序,计算矩阵
和微量
的值。
2.请用SAS/IML编写一个程序,解线性方程组Ax=b,其中A和b的值即为上题计算所得的值。
3.SAS/IML编写一个程序,计算出自由度从20到45的t分布的95%的分位数,并计算出自由度从1到20的
分布的99%分位数。
4.SAS/IML编写一个程序,分别产生30个正态分布N(5,4)和均匀分布U(0,2)的随机数。
5.SAS/IML编写一个程序,计算岭参数k从0到1.000(每次变
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SAS IML交互式矩阵语言模块原理与实现 IML 交互式 矩阵 语言 模块 原理 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)