SAS_GTL

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

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

https://picolabs.jp/sasplotter_usage

二次元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, 
   scatter=false,
   rug=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 : integer 整数(オプション)

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

作図例

群別二次元KDEプロット

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

ods listing gpath=;
ods graphics / height=24cm width=24cm imagename="groupedKDE" imagefmt=svg;
%kde2d(
dat=penguins,
x=bill_length_mm,
y=bill_depth_mm,
group=species2,
univar_style=line,
bivar_nlevel=10,
bivar_style=line,
bivar_grid=100,
xlabel=bill_length (mm),
ylabel=bill_depth (mm),
legend=true,
palette=sns
);
群別KDEプロット

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

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

ods listing gpath=;
ods graphics / height=24cm width=24cm imagename="linefillKDE" imagefmt=svg;
%kde2d(
dat=penguins(where=(species2=2)),
x=bill_length_mm,
y=bill_depth_mm,
group=species2,
univar_style=fill,
bivar_nlevel=10,
bivar_style=linefill,
bivar_grid=100,
xlabel=bill_length (mm),
ylabel=bill_depth (mm),
legend=true,
palette=sns
);
塗りを適用した場合

個別データの表示

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

ods listing gpath="&curdir./img";
ods graphics / height=24cm width=24cm imagename="rugscatterKDE" imagefmt=svg;
%kde2d(
dat=penguins(where=(species2=2)),
x=bill_length_mm,
y=bill_depth_mm,
group=species2,
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,
palette=sns
);
散布図とラグプロットの同時表示

threshパラメータ

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

ods listing gpath="&curdir./img";
ods graphics / height=24cm width=24cm imagename="threshKDE" imagefmt=svg;
%kde2d(
dat=penguins(where=(species2=2)),
x=bill_length_mm,
y=bill_depth_mm,
group=species2,
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,
palette=sns
);
0.002以下の密度をプロットから除外する