BOR (Best Over Response)确认
BOR (Best Over Response)
在肿瘤试验中,RS数据集里保存了治疗后的整体反应结果,这个反应结果指的是按照RECIST 1.1规则在某次访视判断的疗效结果。通过整体反应结果,我们可以得到BOR(Best Over Response),即从治疗开始直到疾病进展或复发期间记录的最佳疗效状态,另称为非确认BOR;而为了排除测量误差等原因对疗效的影响,肿瘤的完全/部分缓解(CR/PR)需要进行再次疗效确认,称为确认BOR。这个变量最终根据SDTM.RS等数据做到ADRS中,是后续做疗效判断、图表等重要的一部分。
主要参考文献:New response evaluation criteria in solid tumors: Revised RECIST guideline (version 1.1).

对于SP来说,BOR是否需要确认是一个编程相关重要的点。
不需要确认
按照CR>PR>SD>PD>NE的顺序,出现CR就是CR,出现PR就是PR,仅对SD有最小时长的要求。
需要确认
何时需要确认
RECIST 1.1中对于疗效确认的要求为(文档4.6.1):
非随机、疗效反应为终点的研究必须进行确认缓解;
随机、生存期或进展时间为主要终点的研究(OS/PFS)不作为解释主要终点,不需要确认缓解;
SD需要满足最小时限,也就是说首次服药到SD的检查结果时长需要大于X周,否则就判定为NE。
确认的逻辑
简要来说是
两种缓解(CR/PR)需要能够得到后续访视(时间间隔具体看方案)的疗效确认;
疾病稳定(SD)需要维持一段时间(首次评估为6-8周,具体看方案)才能被认为是符合条件的SD;
疾病进展(PD)一般不需要额外确认。
具体如何确认需要参考文献中的Table3:

SAS代码实现
BOR的确认大概有两种做法
一种是参考公众号SAS茶谈文章的做法,纵向使用lag函数判断后续访视结果是否得到确认;
另一种是参考有临医药的文章将纵向访视transpose转置,并对每个Subject进行crfl, prfl, sdfl, pdfl, nefl标记的做法。
transpose的做法逻辑比较清楚,记录一下:
/* Data prepare */
data test1;
set test;
keep usubjid rsstresc rsdy;
proc sort;
by usubjid rsdy;
run;
/* ord for transpose */
data test2;
set test1;
by usubjid rsdy;
if first.usubjid then ord=1; else ord+1;
run;
/* transpose Over Respose and rsdy */
proc transpose data=test2 out=rsstresc_wide (drop=_name_ _label_) prefix=rsstresc;
by usubjid;
var rsstresc;
id ord;
run;
proc transpose data=test2 out=rsdy_wide (drop=_name_ _label_) prefix=rsdy;
by usubjid;
var rsdy;
id ord;
run;
/* merge into one */
data test3;
merge rsstresc_wide rsdy_wide;
by usubjid;
run;
/* flag cr,pr,sd,pd,ne */
data test4;
set test3;
array ovr[*] rsstresc:;
array day[*] rsdy:;
n = dim(ovr);
do i = 1 to n - 1;
if i < n then do;
if ovr(i) = 'CR' and ovr(i+1) = 'CR' and day(i+1) - day(i) >= 28 then crfl = 'Y';
if ovr(i) = 'CR' and ovr(i+1) = 'PR' and day(i+1) - day(i) >= 28 then prfl = 'Y';
if ovr(i) = 'PR' and ovr(i+1) in ('CR','PR') and day(i+1) - day(i) >= 28 then prfl = 'Y';
end;
if ovr(i) = 'SD' and day(i) >= 42 then sdfl = 'Y';
if ovr(i) = 'PD' then pdfl = 'Y';
end;
if cmiss(crfl, prfl, sdfl, pdfl) = 4 then nefl = 'Y';
if ^missing(crfl) then bor_flag = 'CR';
else if ^missing(prfl) then bor_flag = 'PR';
else if ^missing(sdfl) then bor_flag = 'SD';
else if ^missing(pdfl) then bor_flag = 'PD';
else if ^missing(nefl) then bor_flag = 'NE';
keep usubjid bor_flag;
run;不过这个方法在出现PR/CR后多次NE/SD之后又PR/CR的情况是不适配的,因为判断条件只是访视+1。