subject visit用來存放受試者計劃和實際的訪視信息乍迄。與TV不同戳葵,TV存放方案規(guī)定的計劃訪視拱烁,SV還需要計劃外訪視的信息噩翠。
SV Assumptions
- SV提供受試者試驗訪視的日期/時間,包括進行的(計劃/計劃外)訪視和未發(fā)生的計劃訪視
- 一個受試者一個VISITNUM只能有一條記錄
- 篩選失敗擅笔、撤回知情屯援、死亡或者提前退出試驗的受試者狞洋,隨后應(yīng)該進行的計劃訪視不在SV中體現(xiàn)
- 受試者的計劃內(nèi)和計劃外訪視,無論是否實地訪視都應(yīng)在SV體現(xiàn)
??SVPRESP=Y 指明計劃訪視
??對于計劃訪視庐橙,SVOCCUR指明該訪視是否發(fā)生
??SVREASOC,未發(fā)生原因
??對于計劃外訪視借嗽,SVPRESP和SVOCCUR應(yīng)該為空
這3個變量是在SDTM IG3.4版本新增的恶导。
- VISITDY不應(yīng)對計劃外訪視賦值
- 對于那些篩選訪視收集的結(jié)果是受試者參加試驗之前進行的既往檢查數(shù)據(jù)但惶,這樣的既往檢查日期(知情同意之前的日期)不能用來衍生篩選期的SVSTDTC
是否需要time部分?
通常來說,SVSTDTC膀曾、SVENDTC不需要time部分添谊,因為一天只會落在一個訪視內(nèi),所以沒有必要增加衍生SV的復(fù)雜程度纲缓。如果說某一天有多個訪視喊废,那么相應(yīng)的訪視便需要time部分才能保證其他數(shù)據(jù)集mapping到正確的VISIT污筷、VISITNUM乍赫。
例如day 1 pre-dose陆蟆、day 1 post-dose叠殷,類似這樣同一天有兩個訪視的情況,那些相應(yīng)的day 1 pre-dose像棘、day 1 post-dose這兩個VISIT的SVSTDTC壶冒、SVENDTC需要包含time部分胖腾,對于其余訪視的SVSTDTC、SVENDTC做到日期部分就可以锨阿。
需要哪些raw data性宏?
首先我們需要知道SV的目的是什么状飞?無非就是呈現(xiàn)出所有計劃訪視的最早诬辈、最晚日期,對于計劃外訪視需要知道緊跟在哪個計劃訪視之后口渔,VISIT穿撮、VISITNUM在所有包含訪視的domain中需要保持一致性悦穿。所以SV需要的數(shù)據(jù)集便是那些進行檢查訪視的raw data:VS PE RS EG CV LB OE等等,需要排除的有AE CM MH PR等event礁扮,以及ENROLL、IC雇锡、DS這些milestone相關(guān)的數(shù)據(jù)集僚焦。
最主要的原則就是叠赐,考慮該raw data進入的domain是否需要VISIT,該日期是否是該VISIT的檢查日期赛不。
編程思路
通過proc contents或者proc sql數(shù)據(jù)詞典踢故,找出所有日期變量惹苗,再排除掉 那些不屬于訪視檢查日期的日期變量
將所有日期變量set到一起,保留visit, visitnum(folderseq, foldername), subjid, svdat這些變量淋纲,對于所有計劃訪視按日期排序院究,最小日期為該訪視的SVSTDTC业汰,最大日期為該訪視的SVENDTC,每個計劃訪視輸出一條記錄
對于計劃外訪視按日期與計劃訪視merge为障,取該計劃外訪視之前距離最近的計劃訪視名稱鳍怨,并排序給計劃外訪視命名相應(yīng)的名稱和編號跪妥。
注意事項
Partial Date,一般訪視日期很少出現(xiàn)部分缺失的情況确徙,如果有的話需要及時和DM確認是否錄入正確,如果確實有的話鄙皇,需要處理好芜赌,確保日期排序按照預(yù)期;
Raw Data訪視編號的renumber伴逸,據(jù)DM描述已經(jīng)發(fā)布的訪視缠沈、訪視編號上線后不能修改、只能增加错蝴。如果一開始建庫留的訪視編號后續(xù)不夠用洲愤,需要新增訪視的話,可能會出現(xiàn)raw data中的訪視編號不能如實反映訪視發(fā)生順序顷锰,這個時候SDTM.SV要對訪視進行重新編號柬赐。
SV簡單程序示例
假設(shè)邏輯庫raw有如上數(shù)據(jù)集官紫,進行SV編程肛宋。
** 選擇raw data所有日期變量,需根據(jù)項目剔除非訪視日期的日期變量 **;
proc sql;
select catt(libname,'.',memname,'(keep=subjid folderseq foldername')||' '||catt(name,' rename=',name,'=dat)') into:dslist separated by ' '
from dictionary.columns where libname='RAW' and (kindex(upcase(name),'DAT') or kindex(label,'日期'));
quit;
%put &dslist;
data visall;
set &dslist;
run;
** 去重:每個訪視相同日期只留一條記錄即可 **;
proc sort data=visall nodupkey;
by subjid folderseq foldername dat;
run;
** 處理計劃訪視 **;
data vissch;
set visall;
where kindex(foldername,'UNS')=0;
by subjid folderseq foldername dat;
retain svstdtc;
if first.foldername then svstdtc = dat;
if last.foldername then svendtc = dat;
if last.foldername;
** visit,visitnum 沿用folderseq,foldername 如foderseq不能如實反映訪視順序束世,需要重新編號**;
visit = foldername;
visitnum = folderseq;
keep subjid visit visitnum svstdtc svendtc;
run;
** 處理計劃外訪視 **;
data visuns;
set vissch visall(where=(kindex(foldername,'UNS')) rename=dat=svstdtc in=uns);
by subjid svstdtc;
svendtc = svstdtc;
retain unsvis unsvisn;
if visit>'' then unsvis = visit;
if visitnum>.z then unsvisn = visitnum;
if uns;
keep subjid svstdtc svendtc unsvis unsvisn;
run;
proc sort data=visuns;
by subjid unsvis unsvisn;
run;
data visuns1;
set visuns;
by subjid unsvis unsvisn svstdtc;
if first.unsvisn then num = 1;
else num + 1;
visitnum = unsvisn + num/10;
visit = catt(unsvis)||' UNSCHEDULED '||cats(num);
keep subjid visitnum visit svstdtc svendtc;
run;
** 合并計劃酝陈、計劃外訪視 **;
data sv;
retain subjid visit visitnum svstdtc svendtc;
set visuns1 vissch;
by subjid visitnum;
run;