EN
【技术】临床试验必备!如何用SAS绘制靶病灶变化的蜘蛛图?
2026-03-23 15:59

技术】临床试验必备!如何用SAS绘制靶病灶变化的蜘蛛图?

  导语  

在肿瘤临床试验中,靶病灶直径总和的‌百分比变化‌是评估疗效的关键指标(RECIST 1.1标准),而‌蜘蛛图(Spider Plot)‌能直观展示每个患者疗效随时间变化的趋势,快速识别有效病例和疾病进展,因此具有重要使用价值。作为SAS程序员,掌握蜘蛛图的绘制技巧是刚需。接下来,本文将从‌数据格式、代码实现、结果解读等方面,手把手教你生成并理解专业级蜘蛛图!

   一、什么是蜘蛛图? 

定义‌:

蜘蛛图以‌基线百分比变化‌为纵轴、‌时间点‌为横轴,将每个患者的肿瘤靶病灶变化绘制为一条折线,形似“蜘蛛网”,所以把这种图称为蜘蛛图。


核心作用‌:

  •    直观对比个体患者的疗效差异。

  •    快速识别部分缓解(PR)、疾病进展(PD)等关键事件。

  •    辅助判断药物疗效的稳定性和持续时间。


示例图‌:

image.png


  二、SAS实现蜘蛛图的关键代码  

1. 数据格式要求‌

需包含以下变量:

  •    患者ID‌:唯一标识符。

  •    时间点‌:基线(如Screening)、访视1(V1)、访视2(V2)等。

  •    靶病灶总和‌:各时间点的靶病灶直径总和(单位:mm)。

  •    基线总和‌:基线时的靶病灶总和(用于计算百分比变化)。

  •    疗效评估达到CR/PR/SD/PD/NE的周数。


2. 绘图代码示例:

/*定义图形模板,命名为spider*/

proc template;

  define statgraph spider;

/*开始图形定义*/

    begingraph / designwidth=1090 designheight=800 border=false backgroundcolor=white;


/*%if &nobs_cr^=0表示存在CR的观测时(下同),定义图例项格式:标签(LABELATTRS=)颜色和字体,符号(markerattrs=)的类型(实心菱形等)和颜色等,在discretelegend处应用*/

   %if &nobs_cr^=0 %then %do;

   legenditem type=marker  name="S1" / LABELATTRS=(color=black  family="Times New Roman/宋体" size=7) markerattrs=(color=bioy symbol=DiamondFilled size=6)  label="CR" ;

   %end;

   %if &nobs_pr^=0 %then %do;

    legenditem type=marker  name="S2" / LABELATTRS=(color=black  family="Times New Roman/宋体" size=7) markerattrs=(color=BIPPK symbol=starfilled size=6)  label="PR" ;

   %end;

   %if &nobs_sd^=0 %then %do;

   legenditem type=marker  name="S3" / LABELATTRS=(color=black  family="Times New Roman/宋体" size=7) markerattrs=(color=VIBG symbol=SquareFilled size=6)  label="SD" ;

   %end;

   %if &nobs_pd^=0 %then %do;

   legenditem type=marker  name="S4" / LABELATTRS=(color=black  family="Times New Roman/宋体" size=7) markerattrs=(color=MOOLBR symbol=circlefilled size=6)  label="PD" ;

   %end;

   %if &nobs_ne^=0 %then %do;

   legenditem type=marker  name="S5" / LABELATTRS=(color=black  family="Times New Roman/宋体" size=7) markerattrs=(color=red symbol=plus size=6)  label="NE" ;

   %end;

/*设置图形布局*/

   layout overlay / walldisplay=none/*不显示背景墙*/

/*设置Y轴属性,设置标签(labelattrs=)属性,设置刻度值(tickvalueattrs=)属性*/

   yaxisopts=(gridDisplay=off/*不显示网格*/ LABEL=%nrstr("靶病灶直径和相较于基线变化百分比(%)")  labelattrs=(size=10  family="Times New Roman/宋体")  tickvalueattrs=( size=8pt  family="Times New Roman/宋体")

   linearopts=(tickvaluesequence=(start=-100 end=100 increment=20)  tickvaluefitpolicy=none  tickvaluepriority=true ))

/*设置X轴属性,设置标签(labelattrs=)属性,设置刻度值(tickvalueattrs=)属性*/

    xaxisopts=(display=(ticks tickvalues line label) gridDisplay=off label="自首次给药时长(周)"  labelattrs=(size=10 family="Times New Roman/宋体") 

   tickvalueattrs=( size=8pt  family="Times New Roman/宋体") linearopts=(tickvalueformat=BEST6. tickvaluelist=(0 6 12 18 24 33 42 51 60) tickvaluepriority=true));

/*绘制线性*/

   seriesplot x=rsdy y=pchg/group=subjid  name="subjid_l" lineattrs=(thickness=1)

   lineattrs=(pattern=solid);

