2017-10-24 1 views
1

Proc Mixed 매크로를 사용하여 매크로 내에서 다른 공분산 구조를 테스트하려고합니다.로그 오류 (매크로 내부)가 발생하지 않는 경우에만 proc 단계 실행 SAS

%macro cov(type); 
proc mixed data=tmp order=data; 
class sub trt visit; 
model var = trt visit trt*visit/S cl; 
repeated visit /subject=sub type=&type.; 
FitStatistics=min_var_&type.; 
run; 
%mend; 

내가 모델 오류가 발생하고 나는 그것이 & 유형의 값으로 오류가 발생하지 않는 경우이 만 혼합 문을 발동 실행할 수있는 방법을 찾기 위해 노력하고있어에 맞게 필요한 공분산 구조의 일부.

나는 % sysfunc로 작업하고 있지만 아직 해결하지 못했습니다.

이렇게하면 이러한 데이터 세트가 올바르게 생성되지만 장착 할 수없는 매크로 변수에 대해서는 로그에 로그 오류가 존재합니다.

당신은 그런 로그를 파일로 리디렉션 할 수 있습니다
+0

일부 공분산 구조가 오류를 일으키는 이유는 무엇입니까? 'PROC MIXED'를 실행하기 전에 이것을 예측할 수 있습니까? 'PROC MIXED'는 에러를 일으키지 않는 경우에만 실행하도록 지시 할 수는 없지만 에러가 발생한 후에 어떤 일이 일어나는지 제어 할 수 있습니다. 하지만 오류가 발생하지 않는 것이 좋을 것 같습니다. 아마도 문제를 해결하거나 문제를 해결하는 것으로 시작하십시오. 오류의 종류를 나타내는 예제 데이터를 사용하는 것이 좋습니다. – Joe

+0

여러 매크로 집합에 대해이 매크로를 실행 중이며 그 중 일부는 특정 공분산 구조를 사용하고 다른 매크로 집합에서는 적합하지 않습니다. 그리고 proc 혼합에 적합하기 전에, 나는 그 데이터에 대해 어떤 종류의 공분산 구조가 맞는지 알 수 없다. – Laura

+1

목표가 로그의 오류 메시지를 피하고 PROC MIXED가 오류를 발생시키는시기를 예측할 수 없다면 PROC PRINTTO를 사용하여 로그를 리디렉션 한 다음 MIXED를 실행하고 기본 로그로 다시 리디렉션 한 다음 if 대체 로그에 오류가 있었는지 여부를 결정하고 해당 모델을 다시 실행할지 여부를 결정합니다. – Quentin

답변

1

:

filename logfile "\\SERVER\LOG\mylog.log"; 

    proc printto log=logfile new; 
    run; 

혼합하여 PROC가 완료되면 다음, 당신은 문자열 "ERROR"에 대한 로그 파일을 필터링 할 수 있습니다

....YOUR PROC MIXED... 

/*come back to normal log*/ 
    proc printto; 
    run; 

/*check the log file*/ 
    DATA CHECKLOG; 
      LENGTH ROWS $200; 
      LABEL ROWS = 'Messages from LOG'; 
      INFILE "\\SERVER\LOG\mylog.log" TRUNCOVER; 
      INPUT ROWS &; 
      LINE = _N_; 

      IF SUBSTR(ROWS,1,5)='ERROR' /*OR SUBSTR(ROWS,1,7)='WARNING'*/ THEN 

      OUTPUT; 
    RUN; 

데이터 세트에 ERROR (오류) 및 (필요한 경우 경고)가 표시됩니다.

그러면 테이블이 비어 있는지 확인해야합니다. 예이면 스크립트를 계속 진행할 수 있습니다. sqlobs가 0보다 큰 경우

당신은 다음 오류가이 방법

proc sql; 
select * from checklog; 
run; 
%put n=&sqlobs; 

을 통해 그것을 할 수 있습니다. 다음과 같은 매크로 함수를 통해 sqlobs를 확인할 수 있습니다.

%macro checklog; 
    proc sql; 
    select * from checklog; 
    run; 

%if (&sqlobs>0) %then ... 
%else ... 

%mend checklog;