AE蝴蝶图纪录

参考资料:《Amazing Graph Series: Butterfly Graph Using SGPLOT and GTL》,可以在www.pharmasug.org网站上下载。

f_butterfly.png

摸鱼时看到一篇关于蝴蝶图的文章,跟着写一遍顺便纪录下来,数据集会附在最后。

**  options set  **;
ods escapechar="^";
ods _all_ close;
options ls=max;

**  create template  **;

proc template;
  define statgraph fly;
  begingraph;
  entrytitle "Summary of Most Frequent TEAEs (>=10% of Total) by Treatment and Toxicity Grade";
  entryfootnote halign=right "Data Extraction Date: &sysdate.T&systime.";
**  定义图例的颜色以及对应的变量  **;
    discreteattrmap name="name";
    value "Grade 1" / fillattrs=(color=CADETBLUE);
    value "Grade 2" / fillattrs=(color=bib);
    value "Grade 3" / fillattrs=(color=red);
    value "Grade 4" / fillattrs=(color=purple);
    enddiscreteattrmap;
  discreteattrvar attrvar=MYID_GRD var=grade attrmap="name";

**  定义布局,为左中右式布局  **;
  layout lattice / rowdatarange= union columnweights= (0.42 0.16 0.42) columns=3;
**  定义左侧  **;
  layout overlay / walldisplay=none
**  定义X轴范围 网格线  Y轴不显示**;
  xaxisopts=(tickvalueattrs=(size=7)
  display=(line tickvalues) griddisplay=on
  reverse=true linearopts=(viewmin=0 viewmax=70 
  tickvaluesequence=(start=0 end=70 increment=10)))

  yaxisopts=(display=none reverse=true);
**  定义柱子属性  **;
  barchart category=aedecod response=_1/
  group=myid_grd name="bar1"
  orient=horizontal dataskin=pressed segmentlabel=true segmentlabelattrs=(color=white);
  entry "Treatment 1 (N=&n1.)" / autoalign=(bottomleft);
  endlayout;

**  定义中间部分  **;
  layout overlay / xaxisopts=(display=none) walldisplay=none yaxisopts=(display=(tickvalues) 
  tickvaluehalign=center);
  barchart category=aedecod response=_1/ orient=horizontal datatransparency=1;
  endlayout;
**  定义右侧  **;
  layout overlay / walldisplay=none xaxisopts=(tickvalueattrs=(size=7) display=(line tickvalues)
  griddisplay=on linearopts=(viewmin=0 viewmax=70 tickvaluesequence=(start=0 end=70 increment=10)))
  yaxisopts=(display=none reverse=true);
  barchart category=aedecod response=_2/
  group=MYID_GRD orient=horizontal dataskin=pressed segmentlabel=true
  segmentlabelattrs=(color=white);
  entry "Treatment 2 (N=&n2.)" / autoalign=(bottomright);
  endlayout;
**  定义底部属性,sidebar可以用来放置附加信息,比如图例相关信息  **;
  sidebar / align=bottom;
  discretelegend "bar1" / across=1 halign=center title="Patients (%)"
  itemsize=(fillheight=10px fillaspectratio=golden) border=false;
  endsidebar;
  endlayout;
  endgraph;
  end;
run;
**  输出文件  **;
ods listing gpath="pathname";
ods graphics on/ reset imagename="f_butterfly" outputfmt=png width=1100px height=700px noborder;

proc sgrender data=fin template=fly;
run;

