如果没有'retain'语句,SAS如何保留前一行的值?

时间:2012-10-02 06:44:50

标签: sas

我正在处理this example,其中解释了如何在proc mcmc中使用SAS 9.3符合标准Cox模型。

对于数据中的第一行(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;

2 个答案:

答案 0 :(得分: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(程序数据向量)不同。

答案 1 :(得分: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;

BTW - 还存在lag(), lag1(), lag2(), lag3(), etc....个函数。