SAS

SAS Plotterで二次元KDEプロットを作図する

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

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

SAS Plotterの使用方法「SAS Plotter」はモダンなグラフを簡単に作成できるグラフマクロパッケージです。 このページではSAS Plotter Ver...

二次元KDEプロットとは

二次元KDEプロットはKDE(カーネル密度推定)を用いて確率密度をノンパラメトリックに推定し、2変量間の分布を可視化する作図手法です。
単変量の分布として周辺密度も同時表示することが多いようです。SASではproc kdeを用いて推定することができます。

2変量の分布は等高線、単変量の分布は密度プロットとして表示されます。さらに散布図やラグプロットを用いることで、実際のデータと推定された分布を比較することができます。

proc kdeのデフォルトは、pythonの作図パッケージであるseabornで採用されているバンド幅推定アルゴリズムと異なりますので、両者は異なる結果となります。
proc kdeのデフォルトアルゴリズムはマルチモーダルな分布の推定に強いため、特に理由がなければデフォルトのままで利用するほうが良いと思います。

Input data

key変数変数タイプ
1群変数数値または文字列
X変数数値
Y変数数値

群変数はコード値にフォーマットを割り当てることで作成します。

文法

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

%macro kde2d(
         data=,
         group=None,
         x=,
         y=,
         xlabel=x,
         ylabel=y,
         univar_grid=401,
         bw_method=sjpi,
         bw_adjust=1,
         univar_style=line,
         bivar_grid=60,
         bivar_nlevel=10,
         bivar_style=line,
         thresh=0,
         legend=true,
         legendtitle=#,
         scatter=false,
         palette=sns
);

パラメータ

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

入力データセット。keep, renameおよびwhereオプションが利用可能です。

group : 変数(必須)

群変数。群変数が指定されていない場合、判例は自動で非表示となります。

x : 変数(必須)

x軸の数値変数

y : 変数(必須)

y軸の数値変数

xlabel : テキスト(オプション)

X軸の軸ラベル。
デフォルトはx変数のラベル。 ラベルを非表示にする場合は以下のように設定します。

xlabel=,

ylabel : テキスト(オプション)

y軸の軸ラベル。
デフォルトはy変数のラベル. ラベルを非表示にする場合は以下のように設定します。

ylabel=,

univar_grid : 整数(オプション)

単変量KDEのグリッドサイズ。デフォルトは401(proc kdeのデフォルト)

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

単変量KDEのバンド幅推定方法。デフォルトは”sjpi” (proc kdeのデフォルト)。
以下のキーワードが指定可能です。

  • sjpi (Sheather-Jones plug-in)
  • snr (simple normal reference)
  • srot (Silverman’s rule of thumb)
  • os (oversmoothed)

bw_adjust : 数値(オプション)

単変量KDEのバンド幅のファクター。値を大きくすると曲線が滑らかになります。デフォルトは1。

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

単変量KDEの表示スタイル。以下のキーワードが指定可能です。

  • line
  • fill

bivar_grid : 整数(オプション)

2変量KDEのグリッドサイズ。デフォルトは60 (proc kdeのデフォルト).

bivar_nlevel : 整数(オプション)

2変量KDEの等高線の水準数。デフォルトは10。

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

2変量KDEの表示スタイル。以下のキーワードが指定可能です。

  • line
  • fill
  • linefill

thresh : 0から1までの数値(オプション)

2変量KDEの密度の閾値。閾値以下の密度は2変量KDEプロットから除外されます。デフォルトは0。

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

Trueの場合は散布図を作成します。デフォルトはFalse。

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

Trueの場合ラグプロットを作成します。デフォルトはFalse。

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

Trueの場合は群の凡例を表示します。デフォルトは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/kde2d_example.sas" encoding="UTF-8"; 

%include exam;

 

今回はseabornのテストデータであるpenguinesのデータを用いて作図してみましょう。

