SAS Program的错误主要有三类:
- Programing Logic Errors(How to identify and resolve);
- Syntax errors(How to recogize anc correct);
- Data errors(How to examine and resolve.
如何写一个高效的SAS Program:
-
尽可能写易读的代码;(每一句话一行、使用缩进排版方式、多使用注释)
- 测试Program的任意一个部分
- 用小数据集测试Program(例如用OBS等选项)
- 采用对语法敏感的程序编辑器(SAS Keywords 是一种颜色,Variable则是另外一种颜色;所有被银行括起来的文本呈现同一颜色)
检查语法错误的方法
1 OPTIONS OBS=0 NOREPLACE; 2 /*1) OBS=0告诉SAS不要导入任何数据 3 2)NOREPLACE选项告诉SAS不要用现有SAS数据集代替空的*/ 4 确定无语法错误后,可将OBS=0改成OBS=MAX即正常使用。
Missing Semicolon引起的错误(DATASTMTCHK系统选项)
(若用户丢了分号,则SAS将两句合并在一起读,从而产生puzzling的提示信息)
1 OPTIONS DATASTMTCHK=ALLKEYWORDS:/*命令SAS所有的关键词都不能作为数据集名*/ 2 DATA toads /*漏了一个分号*/ 3 INFILE 'C:MyRawDataToadJump.dat'; 4 INPUT ToadName $ Weight Jump1 Jump2 Jump3; 5 RUN; 6 7 【日志提示】:ERROR :INFILE is not allowed in the DATA statement when option DATASTMTCHK=ALLKEYWORDS. 8 9 【解释】DATASMTCHK system options,可控制SAS在DATA步中可用作SAS数据集名。该选项默认MERGE,RETAIN,SET或UPDATE都不能作为数据集的名字.
Note: INPUT Statement Reached Past the End of the Line
【解决办法】
1 INFILE 'C:MyRawDataToadjmp2.dat' MISSOVER; 2 /*MISSOVER option命令SAS在读入数据时,若改行数据已读完,而后面仍有变量没有读入,则给剩余的变量分配missing values*/
【可能错误原因】
- 数据本来就是如此
- 数据的开头或结尾的空格(查看SAS LOG的mininmum line length,若为0,则说明有空格列,应删掉)
- 采用了list input,但是有的值之间没有空格,被当成了一个值读入;
- 若有写数据行比其余的要宽,但此时仍采用了column 或formatted导入。(应在INFILE语句后面加上TRUNCOVER选项)。
Note: Lost Card
该提示说明SAS在expecting读入下一行数据,然而却找不到这行数据。例如,每个观测需读入2行数据,则SAS数据集应该有偶数行数据,若只有奇数行,则日志会提示Lost Card信息。
Note: Invalid Data
读入的数据域INPUT语句不符合,而导致SAS不能从原始数据中读入数据。这是SAS可能会做出两种反映:分配该变量missing values;或者在日志中打印出一个类似于probliematic观测的提示。
【可能错误原因】
- 本该是numeric定义的变量出现了字符型的观测值,例如数字0与字母O混淆;
- 用户忘记定义某变量为字符型,而SAS系统自动默认为数值型
- 错误的column specifications也许会在numeric数据中产生内置空格;
- list-style input时,在同一行中同时出现两个periods(..),但是中间没有空格;
- list-style input时,缺失值没有用periods(.)标记,导致SAS读入下一个数据;
- special字符(例如tab键等)出现在numeric数据中;
- 用错了informat,例如用MMDDYY.代替了DDMMYY.);
- 无效日期,单用DATE格式读入,例如September 31.
【备注】:1. 当SAS遇到unprintable(例如,16进制格式等),也会在日志中出现“invalid data”的提示;
2. 有时候用户需要运行此程序,为了保证_ERROR_=0,采用??——format modifier将此变量变为missing value:
1 INPUT IDNumber ?? 1-5 Name $ 6-18 Class $ 20-21 Q1 22 Q2 23;
Note: Numeric Values have been converted to character, Vice Versa
若用户把numeric变量与character变量弄混时,SAS就自动尝试将numeric转化为character,或将character转化为numeric,这种情况就会在日志中体现出来。
【Converting Variables】
- character转化为numeric: newvar=INPUT(oldvar,informat)
就行INPUT语句中使用informat一样,INPUT函数中使用informat,且informat必须是oldvar的输入格式,converting to的numeric data type默认为8个字符。
- numeric转化为character: newvar=PUT(oldvar,format)
就行PUT语句中使用format一样,PUT函数中使用format,其中oldvar为数值型(包括日期型),且format必须是用户需要converting to的character的data type.
错误类型:DATA步的结果是错的,但是并没有提示Error Message
事实上,在使用PUT语句时,若未与FILE语句一起使用则只写入日志;若与FILE语句一起使用,则不会被写入日志。为解决这一类型为题,应采用PUTLOG语句,功能与PUT语句一样,但是不管是否与FILE语句一起使用,都会被写入日志。
1 *Keep only students with mean below 70; 2 DATA Lowscore; 3 INFILE 'C:MyRawDataClass.dat'; 4 INPUT Name $ Score1 Score2 Score3 Homework; 5 Homework = Homework *2; 6 AverageScore=Mean(Score1+Score2+Score3+Homework); 7 PUTLOG Name= Score1= Score2= Score3= Homework=;/PUTLOG _ALL_;/*会输出IF语句之前各变量的值*/ 8 IF AverageScore<70; 9 RUN;
Error: Statment Is Not Valid
说明SAS can't understand the statement at all.
【可能原因】
- 错误的拼写keyword;
- 错误的分号(中英文混淆);
- 在PROC步中使用仅能在DATA步内使用的语句,反之亦然;
- 在DATA步或PROC步内部有RUN语句;
- 虽然options正确,但是语句错误;
- 引号不匹配
- comment的符号不匹配。
Error: Variable is Uninitalized或Error:Variable Not Found
Error: Variable is Uninitalized:出现在DATA步内,说明用户需要初始化变量,然后重新执行此program;
Error:Variable Not Found:出现在PROC步,若错误出现在VAR上,则SAS会提示该信息,然后不执行程序;若错误出现在label上,则SAS会提示警告,并继续执行。
【可能原因】
- 错误的拼写变量名;
- 使用了之前已经drop掉的变量;
- 没有正确引用数据集;
- 有逻辑错误。