专栏首页老Z的博客Annotate Facility之生存曲线

Annotate Facility之生存曲线

在研究肿瘤的临床实验中,通常要进行生存分析。其中最重要的分析方法之一就是乘积极限法(product-limit),简称积限法或PL法,它是由统计学家Kaplan和Meier提出来的,故又称为Kaplan-Meier法,是用来估计生存曲线的方法。下面就介绍如何用Annotate Facility来画上面的生存曲线。

在画图之前,有两个选项需要弄清楚,即AXIS语句中的ORIGIN和OFFSET选项。从下图可以看出,ORIGIN指原点的位置,当我们需要在X轴或Y轴外侧预留更多空间时,就需要调整ORIGIN(x, y)的值;OFFSET用来指定原点与第一个刻度或者最后一刻度与X轴(或Y轴)之间的距离。当首尾刻度标签很长时以及曲线和整个图形的框架的顶部线条重合时为了显示美观就要调整OFFSE(x, y)的值。

如果在上述生存曲线中不设置OFFSET,那么结果将会是这样的:

从上图可以看出,当X轴没有设置OFFSET时,第一个刻度和原点重合了;当Y轴没有设置OFFSET时,第一个刻度和原点重合了,最后一个刻度与整个图形的框架的顶部线条重合了,这也就导致了曲线开始一段和整个图形的框架的顶部线条重合了,这样的图不就美观了。

理解了ORIGIN和OFFSET用法之后,我们就要开始做Annotation的数据集了。首先是通过宏%LABEL将字符串‘NUMBER OF SUBJECTS AT RISK’、'TRT A'、'TRT B'写到图片上;接着通过宏%LABEL将‘NUMBER OF SUBJECTS AT RISK’对应的具体数字写到图片上;最后是用宏%LINE画X轴的刻度。因为图中X轴的刻度显示是不连续的,故无法使用AXIS语句中MAJOR选项。生成上述三个数据集的程序如下:

/*字体*/
%let ftext ='Albany AMT/roman/medium';

/*编译宏*/
%annomac;

data anno1;
    length TEXT $200.;
    %system(3, 3);
    %label(7, 10, "NUMBER OF SUBJECTS AT RISK", black, 0, 0, 1, &ftext., 6);
    %label(0, 6, "TRT A", black, 0, 0, 1, &ftext., 6);
    %label(0, 2, "TRT B", black, 0, 0, 1, &ftext., 6);
run;

data anno2;
    set demo;
    length TEXT $200.;
    %system(2, 3);
    if not missing(LEFT) then do;
        if TRT=1 then do; %label(TIME, 6, cats(LEFT), black, 0, 0, 1, &ftext., 5); end;
        else if TRT=2 then do; %label(TIME, 2, cats(LEFT), black, 0, 0, 1, &ftext., 5); end;
    end;
run;

data anno3;
    %system(2, 3);
    %line(0, 23.9, 0,  22.7, black, 1, 1);
    %line(1, 23.9, 1,  22.7, black, 1, 1);
    %line(2, 23.9, 2, 22.7, black, 1, 1);
    %line(4, 23.9, 4, 22.7, black, 1, 1);
    %line(8, 23.9, 8, 22.7, black, 1, 1);
    %line(12, 23.9, 12, 22.7, black, 1, 1);
    %line(16, 23.9, 16, 22.7, black, 1, 1);
    %line(20, 23.9, 20, 22.7, black, 1, 1);
    %line(24, 23.9, 24, 22.7, black, 1, 1);
run;

data anno;
    set anno1 anno2 anno3;
run;

接下来就是设置坐标和图例的属性了,程序如下:

/*曲线属性*/
symbol1 c=black l=1 w=1 v=none i=steplj;
symbol2 c=blue l=3 w=1 v=none i=steplj;

/*坐标轴*/
axis1 minor=none order=(80 to 100 by 5) label=(a=90 j=c h=1 "SUBJECTS REMAINING ON THERAPY (%)")
offset=(1, 1) origin=(8.0, 7.5) value=("80" "85" "90" "95" "100");

axis2 minor=none major=none order=(0 to 25 by 1) label=(a=0 j=c h=1 "STUDY WEEKS")
origin =(8.0, 7.5) offset=(2,0) value=("B/L" "1" "2" "" "4" "" "" "" "8" "" "" "" "12" "" "" "" "16" "" "" "" "20" "" "" "" "24" "") ;

