首页 > 代码库 > 【SAS BASE】Debuging SAS Programs

【SAS BASE】Debuging SAS Programs

 


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:\MyRawData\ToadJump.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:\MyRawData\Toadjmp2.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必须是用户需要converting to的numeric data type.

  • numeric转化为character: newvar=PUT(oldvar,format)

         就行PUT语句中使用format一样,PUT函数中使用format,且format必须是用户需要converting from的numeric data type.

 错误类型:DATA步的结果是错的,但是并没有提示Error Message

       事实上,在使用PUT语句时,并未与FILE语句一起写入日志。为解决这一类型为题,应采用PUTLOG语句,功能与PUT语句一样,但是不管是否与FILE语句一起使用,都会被写入日志。

1 *Keep only students with mean below 70;2 DATA Lowscore;3      INFILE C:\MyRawData\Class.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掉的变量;
  • 没有正确引用数据集;
  • 有逻辑错误。