SASのAudit Trail(監査証跡)機能について

今回は、いや、今回もマニアックな話です。

以前、「世代管理機能でデータセットの更新履歴(更新前後のDS)を残す_GENMAX=オプション」
http://sas-tumesas.blogspot.jp/2013/11/dsgenmax.html

で世代データセットを作る話をしました。

世代データセットが作られるようにしておけば、確かにそのデータセットが同名で再作成されるような場合に、世代データセットが作成されるので、更新内容を追うことができますが、例えば


data DS1(genmax=10);
 X=1;
run;

data DS1;
 modify DS1;
 X=2;
run;

のような処理をした場合、DS1の中身のXの値は2になりますが、世代データセットは一切
作成されません。

何故か?modifyステートメントは、元のデータセットを更新するものであり、
一度消して再作成するdata XX;set XX;とは違うからです。
データセットが同名で上書き作成された場合のみ世代データセットの対象になります。

その理屈からsqlプロシジャでupdateをしたときも作成されず、proc appendでデータセットを再作成せずに追加処理した場合も世代データセットは作られません。

では、そういった更新処理に対して、変更内容を確認することはできないのでしょうか?
当然できます。

今、以下の2つのデータセットがあって、Q1について、内容に変更がある度にそれを記録し、後で確認する必要があったとします。

data Q1;
X=1;Y='A';output;
X=2;Y='B';output;
run;






data Q2;
X=3;Y='C';output;
run;






ここでQ1に対して何か処理をする前に、

proc datasets ; 
 audit Q1; 
 initiate; 
quit; 

とします。これによってQ1に対してauditが作成されるようになります。
ただし、世代データセットと違い、ユーザーの目には直接触れない、見えない箇所でSASが勝手に記録をとります。

さて、それでは、一気に以下のコードを実行します。

data Q1;
 modify Q1(where=(X=1));
 X=9;
 Y='Z';
run;

proc append base=Q1 data=Q2;
run;

data Q1;
 modify Q1;
 where X=2;
 remove;
run;


関係のないクイズ、Q1の中身は一体どうなっているでしょうか?

答え






で、ここで、どうやってQ1に対する監査証跡を確認するのかというと、

data A1;
 set Q1(type=audit);
run;

として、A1の中身を見てみると






こんなことになってます。
見方を簡単に説明すると

_ATDATETIME_がデータに何かしら操作が加えられた日時です。
_ATOBSNO_は対象となったオブザベーション番号です。
_ATUSERID_は変更を行ったログインユーザー名です。
_ATOPCODE_は操作内容でDRはそのオブザベーションが読み込まれたこと、DWはそのオブザベーションに何かデータが書かれたことDAはオブザベーションの追加、DDは削除です。

以上のことを踏まえてA1を解読してみると

2014年の6月29日の深夜2時20分12秒に、1オブザベーション目が読み込まれ、同時間に
X=9 Y=Zに書き換えられ、そしてその4秒後、3オブザベーション目にデータが追加され、
間髪いれず2オブザベーション目が削除され、全ての処理はSASYAMAというユーザーによって
行われたんだということが丸裸になります。

さらに詳しくはドキュメントを読んでください。

これは、うまく利用すれば凄いことです。これと同じことをするマクロとかを自作しようとしたら
頭抱えちゃいそうです。それがproc datasetsでちょろっと指定するだけでできてしまうので。

とても大事で、変更履歴を残したいものがあるなら、同名での再作成ができないようにしたうえで
AUDITを作るようにしておいて、変更は全てmodify等の更新処理で行えばよいですね。

実践でやったことないですけどね。

でもなんか、これ、本来の用途と違うことに応用できそうな気がしていて、ちょっと面白いことできないか考え中です。

SASユーザー総会2014

SASユーザー総会というSASプログラマーのお祭りみたいなイベントがあります。
今回で33回目の開催で、2日間に渡って、いろんな分野のいろんな方がSASを使った様々な解析、試みなどなどを論文発表やプレゼンテーションします。

今まで参加したことないという方も、一度参加してみると、多分とても楽しいと思います。
参加申し込みは既に始まっています。 

http://www.sascom.jp/sug14/index.html

参加費用も一般で五千円ちょっとで、SASのトレーニングセミナーのお値段からすると破格の安さだと言っていいはずです。

また、医薬系の方は、今年はCDISC(薬の申請に使うデータの標準形式で、乱暴に言うと、その形式がSASなので関係が深い)特集が熱いです。SASを直接コーディングする立場じゃない方も、勉強になるのではないでしょうか。

