SAS / IML에서 생성 된 벡터를 매크로 변수로 사용
문제
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은 인수가있는 모듈을 정의하고 호출 할 수 있으므로 일반적으로 매크로 언어를 피하고 인수를 취한 다음 모듈을 직접 호출하는 모듈을 정의합니다.