質問

PARMSステートメントを使用して、レベル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ステートメントなしでは機能します。ただし、コードを実行するときは、IMLによって生成された値をリストするのではなく、Parmsの後にリテラル文字列 'start_vector [label=""]'を明らかにします。

このエラーを回避する方法SASにSTART_VECTORに含まれている値をPARMSステートメントの開始値として指定できますか?

役に立ちましたか?

解決

SAS / IMLのSYMPUTまたはSYMPUTXルーチンを使用してベクトルをマクロ変数に変換する必要があります。

これは、マクロ変数の単一の文字列にベクトルを取得する1つの方法です。

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;
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top