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函数将每个数据集变量排队,您可以访问任何变量的当前值和所有以前的值。”