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。