/*绘制散点*/

   %if &nobs_cr^=0 %then %do;

   scatterplot x=crdy y=pchg /group=subjid markerattrs=(color=bioy symbol=DiamondFilled size=6);

   %end;

   %if &nobs_pr^=0 %then %do;

   scatterplot x=prdy y=pchg /group=subjid markerattrs=(color=BIPPK symbol=starfilled size=6);

   %end;

   %if &nobs_sd^=0 %then %do;

   scatterplot x=sddy y=pchg /group=subjid markerattrs=(color=VIBG symbol=SquareFilled size=6);

   %end;

   %if &nobs_pd^=0 %then %do;

   scatterplot x=pddy y=pchg /group=subjid markerattrs=(color=MOOLBR symbol=circlefilled size=6);

   %end;


/*添加参考线*/

   REFERENCELINE y=-30 / LINEATTRS=( PATTERN=DASH COLOR=black);

   REFERENCELINE y=0 / LINEATTRS=( PATTERN=DASH COLOR=black);

   REFERENCELINE y=20 / LINEATTRS=( PATTERN=DASH COLOR=black);


/*添加图例*/

   discretelegend  "S1" "S2" "S3" "S4" "S5" / title="总体疗效评估" titleattrs=(family="Times New Roman/宋体" size=8pt) location=inside halign=right valign=top border=true across=1;

    discretelegend  "subjid_l"/ across=9  location=outside halign=center valign=center valueattrs=(size=7pt);

     endlayout;

   endgraph;

  end;

run;


proc sgrender data=final template=spider;

run;

  三、结果解读:如何分析蜘蛛图?

1. 疗效判定依据(RECIST 1.1标准)‌

靶病灶评估:

  •    CR:所有靶病灶消失,全部病理淋巴结(包括靶结节和非靶结节)短直径必须减少至<10 mm。

  •    PR:靶病灶直径之和比基线水平减少至少30%。

  •    PD:以整个实验研究过程中所有测量的靶病灶直径之和的最小值为参照,直径和相对增加至少20%(如果基线测量值最小就以基线值为参照);除此之外,必须满足直径和的绝对值增加至少5 mm(出现一个或多个新病灶也视为疾病进展)。

  •    SD:靶病灶减小的程度没达到PR,增加的程度也没达到PD水平,介于两者之间,研究时可以直径之和的最小值作为参考。

2. 图表分析要点‌

  •    图标含义:

  •    横轴为访视时间点。

  •    纵轴为靶病灶直径和较基线的百分比变化。

  •    每条折线代表一个受试者,用不同颜色表示,与底部图例的受试者编号和颜色对应。

  •    折线上的点表示对应时间点的总体疗效评估,与右上角不同形状的图例对应。

  •   -30,0,20的虚线为辅助线,方便查看靶病灶直径和较基线的百分比变化。

  •    疗效状态:

  •    缓解(Response):线头最终稳稳停在-30%以下。

  •    稳定(Stable Disease): 线头在 -30% 和 +20% 之间徘徊。线越长,说明稳定时间越久。

  •    进展(Progression):线头突破 +20%线并持续向上。

  •    特殊模式:

  •    深度缓解: 线头深深扎入图表底部,说明疗效非常好。

  •    迟发性缓解: 先稳定,后下降,提示药物起效可能需要时间。

  •    疾病反弹: 先下降后急剧上升,可能意味着耐药的发生。

举例说明:

1)如患者S1在前几个访视为SD,在33周为PD,可能表示对该受试者治疗效果不佳。

2)如患者S4靶病灶直径和相较于基线变化百分比降低超过80%,前33周疗效评估为PR,在接近42周的时候评估为PD,有可能是出现新病灶等原因,需要综合评估。

  四、实战技巧与避坑指南‌  

1. 数据清洗‌

  •    确保基线数据唯一(每个患者仅一条Screening记录)。

  •    排除缺失值:若某访视点无数据,折线自动断开。

2. 图表优化‌

  •    颜色区分‌:为不同疗效状态分配颜色(如CR=黄色,SD=绿色)。

  •    当图形重叠过多时,调整透明度来增强可读性。

  五、蜘蛛图的优势与局限  

1. 优势

  •    ‌直观展示个体数据变化‌:特别适合展示时间序列数据。

  •    ‌多变量比较‌:可以同时比较多个维度的数据。

  •    ‌医学研究价值‌:在肿瘤临床试验中是不可或缺的分析工具。

2. 局限

  •    ‌数据过多时易混乱‌:当受试者数量过多时,图表可能难以阅读。

  •    ‌需要专业解读‌:非专业人士可能难以理解复杂的蜘蛛图。

  •    ‌SAS实现复杂度‌:相比其他统计软件,SAS中实现蜘蛛图可能需要更复杂的代码。

  结语‌  

虽然在SAS中实现蜘蛛图需要一定的编程技巧,但其在数据可视化方面的价值——既能呈现个体轨迹,又能揭示群体趋势,还是值得我们研究和实践。本文代码可直接套用,赶紧收藏备用吧!

数统部

     CLIN-NOV

图片

聚焦提供合规、专业、及时和国际标准的数据管理和统计编程服务:来自Global药厂和CRO的数统核心人才,稳定且专业;超120人的数统服务团队,服务100+国内外创新药企,实施500+个数统项目;中国第一家CDISC 企业会员,有着丰富的CDISC经验和国际化标准操作流程。




我们如何帮您呢?凯莱英临床(凯诺)专业团队为您尽快提供服务