Kengo Nagashima



背景因子の集計を Excel 出力する SAS マクロ

SAS データセットの変数を指定するだけで、いわゆる Table 1 を Excel ファイル形式で (一応) 出力できるマクロです。 以下のようなファイルが出力できます。

本マクロは出力エンジンとして ods tagsets.excelxp という方式を使っており、厳密に言えば Excel ファイルではないファイルが生成されます。 そのため、出力したファイルを開こうとすると「ファイル形式と拡張子が一致しません。ファイルが破損しているか、安全ではない可能性があります。・・(以下略)・・。[はい] [いいえ]」と表示されます。 ここで [はい] を選択すると、微妙に Excel 形式ではないファイルを自動で強制変換してくれて Excel ファイルとして普通に開くことができます。 後で参照するときに便利なので、[はい] で開いて強制変換したものを xlsx 形式などで保存しておくとよいでしょう。

stab1

既知の問題点 & 改良予定

  1. おそらく未知のバグがあると思われます。発見した方はお手数ですが、メールいただけると幸いです。

不具合や質問につきましては、メールにてご連絡いただけると助かります。

マクロの概説

ダウンロードファイル中の事例 (stab_example.sas) を見ると概ね使い方がわかると思いますが、簡単に説明を書きます。
マクロは %tableInit() と %tableMake() という集計結果をデータセット出力するパートと、それをまとめて Excel に吐き出す %outputInit(), %outputMake(), %outputOut() というパートに分かれています。
事例では、3つの背景因子集計の表を作成し、一つの Excel ファイルに出力する処理が書かれています。

%tableInit() と %tableMake()

%let data   = test;         /* 入力データセット名 */
%let out    = out1;         /* 出力データセット名 */
%let group  = trt;          /* 群変数 */
%let pvalue = 1;            /* P値の出力 (0: 出力しない, 1: 出力する) */
%let color  = 1;            /* 色装飾の有無 (0: なし, 1: あり) */
%tableInit();
%tableMake(cont, age, "Age (continuous)", round = 0.1);
%tableMake(ordr, age, "Age (ordinal)", round = 0.1);
%tableMake(cont, height, "Height (continuous)", round = 0.01);
%tableMake(disc, sex, "Sex  ―  No. (%)");
%tableMake(disc, fhist, "Familial history  ―   No. (%)");
%tableMake(disc, tfhist, "Familial history  ―   No. (%)");
%tableMake(disc, hist, "Previous history  ―  No. (%)");
%tableMake(disc, comp, "Complication  ―  No. (%)");
%tableMake(disc, comp, "Complication (with missing)  ―  No. (%)", missing = 1);

表ごとに %let で始まるグローバル変数の設定処理が必要です。 入力データセット名 (data)、出力データセット名 (out)、群変数 (group)、P値の出力の有無 (pvalue)、色装飾の有無 (color)を指定します。 群変数をブランクにしておくと、群なしでデータセット全体の結果を出力します (P値は計算しません)。 色装飾ありにすると、変数毎に白とグレーで縞模様になるように背景色をつける処理をします。

stab2

次は、%tableInit() で、その他の表の設定を行います。 設定可能な項目は以下の通りです。

%tableInit(
  nprint = 1, footer = 1, font = "Times New Roman",
  hlabel = "Characteristic", slabel = "Study population"
);

nprint - サンプルサイズ (データ行数) の出力
  0: 出力しない
  1: 出力する (default)
footer - 作成日時の出力
  0: 出力しない
  1: 出力する (default)
hlabel - ラベル制御
  "Characteristic": (default)
slabel - 単群の場合のラベル制御
  "Study population": (default)
font - 出力フォント名 (SASで指定可能なフォント名を入力)
  "Times New Roman": (default)

次は、%tableMake() で、変数毎に設定を行います。 連続変数 (type = cont / ordr) については、数値データが入っている必要があります (平均・標準偏差を集計する cont と、中央値・範囲などを集計する ordr に対応しています)。 離散変数 (type = disc) については、テキストデータでも、コーディングしてフォーマットがあたったデータでも、どちらでもきれいに集計表にできます。 項目は以下の通りです。

%tableMake(
  type, var, label, round = 0.1, exact = 1, missing = 0, weight = 0
);

type - 変数の型を指定
  cont: 連続変数 (平均と標準偏差を集計, Welch型のt検定 or ANOVAを使用)
  ordr: 順序変数 (中央値と範囲を集計, Wilcoxon検定 or Kruskal-Wallis検定を使用)
  disc: 離散変数 (頻度と割合を集計, 検定は後述)
var - 解析する変数を指定
label - 表示ラベルを指定
round - 連続変数または順序変数の数値丸めのオプション
exact - 離散変数の検定について
  0: 期待セル度数が5未満のセルがある場合にFisher's exact test
     そうでない場合にカイ二乗検定を使用
  1: Fisher's exact testを使用 (default)
missing - 離散変数の集計において欠測を表示するか否か
  0: 表示しない (default)
  1: 表示する
weight - 重み変数 (通常は使用しない)

変数がたくさんある場合は、続けて %tableMake() を複数行に渡って書きます。

%outputInit(), %outputMake(), %outputOut()

こちらはあまり設定する項目が無いですが、以下のような形式で %outputInit(), %outputMake(), %outputOut() を使用して生成したデータセットを指定します。

%outputInit("&Path.stab_example.xls");
%outputMake(out1, "Table1", "Table 1: Patient characteristics");
%outputMake(out2, "Table2", "Table 2: Patient characteristics (no group, no p-value)");
%outputMake(out3, "Table3", "Table 3: Patient characteristics (no p-value, no color)");
%outputOut();

以下は各マクロの引数説明です。

%outputInit(
  file
);

file - 出力するファイル名
  必要に応じてパスから指定します
  拡張子は ".xls" を必ず指定すること。
%outputMake(
  out, sheet, title, abscolwidth="40,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7"
);

out - 出力したいデータセット名
  %tableInit() & %tableMake() を使用して生成したデータセット
sheet - 出力シート名
  Excel のシート名の制限に引っかかるものはエラーがでますのでご注意ください
title - 表のタイトル
  一行目に出力する表タイトルの内容を指定します
abscolwidth - 
  Excel 上の列幅をカンマ区切りで指定します (大体はデフォルトのままで大丈夫です)
%outputOut();

※引数はありません。

旧バージョン

履歴