filename raw url "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv";

PROC IMPORT OUT= WORK.penguines
            DATAFILE= raw
            DBMS=CSV REPLACE;
   GETNAMES=YES;
   DATAROW=2;
   guessingrows=max;
RUN;

群別二次元KDEプロット

groupオプションを指定するとKDEプロットは群別に作成されます。各群の色はpaletteパラメータで指定したカラーパレットによって決定されます。

ods listing gpath=<your path>;
ods graphics /  height=24cm width=24cm imagename="groupedKDE" imagefmt=svg;

title "grouped KDE plot";
ods graphics /  height=24cm width=24cm imagename="groupedKDE" imagefmt=png;
%kde2d(
   data=penguines,
   x=bill_length_mm,
   y=bill_depth_mm,
   group=species,
   univar_style=line,
   bivar_nlevel=10,
   bivar_style=line,
   xlabel=bill_length (mm),
   ylabel=bill_depth (mm),
   legend=true,
   note=%nrstr(entrytitle 'your title here';
               entryfootnote halign=left 'your footnote here';
            entryfootnote halign=left 'your footnote here 2';)

);
群別KDEプロット

KDEプロットの表示スタイル

単変量KDEプロットはLINEおよびFILLの2つのスタイルが利用できます。2変量KDEプロットはLINE, FILL, LINEFILLの3つのスタイルが利用できます。
2変量KDEプロットは塗りつぶしの透明度を指定できません。そのため群別にKDEプロットを作成して各群の分布が重なる場合はLINEスタイルの使用を推奨します。

title "KDE plot with linefill style";
ods graphics /  height=24cm width=24cm imagename="linefillKDE" imagefmt=png;

%kde2d(
   data=penguines(where=(species='Chinstrap')),
   x=bill_length_mm,
   y=bill_depth_mm,
   group=species,
   univar_style=fill,
   bivar_nlevel=10,
   bivar_style=linefill,
   bivar_grid=100,
   xlabel=bill_length (mm),
   ylabel=bill_depth (mm),
   legend=true,
   legendtitle=
);
塗りを適用した場合

個別データの表示

個別データは散布図またはラグプロットとして可視化することができます。各データは散布図のマーカー及びラグプロットの線に対応しています。
散布図は2変量KDEプロットに重ねて表示されます。ラグプロットは単変量KDEプロットの下部に重ねて表示されます。個別データを表示する場合は、表示スタイルをLINEに設定することを推奨します。

title "KDE plot with individual data";
ods graphics /  height=24cm width=24cm imagename="rugscatterKDE" imagefmt=png;

%kde2d(
   data=penguines(where=(species='Chinstrap')),
   x=bill_length_mm,
   y=bill_depth_mm,
   group=species,
   univar_style=line,
   bivar_nlevel=10,
   bivar_style=line,
   bivar_grid=100,
   xlabel=bill_length (mm),
   ylabel=bill_depth (mm),
   legend=true,
   rug=true,
   scatter=true
);
散布図とラグプロットの同時表示

threshパラメータ

threshパラメータで設定した値(閾値)以下の密度は2変量KDEプロットから除外されます。表示スタイルをFILLまたはLINEFILLに設定した場合、
閾値以下の密度の塗りは無効化されます。等高線のレベルは閾値以下の密度を除外した上で決定されます。

title "KDE plot using thresh parameter";
ods graphics /  height=24cm width=24cm imagename="threshKDE" imagefmt=png;

%kde2d(
      data=penguines(where=(species='Chinstrap')),
      x=bill_length_mm,
      y=bill_depth_mm,
      group=species,
      univar_style=line,
      bivar_nlevel=10,
      bivar_style=linefill,
      bivar_grid=100,
      xlabel=bill_length (mm),
      ylabel=bill_depth (mm),
      thresh=0.002,
      legend=true,
      rug=true,
      scatter=true
);
0.002以下の密度をプロットから除外する