我正在处理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;
答案 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语言参考中所述: 概念。但是,有几个不同......
所以我的印象是BEGINCNST
和ENDCNST
块内的语法与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....
个函数。