Adam中編程處理3--BASE、BNRIND

先看一下SPEC中關(guān)于這兩個變量生成邏輯:

BASE(Baseline Value):AVAL where ABLFL=Y per parameter
BNRIND(Baseline Reference Range Indicator):ANRIND where ABLFL=Y per parameter

這兩個變量含義很容易理解,就是基線值。編程思路是在基線記錄中生成BASE/BNRIND,再保留到該P(yáng)ARAMCD中的其他記錄中。我們看一下代碼:
BASE/BNRIND

生成ABLFL后,在每一個PARAMCD中,按ABLFL降序排序。這樣情況下,基線記錄ABLFL=‘Y’,非基線記錄ABLFL為空。因此,基線記錄就排在首行了,接著把首行記錄值(BASE/BNRIND)retain下來,使得非基線記錄含有基線記錄的變量值。

這里有一個注意點:

if ablfl = 'Y' then do; base_= aval; bnrind_=anrind; end;
if first.paramcd then do; base = base_; baseadt; bnrind=bnrind_; end;

這里為什么不直接?

if first.paramcd and ablfl = 'Y' then do; base = aval; baseadt; bnrind=anrind; end;

這里要談到ablfl的定義了:

For each parameter, set to Y for the last record (sort by ADT in ascending order) with AVAL not null and ATPT null and NULL< ADT <=ADSL.TRTSDT

定義為基線值的記錄,AVAL值必須是非空。如果某一PARAMCD中,AVAL都為空值,即ablfl也都為空值。這時候運(yùn)行到“if first.paramcd and ablfl = 'Y' then do;”這一步就不執(zhí)行下面的賦值語句了,這樣會產(chǎn)生賦值錯誤??赡苡腥藭f,這樣不是正好嗎?變量BASE保留基線記錄的值,如果這個PARAMCD內(nèi)AVAL都為空,沒有基線,所以就不用賦值了。這種思路沒問題,可是具體到SAS語句的運(yùn)行時,如果不執(zhí)行賦值語句的話,RETAIN語句會繼續(xù)起作用,變量BASE記錄的就是上一個PARAMCD的BASE值了。而在條件為“if first.paramcd then do;”情況下,在某一PARAMCD內(nèi),沒有基線記錄時也會進(jìn)行賦值語句,只不過賦值是空值。因為不符合上一步條件ablfl = 'Y', BASE_ 已經(jīng)被賦值為空值。這就保證無基線記錄時,該P(yáng)ARAMCD內(nèi)的BASE值為空,不會是前一個PARAMCD的值。

這個例子對于我們有一個很好的啟示,我們再理解變量生成邏輯的同時,也要注意SAS編程運(yùn)行機(jī)制,避免一些意想不到的錯誤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容