ods html close;
ods listing;
**  dummy data  **;
data adae; 
infile datalines delimiter = ','; 
input usubjid :$18. trta $ trtan aedecod :$200. aetoxgrn ; 
datalines; 
PHARM-ABC-100-0005, TRT A, 1, Bloating, 1 
PHARM-ABC-100-0005, TRT A, 1, Chills, 1 
PHARM-ABC-100-0005, TRT A, 1, Myalgia, 1 
PHARM-ABC-100-0005, TRT A, 1, Sinus tachycardia, 2 
PHARM-ABC-100-0005, TRT A, 1, Nausea, 3 
PHARM-ABC-101-0005, TRT A, 1, Hypotension, 3 
PHARM-ABC-101-0004, TRT A, 1, Bloating, 1 
PHARM-ABC-101-0004, TRT A, 1, Chills, 2 
PHARM-ABC-101-0004, TRT A, 1, Blood lactic acid increased, 1 
PHARM-ABC-101-0004, TRT A, 1, Diarrhoea, 1 
PHARM-ABC-101-0004, TRT A, 1, Hypoglycaemia, 1 
PHARM-ABC-101-0004, TRT A, 1, Hypomagnesaemia, 1 
PHARM-ABC-101-0004, TRT A, 1, Hypotension, 2 
PHARM-ABC-101-0004, TRT A, 1, Hypoxia, 2 
PHARM-ABC-101-0004, TRT A, 1, Nausea, 1 
PHARM-ABC-101-0004, TRT A, 1, Pollakiuria, 1 
PHARM-ABC-101-0004, TRT A, 1, Skin infection, 2 
PHARM-ABC-101-0004, TRT A, 1, Thrombocytopenia, 2 
PHARM-ABC-101-0005, TRT A, 1, Arthralgia, 1 
PHARM-ABC-101-0005, TRT A, 1, Back pain, 1 
PHARM-ABC-101-0005, TRT A, 1, Bloating, 1 
PHARM-ABC-101-0005, TRT A, 1, Cough, 1 
PHARM-ABC-101-0005, TRT A, 1, Dyspnoea exertional, 1 
PHARM-ABC-101-0005, TRT A, 1, Fatigue, 1 
PHARM-ABC-101-0005, TRT A, 1, Nausea, 1 
PHARM-ABC-101-0005, TRT A, 1, Oropharyngeal pain, 1 
PHARM-ABC-101-0005, TRT A, 1, Tachycardia, 1 
PHARM-ABC-101-0006, TRT A, 1, Bloating, 2 
PHARM-ABC-101-0006, TRT A, 1, Hypotension, 2 
PHARM-ABC-101-0006, TRT B, 2, Hypoxia, 2 
PHARM-ABC-101-0006, TRT B, 2, Nausea, 1 
PHARM-ABC-101-0006, TRT B, 2, Pleural effusion, 2 
PHARM-ABC-101-0006, TRT B, 2, Tachycardia, 2 
PHARM-ABC-101-0006, TRT B, 2, Thrombocytopenia, 1 
PHARM-ABC-102-0004, TRT B, 2, Abdominal pain upper, 3 
PHARM-ABC-102-0004, TRT B, 2, Cough, 1 
PHARM-ABC-102-0004, TRT B, 2, Hypoxia, 1 
PHARM-ABC-102-0004, TRT B, 2, Nausea, 1 
PHARM-ABC-102-0004, TRT B, 2, Pulmonary embolism, 2 
PHARM-ABC-102-0004, TRT B, 2, Skin laceration, 1 
PHARM-ABC-102-0005, TRT B, 2, Abdominal discomfort, 1 
PHARM-ABC-102-0005, TRT B, 2, Adrenal insufficiency, 2 
PHARM-ABC-102-0005, TRT B, 2, Arthralgia, 2 
PHARM-ABC-102-0005, TRT B, 2, Bloating, 1
PHARM-ABC-102-0005, TRT B, 2, Chest discomfort, 1 
PHARM-ABC-102-0005, TRT B, 2, Chills, 2 
PHARM-ABC-102-0005, TRT B, 2, Decreased appetite, 1 
PHARM-ABC-102-0005, TRT B, 2, Fatigue, 2 
PHARM-ABC-102-0005, TRT B, 2, Hepatitis, 1 
PHARM-ABC-102-0005, TRT B, 2, Hypoxia, 1 
PHARM-ABC-102-0005, TRT B, 2, Myalgia, 1 
PHARM-ABC-102-0005, TRT B, 2, Pain in extremity, 1 
PHARM-ABC-102-0005, TRT B, 2, Skin mass, 1
;
run; 

** Add Total Treatment group **;
data adae1; 
    set adae;
    output; 
    trtan = 99;
    trta = 'Total'; 
    output; 
run; 

** Count Bign **;
proc sql noprint;
select count(distinct usubjid) into :n1 trimmed from adae1 where trtan=1;
select count(distinct usubjid) into :n2 trimmed from adae1 where trtan=2;
select count(distinct usubjid) into :n3 trimmed from adae1 where trtan=99;
quit;

proc sort data = adae1(where=(aedecod ne "")); 
by trtan usubjid aedecod descending aetoxgrn; 
run; 
data ae_max; 
set adae1; 
by trtan usubjid aedecod descending aetoxgrn; 
if first.aedecod; 
run; 

proc freq data=ae_max noprint;
table aedecod*trtan*aetoxgrn/out=freq1(drop=percent);
run;

proc freq data=ae_max noprint;
table aedecod*trtan/out=freq2(drop=percent);
run;

proc transpose data=freq2 out=freq3 prefix=_;
by aedecod;
id trtan;
var count;
run;

data temp1;
    set freq1;
    if trtan=1 then perc=input(put((count / &n1)*100,5.),8.);
    if trtan=2 then perc=input(put((count / &n2)*100,5.),8.);
    if trtan=99 then perc=input(put((count / &n3)*100,5.),8.);
run;

proc sort data=temp1;
by aedecod aetoxgrn trtan;
run;

proc transpose data = temp1 out = temp2 (drop = _name_) prefix=_; 
    by aedecod aetoxgrn; 
    id trtan; 
    var perc; 
run; 

data temp2;
    set temp2;
    if _1=. then _1=0;
    if _2=. then _2=0;
proc sort;
by aedecod;
run;

data temp3;
    set freq3;
    perc99=input(put((_99 / &n3)*100,5.),8.);
    keep aedecod perc99;
proc sort;
by aedecod;
run;

data fin;
    merge temp2 temp3;
    by aedecod;
    if perc99>=10;
    grade="Grade "||strip(put(aetoxgrn,8.));
    tox=put(aetoxgrn,best.);
/*  _1=-_1;*/
    label
    aedecod = "Preferred Term"
    _1= "Percent Subjects Trt A"
    _2= "Percent Subjects Trt B"
    perc99= "Percent Subjects Total";
proc sort;
by descending perc99;
run;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容