2012-10-02 84 views
4

我正在研究this example,它解釋瞭如何在SAS 9.3中使用標準Cox型號proc mcmcSAS如何在沒有「保留」聲明的情況下保留前一行的值?

對於數據中的第一行(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

這是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....功能也存在。

+0

我同意您對'滯後'的警告。但是,即使在'else do loop'中,S的值也會保留在前一行並且遞增... – Marco

+0

您能否提供樣本數據集和結果? –

+0

那麼,數據集可以在這裏找到:http://support.sas.com/documentation/cdl/en/statug/63962/HTML/default/viewer.htm#statug_phreg_sect046.htm,產生結果的代碼是這裏:http://support.sas.com/documentation/cdl/en/statug/63962/HTML/default/viewer.htm#statug_mcmc_sect059.htm;謝謝! – Marco

2

對不起,這不是答案,只需要注意什麼,在說http://support.sas.com/documentation/cdl/en/statug/63962/HTML/default/viewer.htm#statug_mcmc_sect017.htm

大部分可用於數據步驟 的編程語句也可用於PROC MC MC。

在大多數情況下,SAS編程語句的工作方式相同,因爲他們在數據步做 ,如SAS語言參考記載: 概念。不過,也有一些差異...

所以我的印象裏面BEGINCNSTENDCNST塊的語法是在datastep幾乎相同,但一些內部工作機制是不同的,這可能是關於計算固定的情況下,值(?)。所以可能這與datastep PDV(程序數據向量)不一樣。

+0

感謝您指出,+1 ;-) – Marco

相關問題