私は今年は論文を2本投稿いたしました。

セッションDAY2の11:30-12:00にハッシュオブジェクトについて発表します。くそ長いタイトルのやつです。
ハッシュオブジェクトってなに?という方にもぜひ聞いていただきたいです。聞いていただいた人に新しいSASの世界を少しでもお見せできるようにと頑張りました。
医薬品開発と書いてますが、データステップに国境はないので、どんな分野のどなたでもぜひいらしてくれたら嬉しいです。
ちなみにハッシュオブジェクトを使うには特別なライセンスは不要でBase SASの機能です。


そして同じくセッションDAY2の、15:20-16:10に、本当に偉大な方々との共同論文のファーストオーサーを務めさせていただきました。データステップの極地ともいうべきプログラムに、昨年のLibname Excelの技術をコラボさせていただいたものになります。面白いです。


どちらも、統計理論ではなく、データステップのかなりテクニカルな内容なので、何かしらお役にたてる小技がつまっていると自負しています。
最先端の解析手法で頭が熱くなったら、クールダウンにもどうぞ。


当日は、会場をうろうろしているので、知っている方も初めての方もぜひ気軽にお声かけください。
ブログを読んでいただいている方のお話をぜひ直接聞きたいです。

また事前にご連絡いただければ、時間と場所を決めて、顔を知らないからそこに来いといっていただければいきますので。

notsortedオプションを侮るなかれ。データセットの格納順を活かしたby処理

今、以下のようなデータセットを受け取って、Xの値ごとに、適当な値でグループ化する変数を作ってと言われたとします。架空の話ですが。

data Q1;
X='A';output;
X='A';output;
X='B';;output;
X='B';output;
X='B';output;
X='C';output;
X='C';output;
X='A';output;
X='A';output;
run;













はいはいと、言って僕は

proc sort data=Q1 out=_Q1;
 by X;
run;

data A1;
 set _Q1;
 retain GROUP 0;
 by X;
 if first.X then GROUP+1;
run;

こう書いて













としました。

XがAの値には1、Bには2、Cには3をつけました。


すると、違う!そうじゃない!
こういう風にしてくれ!と言って見せられたのが













です。

ソートやユニーク、キーとかそういうデータ構造の基本的概念がない人と話すと
よく、データの格納順を重視していると感じます。

僕が、Xの値が同一のAなので、まとめられるので、当然こうなるのですがといったところで

何を言ってるんだ??最初に出てくるAと次にでてくるAの間に別の文字が入って区切れとる
だろうが!同じじゃない!

となるわけです。


さてさて、
ではどうしましょうか?retainでXの値を保持して、前のオブザベーションとの
比較分岐をいれますか?面倒です。

そういった時に役に立つのがnotsortedオプションです。


data A2;
 set Q1;
 retain GROUP 0;
 by X notsorted;
 if first.X then GROUP+1;
run;

とすると













となって、求めるべき結果になるわけです。

データステップのbyは、その変数での事前ソートを要求するため
notsortedをつけずに実行すると当然












エラーになります。

notsortedをつけることで、元データの格納順のまま、by処理が可能なわけです。

これは例えばmeansプロシジャ等、種種のプロシジャでもどうようのことができます。
連続して格納されている値ごとに処理したい場合はnotsortedが使えるわけです。

まあ、あまり筋がいいとは言えませんが。








無償公開SASと、関係ないおまけ話としてSASからEXCEL VBAを実行する方法

リンクさせていただいているサイト様で、取り上げられていて、重複する話題なのですが、ぜひ日本中に拡散したいニュースですので、うちも乗っかってしまいます。

非商用目的に限り(研究や学習とか)、SAS University Edition というものを無料で使っていいよというびっくりな話です。これで家でもSASいじりができます。

インストール方法等等については、リンクサイト様の記事がわかりやすいので、紹介させていただきます。


リンクサイト[Traid.sou]での紹介記事

2014-06-06 SAS Analytics Uについて」




リンクサイト[僕の頁 <SASと臨床試験と雑談と>]での紹介記事


SAS University Edition - ついにSASが無料で利用できる時代に -





ついでにまったく関係のない話

今、アクティブなエクセルファイルに
「MACRO_A」というマクロがある場合、

filename cmds dde 'EXCEL|SYSTEM';

data _null_;
  file cmds;
  put'[RUN("MACRO_A")]';
run;


でSASから実行できます。

それだけです