/*图例*/
legend1  position=(left inside) label=none frame mode=share across=1
         value =(h=1 c=black t=1 "TRT A"
                             t=2 "TRT B")  
         offset=(1, 1);

goptions ftext=&ftext hsize=24cm vsize=10cm noborder;

/*画图*/
ods listing close;
proc gplot data=demo(where=(not missing(SURVIVAL)));
    plot SURVIVAL*TIME=TRT
                      /haxis=axis2
                      vaxis=axis1
                      anno=anno
                      legend=legend1;
run ;
quit;

ods rtf close;

到这里整个图形就算画好了,当然有的时候我们还会碰到要用特殊的符号来显示删失(Censored)的情况,比如用小长方形,那我们就可以用以下的程序来实现:

data anno;
    set productlimitestimates(where=(CENSOR=1));
    %system(2, 2);
    if TRT=1 then do;
        %BAR(TIME-0.03, SURVIVAL-0.5, TIME+0.03, SURVIVAL+0.5, black, 0, s);
        %BAR2(TIME-0.03, SURVIVAL-0.5, TIME+0.03, SURVIVAL+0.5, black, 0, s, 0.5);
    end;
    else if TRT=2 then do;
        %BAR(TIME-0.03, SURVIVAL-0.5, TIME+0.03, SURVIVAL+0.5, black, 0, e);
        %BAR2(TIME-0.03, SURVIVAL-0.5, TIME+0.03, SURVIVAL+0.5, black, 0, e, 0.5);
    end;
run;

结果如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 批量改变SAS数据集字符型变量的长度

    临床试验的SAS程序猿/媛都知道,FDA对所提交的数据集的大小是有限定的,因为数据集过大在操作时会有点麻烦(比如打开会很慢),所以当我们生成最终的数据集时就要进...

    专业余码农
  • SAS删除字符串中的重复项

    SAS程序猿/媛有时候会碰到去除字符串中重复值的问题,用常用的字符函数如SCAN,SUBSTR可能会很费劲,用正则表达式来处理就简单了。示例程序如下:

    专业余码农
  • 认识Annotate Facility

    说到Annotate Facility,首先要感谢我的同事Jason,是他让我认识了Annotate Facility。Jason不仅是个画图高手,他的统计更是...

    专业余码农
  • (转载)Introduction to modern network load balancing and proxying

    今天看学院君关于代理的介绍,发现自己对代理这玩意有点陌生,对那啥负载均衡也是仅仅处在面试背了一丢丢,现在都忘完了。于是上网搜了搜相关的文章,加深...

    仇诺伊
  • 移动端UC /QQ 浏览器的部分私有Meta 属性

    如同桌面端一样,在国内做web 移动开发的话肯定得考虑下移动端占有率靠前的几个国产浏览器的一些适配工作。好在当前移动端浏览器都是wekit 内核一霸天下,单从这...

    Jeff
  • 通俗易懂PHP基础【11-类和对象(3)】

    你若爱,生活哪里都可爱。你若恨,生活哪里都可恨。你若感恩,处处可感恩。你若成长,事事可成长。不是世界选择了你,是你选择了这个世界。既然无处可躲,不如傻乐。既然无...

    Lemon黄
  • NameError: name 'admin' is not defined(彻底解决方案)

    1 查看model.py文件,具体操作如: root@ubuntu118:/home/python/work/mysite/mysite/blo...

    闵开慧
  • 推荐一个小而美的Python代码格式化工

    代码可读性是评判代码质量的标准之一,有一个衡量代码质量的标准是 Martin 提出的 “WFT” 定律,即每分钟爆出 “WTF” 的次数。你在读别人代码或者做 ...

    py3study
  • OpenVINO + OpenCV实现点头与摇头识别验证

    OpenVINO支持头部姿态评估模型,预训练模型为:head-pose-estimation-adas-0001,在三个维度方向实现头部动作识别,它们分别是:

    OpenCV学堂
  • 【AlphaGo Zero 核心技术-深度强化学习教程笔记08】整合学习与规划

    【导读】Google DeepMind在Nature上发表最新论文,介绍了迄今最强最新的版本AlphaGo Zero,不使用人类先验知识,使用纯强化学习,将价值...

    WZEARW

扫码关注云+社区

领取腾讯云代金券