문제

PARMS 문을 사용하여 Level-1 레지 듀얼 분산에 고정 된 레벨 -1 잔류 분산과 혼합 된 Proc을 실행하는 매크로를 작성하고 있습니다.SAS / IML을 사용하여 PARMS 문의 시작 값의 대량을 생성하려고 시도하고 있습니다.

%macro test (dataset= , classroom= , preds= , outcome=);
proc iml;

/*count number of variables*/
    %let nvars = 0; 
    %do %while(%qscan(&preds,&nvars+1,%str( )) ne %str());
        %let nvars = %eval(&nvars+1);
    %end; 

/*determine location of level-1 residual in the start value vector*/
    %let error_location = %eval(((&nvars*(&nvars-1))/2)+&nvars+1);

/*create vector of start values from lower triangle of identity matrix*/
    start_vector = symsqr(I(&nvars));
    %let starts = %str(start_vector[label=""]); 

/*analyze data*/
    proc mixed data=&dataset noprofile method=ml;
        class &classroom;
        model &outcome = &preds /noint;
        random &preds /type=un sub=&classroom g; 
        parms 
            &starts
            .00000001 /hold= &error_location;
    run;
quit;
%mend;
.

PROC 혼합 코드에서 PARMS 문없이 코드가 잘 작동합니다.그러나 코드를 실행하면 SAS는 IML이 생성 한 값을 나열하는 대신 Parms 후 리터럴 문자열 'start_vector [label="' ''을 분명히 넣습니다.

어떻게이 오류를 피하고 SAS가 PARMS 문의 시작 값으로 start_vector에 포함 된 값을 지정할 수 있습니까?

도움이 되었습니까?

해결책

SAS / IML에서 SYMPUT 또는 SYMPUTX 루틴을 사용하여 벡터를 매크로 변수로 변환해야합니다.

이것은 매크로 변수에서 단일 문자열로 벡터를 가져 오는 한 가지 방법입니다.

proc iml;
  start = {"Hi","Bye"};
  call symput("start",rowcat(start`));
  %put &start;
quit;
.

숫자 벡터가있는 경우 char를 사용하여 변환해야합니다.

PROC IML; start_vector= j (5); SymputX ( "start_vector", rowcat (char (j))를 호출하십시오. % put & start_vector; 그만둬;

숫자 매트릭스가있는

을 병합하려면 SHAPE를 사용해야합니다.

proc iml; 
    start_vector = j(5,5); 
    call symputx("start_vector",rowcat(shape(char(start_vector),1))); 
    %put &start_vector;
quit;
.

다른 팁

귀하의 문제점과 두 가지 솔루션은 " PROC IML에서 SAS 절차 로 값을 전달합니다.

매크로에서 이것을 감싸야합니까?그렇다면 제출 및 일급 명령문은 매크로를 형성 할 수 없으므로 작동하지 않습니다.그러나 SAS / IML은 인수가있는 모듈을 정의하고 호출 할 수 있으므로 일반적으로 매크로 언어를 피하고 인수를 취한 다음 모듈을 직접 호출하는 모듈을 정의합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top