【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掉的变量;
  • 没有正确引用数据集;
  • 有逻辑错误。

【SAS BASE】Debuging SAS Programs

时间: 2024-11-01 00:10:27

【SAS BASE】Debuging SAS Programs的相关文章

【SAS BASE】PROC EXPORT

PROC EXPORT可导出两种类型的文件: 导出delimited文件 1 *例子; 2 PROC EXPORT DATA=hotels 3 OUTFILE='C:\MyRawData\Hotels.txt' /*后缀名决定了输出文件的格式,除此之外,额也可以通过DBMS=选项来指定.*/ 4 /*例如:space-delimited文件时没有标准的后缀名的,只能通过DBMS=选项来输出*/ 5 DBMS=DLM /*若输出CSV文件,则DBMS=CSV; 6 若输出txt文件,则DBMS=T

【SAS BASE】处理数据集

本节内容包括:SET语句.MERGE语句.UPDATA语句.OUTPUT语句.TRANSPOSE语句和data-set选项及SAS Automatic Variables 一.SET语句(堆叠功能) 用SET语句修改数据集 DATA Friday; SET Sales;/SET 'C:\MySASLIB\trains.dat'; IF DAY='F'; Total=Propcorn+peanuts;/*建立新的变量*/ RUN; 用SET语句堆叠(stack)数据 1 DATA BOTH; 2

【SAS BASE】PROC REPORT

PROC REPORT包含了PRINT.MEANS.TABULATE.SORT过程和DATA步的功能: 一.基本语法: 1 DATA natparks; 2 INFILE 'C:\MyRawdata\parks.dat'; 3 INPUT Name $ 1-21 Type $ Region $ Museums Camping; 4 RUN; 5 6 /*-----Group and Across Variables(Group:纵向;Across:横向)---*/ 7 *Region as Gr

【SAS BASE】ODS OUTPUT

一.ODS的基本性质 ODS输出格式:LISTING(默认的标准SAS输出).HTML.RTF.PRTNTER.PS.PCL.PDF.OUTPUT(SAS OUTPUT Date-set).MARKUP.DOCUMENT; ODS内有table template(指定输出结构)和style template(指定外观结构):首先通过table template作用从procedure中产生数据,形成output project,然后经过style template作用送到destination加

【SAS BASE】PROC TABULATE(输出更加精美的tabulate报告)

PROC TABULATE的一般形式:(主语与FREQ过程不同,这里是table 语句,不是tables) 1 PROC TABULATE FORMAT=options;/*FORMAT=选项改变table中所有cell的格式*/ 2 VAR analysis-variable-list; 3 CLASS classification-variable-list;/*在下面table语句中出现的变量必须预先在VAR语句或CLASS出现过*/ 4 TABLE page-dimension, row

【SAS BASE】PROC FREQ

一般形式: 1 PROC FREQ; 2 TABLES variable_combinations/options; 3 /*variable_combinations 4 若为单变量:TABLE variable-name; 5 若为多变量: TABLE variable-name-1 variable-name-2 ...; 6 若为交叉变量:TABLES variable-name-1*variable-name-2; 7 */ 常见的options有: 1 LIST:将cross-tab

【SAS BASE】PROC MEAS

1 PROC MEANS OPTIONS; /*默认输出:非缺省数目.均值.标准差.最小值.最大值*/ 2 BY variable-list;/*必须要预先排序*/ 3 CLASS variable-list;/*功能与BY语句相同,不需要预先排序*/ 4 VAR variable-list; 5 OUTPUT OUT=data-set statistic(variable-list)=name-list; /*除了VAR与语句中的变量名外,还有两变量:_TYPE_和_FREQ_*/ 6 /*例

【SAS BASE】利用FILE语句和PUT语句输出简单报告

1 DATA _NULL; /*_NULL_使得系统不需要生成一个新的数据集,以节省内存*/ 2 INFILE 'C:\MYRAWDATA\Candy.dat'; 3 INPUT Name $ 1-11 class @15 DateReturned MMDDYY10. Candytype $ Quantity; 4 Profit=Quantity*1.25; 5 6 /*重点:利用FILE和PUT输出报告*/ 7 FILE 'C:\Myrawdata\student.txt' PRINT; /*

【SAS BASE】FORMAT Statement及PROC FORMAT

1 FORMAT Profit Loss DOLLAR8.2 Saledate MMDDYY8.; 2 PUT Profit DOLLAR8.2 LOSS DOLLAR8.2 Saledate MMDDYY8.; FORMAT语句指定每个变量具体的格式;这里特别要注意的是,FORMAT语句中,指定Profit和Loss同一个格式,为DOLLAR8.2. 1 DATA Carsurvey; 2 INFILE 'c:\myrawdata\cars.dat'; 3 INPUT Age Sex Inco