理解SV domain

subject visit用來存放受試者計劃和實際的訪視信息。與TV不同,TV存放方案規(guī)定的計劃訪視,SV還需要計劃外訪視的信息。

SV Assumptions

  1. SV提供受試者試驗訪視的日期/時間,包括進行的(計劃/計劃外)訪視和未發(fā)生的計劃訪視
  2. 一個受試者一個VISITNUM只能有一條記錄
  3. 篩選失敗、撤回知情、死亡或者提前退出試驗的受試者,隨后應(yīng)該進行的計劃訪視不在SV中體現(xiàn)
  4. 受試者的計劃內(nèi)和計劃外訪視,無論是否實地訪視都應(yīng)在SV體現(xiàn)
    ??SVPRESP=Y 指明計劃訪視
    ??對于計劃訪視,SVOCCUR指明該訪視是否發(fā)生
    ??SVREASOC,未發(fā)生原因
    ??對于計劃外訪視,SVPRESP和SVOCCUR應(yīng)該為空

這3個變量是在SDTM IG3.4版本新增的。

SVOCCUR=N指的是某個計劃訪視未進行的情況,如果CRF頁面設(shè)計為下圖形式,未收集整個訪視的原因,這樣的話就不用SVREASOC變量,對于這樣的頁面設(shè)計,假如某個受試者某個訪視整個都未進行,那么programmer收到的數(shù)據(jù)集不會有該受試者該訪視的任何記錄,根據(jù)IG的更新是要求受試者退出研究之前的所有計劃訪視(包括未做訪視)都呈現(xiàn)在SV中的。
那么對于DM來說,訪視頁面應(yīng)該設(shè)計為如下頁面是更合理的。
  1. VISITDY不應(yīng)對計劃外訪視賦值
  2. 對于那些篩選訪視收集的結(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;
最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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