zoukankan      html  css  js  c++  java
  • 【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: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掉的变量;
    • 没有正确引用数据集;
    • 有逻辑错误。
  • 相关阅读:
    Zookeeper 入门第一篇
    jmap命令
    Java中的原子操作类
    Fel表达式实践
    Fel表达式使用过程中需要注意的问题
    【luoguP1196】 [NOI2002]银河英雄传说--边带权并查集 ,
    【luoguP1955 】[NOI2015]程序自动分析--普通并查集
    【csp模拟赛2】 序列操作
    【csp模拟赛2】 爆搜 方格加数
    HZWER
  • 原文地址:https://www.cnblogs.com/chenyn68/p/3869071.html
Copyright © 2011-2022 走看看