导语
在肿瘤临床试验中,靶病灶直径总和的百分比变化是评估疗效的关键指标(RECIST 1.1标准),而蜘蛛图(Spider Plot)能直观展示每个患者疗效随时间变化的趋势,快速识别有效病例和疾病进展,因此具有重要使用价值。作为SAS程序员,掌握蜘蛛图的绘制技巧是刚需。接下来,本文将从数据格式、代码实现、结果解读等方面,手把手教你生成并理解专业级蜘蛛图!
一、什么是蜘蛛图?
定义:
蜘蛛图以基线百分比变化为纵轴、时间点为横轴,将每个患者的肿瘤靶病灶变化绘制为一条折线,形似“蜘蛛网”,所以把这种图称为蜘蛛图。
核心作用:
直观对比个体患者的疗效差异。
快速识别部分缓解(PR)、疾病进展(PD)等关键事件。
辅助判断药物疗效的稳定性和持续时间。
示例图:

二、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经验和国际化标准操作流程。