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。sas编程技术sas编程基础(编辑修改稿)
相关推荐
统计量关 键字 =变量名列表 —— 规定在输出数据集中要包含的统计量并规定这些统计量在新数据集中的变量名。 means 过程对 output 语句的次数没有限制,可以使用几个 output 语句来创建内容不同的多个数据集。 fca48c22ad1925ee3c7b5a972c278094 SAS 系统和数据分析 电子商务系列 上海财经大学经济信息管理系 IS/SHUFE Page 12 of
proc copy in=lib1 out=lib2 MTYPE=(data catalog)。 run。 例 将逻辑库 LIB1的所有 SAS文件移动到 LIB2中。 proc copy in=lib1 out=lib2 move。 run。 例 选择以 DAT开头的所有文件。 data (alter=zsw)。 var=39。 move39。 run。 proc copy in=ResDat
data a。 input x @@。 if x1 or x5 then do。 put x。 count+1。 end。 sum+x。 cards。 1 2 7 2 12 24 22。 data a。 input x @@。 if x1 or x5 then do。 put x。 count+1。 end。 else sumx+x。 cards。 1 2 7 2 12 24 22。 语句标号
拼接生成的新数据集 C 的结果 如图 所示。 无论哪一种拼接形式,用 SET 语句拼接生成的新数据集的观测总数为原各输入数据集观测数之和。 二、 数据集的合并 数据集的合并是通过使用 MERGE 语句把两个或两个以上数据集中的两条观测或两条以上 的观测合并为新生数据集中的一条观测。 数据集的合并可分成 两 种主要的合并情况: 一对一合并(不带 BY语句) 匹配合并(带有 BY语句) 图
例如,我们在 PROGRAM EDITOR 窗口中的第一行到第三行输入假设的数据和程序:“ Data and program line one ”,“ Data and program line two” ,“ Data and program line three”。 若想在第 1 行与第 2 行之间插入空行: 在第 1 行的行号前键入 i(或 I,或 i I1) 若想保存和调入程序:
res Under H0 Under H0 Score 1 7 2 6 3 7 Average Scores Were Used for Ties KruskalWallis Test (ChiSquare Approximation) CHISQ = DF = 2 Prob CHISQ = 上海财经大学经济信息管理系 IS/SHUFE Page 7 of 13 结果说明:输出一张单 层的 3行