4

我正在研究这个例子,它解释了如何用proc mcmcin拟合标准 Cox 模型SAS 9.3

对于数据中的第一行 ( ind=1),S=exp(bZ)与其他量一起计算。需要注意的是,这是一个从原始数据集的列构造S的新变量。

对于第二行 ( 1 < in < &N),S递增:S = S + exp(bZ)

问题: SAS 如何保留S上一行的值?我本来希望有一个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 编程语句的工作方式与它们在 DATA 步骤中的工作方式相同,如 SAS 语言参考:概念中所述。但是,有几个不同之处......

所以我的印象是内部的语法BEGINCNSTENDCNST块几乎与datastep中的相同,但一些内部工作方式不同,这可能是关于保留计算值的情况(?)。因此,这可能与 datastep 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 回答