sas编程技术sas编程基础(编辑修改稿)内容摘要:

, 所以 , 可以使用 SAS数据集和外部文件 , 也可以对一个已有的 SAS数据集进行编辑或者创建一个新的 SAS数据集。  SAS/IML软件是一种编程语言;  SAS/IML软件对矩阵作运算;  SAS/IML软件有强大的算符功能 , 有许多函数和 CALL子程序;  SAS/IML软件将算符应用到整个矩阵;  SAS/IML软件是交互式的;  SAS/IML软件是动态的;  SAS/IML软件可以处理数据;  SAS/IML软件可以作图。 一个简单 IML交互程序 例 求平方根 IML程序。 proc iml。 /* 激活 IML */ reset deflib=ResDat。 /*指定 ResDat为缺省的 SAS逻辑库 */ start approx(x)。 /* 定义模块开始 */ y=1。 /* 初始化 y */ do until(w1e3)。 /* 循环开始 , le3= */ z=y。 y=.5(z+x/z)。 /* 估计开方根 , 牛顿迭代 */ w=abs(yz)。 /* 计算估计值之间的差异 */ end。 /* 循环结束 */ return(y)。 /* 返回近似值 */ finish approx。 /* 模块结束 */ t=approx({3,5,7,9})。 /* 调用函数 APPROX */ print t。 /* 打印矩阵 */ quit。 run。 T 3 OUTPUT窗口结果 牛顿迭代法求 f(z)=0一个实根的方法 牛顿迭代法公式: 1()()nnnnfzzzfz 上例中函数为: xzzf  2)(理解 IML语言 定义矩阵 SAS/IM软件对矩阵作运算 , 这里矩阵的定义同矩阵代数中矩阵的定义一样 , 是一个两维的 ( 行 列 ) 数组。 SAS/IM软件可以定义数值矩阵也可以定义字符矩阵。 特殊矩阵定义: 1 N矩阵称作行向量。 M 1矩阵称作列向量。 1 1矩阵称作标量 . 矩阵名字与标识 矩阵名字是一个合法的 SAS名字 , 不能超过 8字节。 矩阵标识是由它的值表示的矩阵。 例 矩阵名举例。 A, XX, MATRIX1. 例。 100, ., HI, {1 2 2 8 8 }, {3, 3, 6,6}. 由矩阵标识创建矩阵 创建标量矩阵 例。 proc iml。 reset deflib=ResDat。 a=100。 b=.。 c=IML。 创建数值矩阵 含有多个元素的矩阵标识要用括号把元素括起来。 用逗号将矩阵的行分开。 例 由矩阵标识创建的数值阵。 X={1 2 3 4 5 6}。 /*定义一个行向量 X*/ Y={1,2,3,4,5}。 /*定义一个列向量 Y*/ Z={1 2, 3 4, 5 6}。 /*定义一个 3 2矩阵 Z*/ W=3Z。 /*创建一个新矩阵 W, 它的每个元素是矩阵 Z相应元素的 3倍 */ 创建字符矩阵 例 , 字符长度取最长字符的长度。 a={IML Modual}。 /*字符长度以较长的字符为准 , 这里为 6*/ B={39。 abc39。 39。 DEFG39。 }。 重复因子 重复因子用括弧括起来放在要重复的元素前面。 例 用与不用重复因子的等价语句。 ANS={[2] 39。 Yes39。 , [2] 39。 No39。 }。 ANS={39。 Yes39。 39。 Yes39。 , 39。 No39。 39。 No39。 }。 赋值语句 结果=表达式: w=3z。 函数作为表达式: a=sqrt(b)。 y=inv(x)。 r=rank(x)。 表达式中的三种运算符 表达式中的算符 算符 在表达式中的位置前缀运算符 放在运算对象前面 ( A )中缀运算符 放在运算对象之间 ( A * B )后缀运算符 放在运算对象后面 ( A 39。 )语句类型 SAS/IML软件语句大致分为三类:  控制语句;  函数和 CALL语句;  命令语句。 函数的一般形式: Result = Function (arguments)。 其中: Argument可以是矩阵名 , 矩阵本身或表达式。 SAS/IML软件中的函数类型:  矩阵查询函数;  标量函数;  概括函数;  矩阵变形函数;  矩阵算术函数;  线性代数和统计函数。 函数 例 IML随机数函数应用举例。 Rv=Uniform(Repeat(0, 10, 1))。 Rv =Ranuni(Repeat(0,10,1))。 Rv =Normal(Repeat(0,10,1))。 Rv =Rannor(Repeat(0,10,1))。 Rv =Ranbin(Repeat(0,10,1),20,)。 Rv =Rancau(Repeat(0,10,1))。 Rv =Ranexp(Repeat(0,10,1))。 Rv =Rangam(Repeat(0,10,1),1)。 Rv =Ranpoi(Repeat(0,10,1),2)。 Rv =Rantri(Repeat(0,10,1),3)。 例中 , 形式 REPEAT(X, Y, Z)中 , X是随机数种子 , Y是产生的随机数个数 , Z是产生的随机数列数。 例 DATA步下随机数产生 SAS程序例子。 data RV。 retain _seed_ 0。 /*retain 赋初值 0给 _seed_*/ mu=0。 sigma=1。 do _i_ = 1 to 1000。 Normal1 = mu + sigma * rannor(_seed_)。 /*均值为 mu,标准差为 sigma*/ output。 end。 drop _seed_ _i_ mu sigma。 run。 SAS/IML不支持 OF语句: A=mean(of x1x10)。 在 SAS/IML中 x1x10被当成 x1减 x10, 而不是 x1到 x10. CALL语句与子程序 CALL SUBROUTINE arguments。 例 使用 CALL子程序。 call eigen(val,vec,t)。 call delete(DAT)。 第一个例句 , 用 CALL语句创建矩阵 , 得到矩阵 t的特征值和特征向量。 第二句 , 删除数据集 DAT。 例 自建子程序。 start mymod(a,b,c)。 a=sqrt(c)。 b=log(c)。 finish。 run mymod(a, b, 10)。 /*运行模型 MYMOD*/ run mymod(x, y, 10)。 例中 , 建立一个模块 MYMOD, 分别得到输入矩阵的平方根和自然对数值。 CALL的其它一用法: call gstart。 /*激活 graphics模块 */ call gopen。 /*打开一个新的 graphics片段 */ call gpoint(x,y)。 /*作散点图 */ call gshow。 /*显示散点图 */ 命令 利用 SAS/IML命令用于实现一些具体的系统功能 , 例如 , 存贮和加载矩阵 、 或进行特定的数据处理等。 例 SAS/IML命令用法举例。 proc iml。 A={1 2 3, 4 5 6, 7 8 9}。 B={2 2 2}。 show names。 store a b。 show storage。 remove a b。 /*移走矩阵 a,b*/ show storage。 load a b。 quit。 proc iml。 A={1 2 3, 4 5 6, 7 8 9}。 B={2 2 2}。 print a b。 free a b。 /*清空矩阵 a, b*/ print a b。 quit。 缺失值  SAS/IML软件也有缺失值的问题。 注意 , 矩阵中的缺失值不能视为 0, 矩阵标识中 , 数值缺失值用点 ” .”表示。  SAS/IML软件支持缺失值的方式是有限的。 许多矩阵运算不允许有缺失值 , 比如 , 矩阵乘法 、 矩阵求逆等。 另外 ,支持缺失值的矩阵运算也会产生不一致的结果。 线性回归 IML模块 解方程组 例 线性解方程组。 用符号表示为: Ax = c 解方程组程序: proc iml。 a={3 1 2, 2 2 3, 4 1 4}。 c={8, 2, 9}。 x=inv(a)*c。 print a c x。 quit。 run。 1 2 31 2 31 2 33 2 82 2 3 24 4 9x x xx x xx x x         A C X 3 1 2 8 3 2 2 3 2 5 4 1 4 9 2 结果: 线性回归 IML模块程序 例 IML模块程序。 proc iml。 x={1 1 1, 1 2 4, 1 3 9, 1 4 16, 1 5 25}。 y={1,5,9,23,36}。 b=inv(t(x)*x)*t(x)*y。 yhat=x*b。 r=yyhat。 sse=ssq(r)。 dfe=nrow(x)ncol(x)。 mse=sse/dfe。 start regress。 /* 定义模块开始 */ xpxi=inv(t(x)*x)。 /* 矩阵 X39。 X的逆 */ beta=xpxi*(t(x)*y)。 /* 参数估计 */ yhat=x*beta。 /* 预测值 */ resid=yyhat。 /* 残差 */ sse=ssq(resid)。 /* SSE */ n=nrow(x)。 /* 观测值数 */ dfe=nrow(x)ncol(x)。 /* 误差自由度 DF */ mse=sse/dfe。 /* MSE */ cssy=ssq(ysum(y)/n)。 /* 校正平方和 */ rsquare=(cssysse)/cssy。 /* RSQUARE */ print,Regression Results, sse dfe mse rsquare。 stdb=sqrt(vecdiag(xpxi)*mse)。 /* 参数估计的标准差 */ t=beta。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。