4

私は、標準的な Cox モデルを に適合させる方法を説明するこの例に取り組んでいますproc mcmcSAS 9.3

データの最初の行 ( ind=1) についてS=exp(bZ)は、他の数量と共に計算されます。は、元のデータ セットの列から作成されSた新しい変数であることに注意してください。

2 行目 ( 1 < in < &N) では、Sが増分されます: S = S + exp(bZ)

質問:S SASは前の行の値をどのように保持しますか? retain私は声明または同等のものを期待していたでしょう...


コードの関連部分:

if ind = 1 then do;        /* first observation         */
  S = exp(bZ);
  l = vstatus * bZ;
  v = vstatus;
 end;
 else if (1 < ind < &N) then do;
  if (lag1(time) ne time) then do;
     l = vstatus * bZ;
     l = l - v * log(S);  /* correct the loglike value   */
     v = vstatus;         /* reset v count value         */
     S = S + exp(bZ);
  end;
  else do;                /* still a tie                 */
     l = vstatus * bZ;
     S = S + exp(bZ);
     v = v + vstatus;     /* add # of nonsensored values */
  end;
 end;
4

2 に答える 2

2

http://support.sas.com/documentation/cdl/en/statug/63962/HTML/default/viewer.htm#statug_mcmc_sect017.htmに記載されている内容に注意してください。

DATA ステップで使用できるプログラミング ステートメントのほとんどは、PROC MCMC でも使用できます。

ほとんどの場合、SAS プログラミング ステートメントは、SAS 言語リファレンス: 概念に記載されているように、DATA ステップでの場合と同じように機能します。ただし、いくつかの違いがあります...

BEGINCNST内部のシンタックスやENDCNSTブロックはデータステップとほぼ同じなのですが、計算値の保持など、内部の仕組みが一部異なるのが私の印象です(?)。おそらく、これはデータステップ PDV (プログラム データ ベクトル) と同じようには機能しません。

于 2012-10-02T09:27:02.793 に答える
2

値を保持しているlag1()関数ですが、注意してください!

関数は、前の行ではなく、前回実行されたときlag()値を記憶します! ラグ関数は最初の条件が真でない場合にのみ実行されるため、これに起因する問題をデバッグするのが難しい場合があります。if

retainより明示的でデバッグしやすいステートメントを使用するように変更することをお勧めします。関数を使用し続けることを選択しlag1()、コードに問題がある場合は、条件付きロジックから移動して、コードが次のようになることをお勧めします。

prev_time = lag1(time);
if ind = 1 then do;        /* first observation         */
  S = exp(bZ);
  l = vstatus * bZ;
  v = vstatus;
 end;
 else if (1 < ind < &N) then do;
  if prev_time ne time then do;
     l = vstatus * bZ;
     l = l - v * log(S);  /* correct the loglike value   */
     v = vstatus;         /* reset v count value         */
     S = S + exp(bZ);
  end;
  else do;                /* still a tie                 */
     l = vstatus * bZ;
     S = S + exp(bZ);
     v = v + vstatus;     /* add # of nonsensored values */
  end;
 end;

ところで - 存在lag(), lag1(), lag2(), lag3(), etc....する関数もあります。

于 2012-10-02T14:30:10.410 に答える