SAS

Proc expandでnレコード前、nレコード後のデータを取得する

データステップはPDV外のレコードのデータを取得することは結構難しいです。
一応Lag関数を使用すればnレコード前のデータを取得することはできますが、nレコード後のデータを取得する関数は用意されていません。

proc expandを使えばこのような処理を実施できます。データステップで何とかするよりは簡単かと思います。

Proc expandとは

proc expandは簡単に言うとデータの補完や移動平均の算出といった時系列データの前処理に使用するプロシジャです。
臨床統計よりは金融分野で時系列データを分析するときに使用することが多いかと思います。

臨床分野でも投与履歴や測定データなど、経時的にデータを取得するケースは多いのでproc expandを知っておくと後々役に立つケースはあると思います。

注意点としてはSAS/ETSの契約がないとこのプロシジャは使えません。契約がない場合はSQLかデータステップで何とかするしかないかも・・・

convertステートメント

以下のようなテストデータtestがあります。

このデータセットからproc expandを使って以下のような変数を作成してみましょう。

変数名 定義
lag usubjid毎に、1レコード前のavalの値を格納する
lead usubjid毎に、1レコード後のavalの値を格納する

以下のようなプログラムを作成し、実行してみます。

Copy
proc expand data=test out=out method=none; id lbseq; convert aval=lag / transformout=(lag 1); convert aval=lead / transformout=(lead 1); by usubjid; run;

実行結果は以下の通り、データステップでは関数が用意されていないnレコード後のデータも取得できてますね。

nレコード前、nレコード後のデータを取得して新規変数に格納したい場合はconvertステートメントを使用します。文法は以下の通り

convert 対象変数=変換後の変数 / transformout=([lag | lead] n);

lagキーワードはnレコード前、leadキーワードはnレコード後のデータを取得します。

変換方法は他にもたくさんありますので、以下のページから確認してみてください。

idステートメントで時間変数(レコードを識別する数値変数)を指定します。今回はlbseqが相当するのでこの変数を指定しました。
なお指定しない場合は0から始まる連番を格納した変数TIMEが自動的に作成されます。
もちろんあらかじめ適切なレコードの順序になるようにソートする必要があります。

データステップを一度ぬけてからプロシジャを実行しないといけませんが、データステップで頑張るよりはずっと簡単で安全だと思います。

今回はnレコード前、後みたいにレコードの順番のみで格納するデータを判定していますが、もっと複雑な条件が必要になるのであればproc SQLを使ったほうが良いでしょう。