SAS如何在没有';保留';陈述

SAS如何在没有';保留';陈述,sas,Sas,我正在研究如何在sas9.3中使用proc-mcmc来拟合标准Cox模型 对于数据中的第一行(ind=1),S=exp(bZ)与其他量一起计算。需要注意的是,S是从原始数据集的列构造的新变量 对于第二行(1

我正在研究如何在
sas9.3
中使用
proc-mcmc
来拟合标准Cox模型

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

对于第二行(
1
),
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;
如果ind=1,则执行;/*第一次观察*/
S=exp(bZ);
l=vstatus*bZ;
v=vstatus;
结束;
否则,如果(1
很抱歉,这不是答案,请注意下面的内容

可以在数据步骤中使用的大多数编程语句 也可用于PROC MCMC

在大多数情况下,SAS编程语句的工作原理与 它们在数据步骤中执行,如SAS语言参考中所述: 概念。然而,有几个不同之处

因此,我的印象是
begingst
ENDCNST
块中的语法与datastep中的语法几乎相同,但一些内部工作方式不同,这可能是关于保留计算值(?)的情况。因此,这可能与datastep PDV(程序数据向量)中的工作原理不同。

lag1()
函数保留了值,但要小心

lag()
函数将记住上次执行时的值,而不是前一行!因为只有当第一个
条件为非真时,才会执行滞后函数,因此可能会出现难以调试的问题

我建议改为使用更明确、更易于调试的
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;
prev_time=lag1(时间);
如果ind=1,则执行;/*第一次观察*/
S=exp(bZ);
l=vstatus*bZ;
v=vstatus;
结束;
否则,如果(1

顺便说一句,还有
lag()、lag1()、lag2()、lag3()等……
函数也存在

我同意你关于“滞后”的警告。但是,即使在“else-do循环”中,S的值也会从上一行保留并递增……您能提供一个示例数据集和结果吗?数据集在这里可用,生成结果的代码在这里:;谢谢哎呀!非常感谢-我没看到。我应该把这个问题读得更透彻一些=|您的帖子和SAS的以下语句有助于回答我的问题:“LAG函数从队列返回变量值。当PROC MCMC逐步遍历数据集时,LAG函数将每个数据集变量排队,您可以访问任何变量的当前值和所有以前的值。”