【问题标题】:How does SAS retain the value from a previous row without the 'retain' statement?SAS 如何在没有“保留”语句的情况下保留前一行的值?
【发布时间】:2012-10-02 06:44:50
【问题描述】:

我正在研究this example,它解释了如何在SAS 9.3 中使用proc mcmc 拟合标准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;

【问题讨论】:

    标签: sas


    【解决方案1】:

    保留值的是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.... 函数也存在。

    【讨论】:

    • 我同意您关于“滞后”的警告。但是,即使在“else do 循环”中,S 的值仍保留在前一行并递增...
    • 你能提供一个样本数据集和结果吗?
    • 糟糕!非常感谢 - 没看到。我应该更彻底地阅读这个问题。 =|
    • 您的帖子以及 SAS 的以下句子有助于回答我的问题:“LAG 函数从队列中返回变量的值。当 PROC MCMC 逐步遍历数据集时,LAG 函数将每个数据排队设置变量,并且您可以访问当前值以及任何变量的所有先前值。"
    【解决方案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(程序数据向量)中的工作方式不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多