SAS

SAS PlotterでMirrored histogramを作図する

「SAS Plotter」はモダンなグラフを簡単に作成できるグラフマクロパッケージです。
このページではSAS Plotter version 1.3でMirrored histogramを作成する方法を解説します。

version 1.3からインストール方法が変更になりました。詳細は以下のページをご参照ください。

https://picolabs.jp/sasplotter_usage

Mirrored histogramとは

Mirrored historamとは、2つの変数の分布状況を比較するのに用いられるヒストグラムです。
一方の変数のヒストグラムを反転させることで、ヒストグラム同士が重ならないようになっており、単純にヒストグラムを作成するよりも比較しやすい利点があります。

傾向スコアマッチングはマッチ後の2群の傾向スコアの分布が重なっていることを確認する必要があるため、この作図はよく作成されます。

SASはMirrored histogramを作成する機能はありませんが、SAS Plotterを使用すれば簡単に作成することができます。

Input data

入力データは事前にproc univariateなどで集計したデータが必要です。そのため密度プロットを同時作成することはできません。
ただほとんどの場合ヒストグラムだけあれば十分なはずです。

key変数変数タイプ
1群変数数値
2カテゴリ(水準)変数数値
応答変数数値

群変数はコード値(1,2)にフォーマットを割り当てることで作成します。
カテゴリ変数は離散型である場合はフォーマットを割り当てることを推奨します。

文法

ods graphics / < graphics option > ;
ods listing gpath=< output path >;

%MirroredHist(
   data=,
   group=,
   x=,
   y=,
   xticks=None,
   yticks=,
   xaxistype=discrete,
   xlabel=x,
   ylabel=y,
   tickfmt=09.9,
   orient=v,
   legend=true,
   barwidth=1,
   outline=true,
   palette=sns,
   note=,
   deletedata=True
)

パラメータ

data : データセット(必須)

入力データ。keep, rename, whereオプションを併用できます。

group : 変数 (必須)

群変数

x : 変数(必須)

カテゴリ(水準)変数

y : 変数(必須)

応答変数

xticks : リスト(任意)

応答変数軸の目盛りを指定できます。半角スペースで区切られた数値リストを指定してください。数値は昇順で指定する必要があります。
設定しない(None)場合は、データから自動生成されます。デフォルトは”None”。

(例)xticks = 0.25 0.5 0.75 1,

yticks : リスト (必須)

応答変数軸の目盛りを指定できます。半角スペースで区切られた数値リストを指定してください。数値は昇順で指定する必要があります。
数値は正の数でなければなりません。また0が含まれない場合は自動で0を追加します。

(例)yticks = 0.1 0.2 0.3,

xaxistype: キーワード(任意)

カテゴリ(水準)軸の軸タイプを指定します。”linear”あるいは”discrete”のいずれかを指定してください。カテゴリ変数が連続変数の場合は”linear”を指定します。
デフォルトは”discrete”

xlabel : テキスト(任意)

カテゴリ軸のラベル。デフォルトはx変数のラベル。以下のように設定するとラベルは非表示となります。

xlabel=,

ylabel : テキスト(任意)

応答変数軸のラベル。デフォルトはy変数のラベル。以下のように設定するとラベルは非表示となります。

ylabel=,

ytickfmt: pictureフォーマット(任意)

応答変数軸のメモリのフォーマットをpictureフォーマット形式で指定します。詳細な設定方法はpictureフォーマットのSAS helpをご覧ください。
デフォルトは”09.9″(小数第1位まで表示します。)

orient : キーワード(任意)

作図の方向を指定します。v=垂直方向 h=水平方向。
デフォルトはv。

legend : 真偽値(任意)

Trueを指定すると凡例を表示します。groupオプションを”None”を指定するとこの引数は無視されます。 デフォルトはFalse。

barwidth : 数値(任意)

棒グラフの幅を指定します。0から1の数値を設定します。1に設定すると棒グラフの間のスペースがなくなります。 デフォルトは1。

outline: 真偽値(任意)

枠線の表示を切り替えます。デフォルトはTrue。

pallete : キーワード (オプション)

