乳腺癌21基因复发评分

乳腺癌有一个由21个基因组成,并且在指南里推荐了的复发评分模型。这个模型由Paik等提出。目前也有成熟的商品Oncotype DX

BreastRS_1

评分由以上6组基因组成,包括HER2组的GRB7、HER2;Proliferation组的Ki67、STK15、Survivin、CCNB1、MYBL2;Invasion组的MMP11、CTSL2;其他组的GSTM1、CD68、BAG1以及参考组的ACTB、GAPDH、RPLPO、GUS、TFRC。

各个基因使用qPCR获得CT值,然后用CT值计算获得最终的复发评分RS值。根据指南区分:低(RS < 26)、中(RS = 26到30)、高危RS(RS≥31)。另外,指南中对不同的年龄段也有了不同的RS划分。以下代码均为python。

测试用的CT值来源于迪安的一篇专利

# RSu 9.70;RS 60.00
ctDict = {
    "GRB7": 36.59, "HER2": 33.30,
    "ER": 34.78, "PgR": 34.86, "BCL2": 35.90, "SCUBE2": 37.84,
    "Survivin": 33.82, "Ki67": 35.00, "MYBL2": 34.76, "CCNB1": 33.21, "STK15": 35.42,
    "CTSL2": 38.55, "MMP11": 31.80,
    "CD68": 28.11, "GSTM1": 36.94, "BAG1": 34.83,
    "ACTB": 24.74, "GAPDH": 27.23, "RPLP0": 28.71, "GUS": 36.33, "TFRC": 31.21
}

RS计算公式如下:

def BreastRS(geneDict):
    # GRB7 group score = 0.9 × GRB7 + 0.1 × HER2 (if result < 8, then score is 8)
    HER2_gs = 0.9 * geneDict["GRB7"] + 0.1 * geneDict["HER2"]
    if HER2_gs < 8:
        HER2_gs = 8
    
    # ER group score = (0.8 × ER + 1.2 × PGR + BCL2 + SCUBE2) ÷ 4
    ER_gs = (0.8 * geneDict["ER"] + 1.2 * geneDict["PgR"] + geneDict["BCL2"] + geneDict["SCUBE2"]) / 4
    
    # proliferation group score = (Survivin + KI67 + MYBL2 + CCNB1 + STK15) ÷ 5 (if result < 6.5, then score is 6.5)
    Prolifieration_gs = (geneDict["Survivin"] + geneDict["Ki67"] + geneDict["MYBL2"] + geneDict["CCNB1"] + geneDict["STK15"]) / 5
    if Prolifieration_gs < 6.5:
        Prolifieration_gs = 6.5
    
    # invasion group score = (CTSL2 + MMP11) ÷ 2
    Invasion_gs = (geneDict["CTSL2"] + geneDict["MMP11"]) / 2

    # RSU = + 0.47 × GRB7 group score – 0.34 × ER group score + 1.04 × proliferation group score + 0.10 × invasion group score + 0.05 × CD68 – 0.08 × GSTM1 – 0.07 × BAG1
    RSu = 0.47 * HER2_gs - 0.34 * ER_gs + 1.04 * Prolifieration_gs + 0.1 * Invasion_gs + 0.05 * geneDict["CD68"] - 0.08 * geneDict["GSTM1"] - 0.07 * geneDict["BAG1"]
    
    # RS=0 if RSU<0; RS=20×(RSU–6.7) if 0≤RSU≤100; and RS=100 if RSU>100
    if RSu <= 0:
        RS = 0
    elif RSu >= 100:
        RS = 100
    else:
        RS = 20 * (RSu - 6.7)
    return RS

对于以上计算RS的方法,不同公司引用时都是一样的,但是还需要对CT值进行标准化,而标准化的方式各有不同

Paik文献中提到标准化的方式是把ΔCT值放缩到[0, 15]范围内,在github上找到一个oncotypedx的算法,基本参照了Paik文献的方式进行放缩,但是看了给的参考输入文件里并不是使用CT值作为原始输入(估计是相对量,这里也拿不到别人的对照组CT,因此无法使用2‐ΔΔCt 法来测试),另外这个算法也没有加入reference基因进行计算。

因此按照下面这个校正方法,并不能获得专利中的参考结果。

def scale_genefu(geneDict):
    scaleDict = {}
    geneList = [
        "GRB7", "HER2",
        "ER", "PgR", "BCL2", "SCUBE2",
        "Survivin", "Ki67", "MYBL2", "CCNB1", "STK15",
        "CTSL2", "MMP11",
        "CD68", "GSTM1", "BAG1"
    ]
    geneCT = []
    for g in geneList:
        geneCT.append(geneDict[g])
    for g in geneList:
        scaleCT = (geneDict[g] - min(geneCT)) / (max(geneCT) - min(geneCT)) * 15
        scaleDict[g] = scaleCT
    return scaleDict

scaleCTDict = scale_genefu(ctDict)
print(BreastRS(scaleCTDict))

根据观察 ,专利中的校正方法如下(可以理解为参考的初始量是10,每多一个CT就相当于初始量少1?):

def scale_d(geneDict):
    referenceCT = [geneDict["ACTB"], geneDict["GAPDH"], geneDict["RPLP0"], geneDict["GUS"], geneDict["TFRC"]]
    meanReferenceCT = sum(referenceCT) / len(referenceCT)
    scaleDict = {}
    for g in geneDict.keys():
        deltaCT = geneDict[g] - meanReferenceCT
        scaleCT = 10 - deltaCT
        scaleDict[g] = scaleCT
    return scaleDict
    
scaleCTDict = scale_d(ctDict)
print(BreastRS(scaleCTDict))