3

PARMS ステートメントを使用して、レベル 1 の残差分散をほぼゼロの値に固定して PROC MIXED を実行するマクロを作成しています。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 MIXED コードに PARMS ステートメントがなくても正常に機能します。ただし、コードをそのまま実行すると、SAS は、IML によって生成された値をリストするのではなく、PARMS の後にリテラル文字列 'start_vector[label=""]' を配置するようです。

このエラーを回避し、SAS に START_VECTOR に含まれる値を PARMS ステートメントの開始値として指定させるにはどうすればよいですか?

4

2 に答える 2

1

問題と 2 つの解決策については、記事「Passing values from PROC IML into SAS Procedures 」で説明されています。

これをマクロでラップする必要がありますか?その場合、マクロから呼び出すことができないため、SUBMIT および ENDSUBMIT ステートメントは機能しません。ただし、SAS/IML では引数を使用してモジュールを定義および呼び出すことができるため、通常はマクロ言語を使用せず、引数を取るモジュールを定義してから直接モジュールを呼び出します。

于 2014-07-31T09:54:47.013 に答える
1

ベクトルをマクロ変数に変換するには、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); call 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;
于 2014-07-30T18:31:40.407 に答える