2019年8月22日木曜日

Kaplan-Meier Curveを作成してみる(SGPLOT)②

こんにちは。
前回はモノクロのKM曲線作成について投稿を行いました。
その際最後の方でも触れましたが、第2回は色、シンボル、線種を群ごとに指定する方法、
また好きな色を使用する簡単な方法を紹介したいと思います。

サンプルデータ作成と、At risk用のデータ加工については前回の投稿と全く同じになりますので、
そちらをご覧ください。

SGPLOTでグラフを作成する際、群やグループごとにATTRSの指定を行うステートメント
として、STYLEATTRSステートメントがあります。
このステートメントでは以下の指定ができます。

*DATACOLORS=(color-list)
*DATACONTRASTCOLORS=(color-list)
*DATALINEPATTERNS=(line-pattern-list)
*DATASYMBOLS=(marker-symbol-list)

プログラム例
proc sgplotdata=class;
  styleattrs
    datacontrastcolors=(red green)
    datalinepatterns=(dot solid)

    datasymbols=(circlefilled x);
  series x=height y=weight / group=age;
run;


ということなので、前回のSGPLOTのプログラム部分に、
styleattrs datacontrastcolors=(red green) datalinepatterns=(dot solid) datasymbols=(circlefilled x);
を試しに入れてみましょう(ただし、ATTRSにおいてcolor=やsymbol=で指定している部分は削除すること)。

ods graphics / width=1100px height=700px border=off
               reset=index imagename= "KMcurve" imagefmt=tiff ;

proc sgplot data = sgplot2 noautolegend;

  styleattrs datacontrastcolors=(red green)
             datalinepatterns=(dot solid) 
             datasymbols=(circlefilled x);

  step x=Time y=Survival / group=StratumNum
       lineattrs=(thickness=2) name="a" ;

  scatter x=Time y=Censored / group=StratumNum
          markerattrs=(size=15) ;

  xaxistable AtRisk / x=tAtRisk class=StratumNum
             valueattrs=(size=13) labelattrs=(size=13)
             title="No. at Risk" titleattrs=(size=13);

  yaxis values=(0 to 1 by 0.1)
        label="Probability of Overall Survival"
        valueattrs=(size=13) labelattrs=(size=13);

  xaxis values=(0 to 24 by 3) offsetmin=0.03 offsetmax=0.02
        label="Time(Months)" valueattrs=(size=13)
        labelattrs=(size=13);

  keylegend "a" / location = inside position = topright
            titleattrs=(size=13)valueattrs=(size=13)
            acros=1 noborder ;

  format StratumNum treat. ;

run;

完成図は以下になります。
これでActiveとControlの体裁を分けることが出来ました。


さて、ここからは色をもっと自由に指定してみようという話になります。
SASでの色の指定は以下のようにいくつか方法があります。
・Color(Red,Green,Blue)
・RGB (CXFF0000,CX00FF00,CX0000FF)
・CMYK (00FFFF00,FF00FF00,FFFF0000)

・HLS (H07880FF,H0F080FF,H00080FF)
・HSV , またはHSB (V000FFFF,V078FFFF,V0F0FFFF)
・Gray scale (GRAYFF,GRAYC0,GRAY40)


ここで、それなりに馴染みがあって自由度が高そうなRGB値というものがあります。
CXFF0000など例を挙げていますが、16進数の値になっており、
もちろんこれはRGB値から変換された値になります。
それではこのRGB値から変換してもらうマクロを作れば様々な色に対応できる!
ということで、実際このマクロを作成している方がいらっしゃいました。
それがRickさんのRGBマクロになります。以下そのブログのリンクです。
https://blogs.sas.com/content/iml/2012/10/22/whats-in-a-name.html

%macro hex2(n);
  %local digits n1 n2;
  %let digits = 0123456789ABCDEF;
  %let n1 = %substr(&digits, &n / 16 + 1, 1);
  %let n2 = %substr(&digits, &n - &n / 16 * 16 + 1, 1);  &n1&n2
%mend hex2;

%macro RGB(r,g,b);
  %cmpres(CX%hex2(&r)%hex2(&g)%hex2(&b))
%mend RGB;

こんな短いプログラムになっています。
それではこのマクロを実行して、好みの?KM曲線にしてみます。

proc sgplot data = sgplot2 noautolegend;

  styleattrs datacontrastcolors=(%RGB(0,191,196) %RGB(248,118,109))
             datalinepatterns=(1 20)
             datasymbols=(triangle circle));


  step x=Time y=Survival / group=StratumNum
       lineattrs=(thickness=2) name="a" ;

  scatter x=Time y=Censored / group=StratumNum
          markerattrs=(size=15) ;

  xaxistable AtRisk / x=tAtRisk class=StratumNum
             valueattrs=(size=13) labelattrs=(size=13)
             title="No. at Risk" titleattrs=(size=13);

  yaxis values=(0 to 1 by 0.1)
        label="Probability of Overall Survival"
        valueattrs=(size=13) labelattrs=(size=13);

  xaxis values=(0 to 24 by 3) offsetmin=0.03 offsetmax=0.02
        label="Time(Months)" valueattrs=(size=13)
        labelattrs=(size=13);

  keylegend "a" / location = inside position = topright
            titleattrs=(size=13)valueattrs=(size=13)
            acros=1 noborder ;

  format StratumNum treat. ;

run;

完成図は以下になります。













とこんな体裁になります!
今回の投稿はどのグラフにも応用できるので、推移図やvar plotにもお試しください。

次回でKMは最後になります!
信頼区間の帯のプロットについてです。

おわり

0 件のコメント:

コメントを投稿

Kaplan-Meier Curveを作成してみる(SGPLOT)③

こんにちは。 第3回です。今回は前回色をつけたKM曲線に、信頼区間の帯も付け加えたいと思います。 信頼区間の帯については、BANDステートメントを使用いたします。 前回同様、サンプルデータの作成、RGBマクロは同じですので、第1回、第2回をご参照ください。 ここからは少...