塗り、ライン、マーカーのカラーパレット、以下のパレットが利用可能です。デフォルトはSNS(seabornのデフォルトパレット

  • SAS
  • SNS (Seaborn)
  • STATA
  • TABLEAU

note: ステートメント(オプション)

グラフテンプレートにentryステートメントを挿入し、グラフタイトルまたはフットノートを表示します。デフォルトは””(表示しない)

deletedata: 真偽値(オプション)

マクロが作成した一時データを削除します。デフォルトはTrue(一時データを削除する)。

作図例

作図例はgithubのexample内にsasプログラムを格納しています。filenameステートメントを使えばすぐに実行できます。

ods listing gpath=<your output path>; 
filename exam url "https://github.com/Superman-jp/SAS_Plotter/raw/main/example/mirrored_histogram_example.sas" encoding="UTF-8"; 

%include exam;

反転ヒストグラムをあらかじめ集計されたデータが必要です。今回はsashelp.heartをproc univariateを用いて作成したヒストグラムデータを用います。

proc univariate data=sashelp.heart;
var diastolic systolic;
histogram   diastolic systolic /
outhistogram=histo
vscale=percent
noplot
midpoints=50 to 400 by 5;
run;
proc format;
value catf
1="Diastolic"
2="Systolic";
run;
data graph_data;
set histo;
if _VAR_="Diastolic" then cat=1;
if _VAR_="Systolic" then cat=2;
format cat catf.;
keep cat _midpt_ _obspct_;
run;

垂直方向のヒストグラム

proc univariateでヒストグラムの集計データを作成し、Mirrored histogramを作成します。

title "vertical mirrored histogram";
ods graphics / height=15cm width=25cm imagefmt=png imagename="mirroredhist_v";
%MirroredHist(
   data=graph_data,
   group=cat,
   x=_midpt_,
   y=_obspct_,
   xaxistype=linear,
   xticks=50 100 150 200 250 300,
   yticks=5 10 15 20 25,
   xlabel=Blood pressure (mmHg),
   note=%nrstr(entrytitle 'your title here';
            entryfootnote halign=left 'your footnote here';
            entryfootnote halign=left 'your footnote here 2';)
);
反転ヒストグラム(垂直方向)

 

Y軸の目盛りの桁数を小数第2位まで表示するにはytickfmtパラメータを以下のように設定します。

   title "mirrored histogram with y-tick format";
ods graphics / height=15cm width=25cm imagefmt=png imagename="mirroredhist_v_fmt";
%MirroredHist(
   data=graph_data,
   group=cat,
   x=_midpt_,
   y=_obspct_,
   xaxistype=linear,
   ytickfmt=09.00,
   xticks=50 100 150 200 250 300,
   yticks=5 10 15 20 25 ,
   xlabel=Blood pressure (mmHg)
);

 

y軸のフォーマットを設定

水平方向のヒストグラム(バラフライチャート)

orientパラメータをhに設定すると水平方向のヒストグラムを作成できます。バタフライチャートとも呼ばれています。

title "horizontal mirrored histogram (linear)";

ods graphics / height=15cm width=25cm imagefmt=png imagename="mirroredhist_h_linear";
%MirroredHist(
   data=graph_data,
   group=cat,
   x=_midpt_,
   y=_obspct_,
   xaxistype=linear,
   xticks=50 100 150 200 250 300,
   yticks=5 10 15 20 25,
   orient=h,
   xlabel=Blood pressure (mmHg),
   note=%nrstr(entrytitle 'your title here';
            entryfootnote halign=left 'your footnote here';
            entryfootnote halign=left 'your footnote here 2';)
);
反転ヒストグラム(水平方向、線形)

カテゴリ(水準変数)が離散的な区分の場合はxaxistype=discreteに設定します。これはデフォルトの設定であるため省略可能です。
discreteに設定し、orient=hと設定した場合はカテゴリ軸は反転します。

2021年の東京都におけるCOVID-19の性別感染者数を、年代別にヒストグラムを作成してましょう。

proc format;
value sexf
1="Male"
2="Female";
value agegrpf
1="<10"
2="10s"
3="20s"
4="30s"
5="40s"
6="50s"
7="60s"
8="70s"
9="80s"
10="90s"
11=">100"
99="unknown"
;
run;

data covid19_tokyo_2021;

infile datalines delimiter=",";
length sexc $10 agec $20 patients 8;
format sex sexf. agegrp agegrpf.;
input sexc $ agec $ patients;
select (sexc);
   when ("Male") sex=1;
   when("Female")sex=2;
end;
select(agec);
   when("<10") agegrp=1;
   when("10s") agegrp=2;
   when("20s") agegrp=3;
   when("30s") agegrp=4;
   when("40s") agegrp=5;
   when("50s") agegrp=6;
   when("60s") agegrp=7;
   when("70s") agegrp=8;
   when("80s") agegrp=9;
   when("90s") agegrp=10;
   when(">100") agegrp=11;
   when("unknown")agegrp=99;
end;
datalines;
Male,<10,8011
Male,10s,13821
Male,20s,49695
Male,30s,37503
Male,40s,30862
Male,50s,21952
Male,60s,8544
Male,70s,5202
Male,80s,2930
Male,90s,654
Male,>100,22
Male,unknown,4
Female,<10,7519
Female,10s,12359
Female,20s,43162
Female,30s,25594
Female,40s,20121
Female,50s,15931
Female,60s,6238
Female,70s,4872
Female,80s,4196
Female,90s,1765
Female,>100,116
;
run;

コード

title "horizontal mirrored histogram (discrete)";

ods graphics / height=15cm width=25cm imagefmt=png imagename="mirroredhist_h_discrete";
%MirroredHist(
   data=covid19_tokyo_2021,
   group=sex,
   x=agegrp,
   y=patients,
   xaxistype=discrete,
   yticks=0 10000 20000 30000 40000 50000,
   ytickfmt=%str(00,009),
   xlabel=age,
   ylabel=number of patients,
   orient=h
);
反転ヒストグラム(水平方向、離散)