2013年11月27日水曜日

年齢計算の落とし穴。



SASで年齢を計算する方法を紹介します。



※閏年生まれの人の加齢のタイミングをいつにするかによって、書き方が異なります。



以下、各年齢の出し方と結果の違い。

** サンプルデータ ;
data AGE;
 input BIRTH EVENT ;
 informat BIRTH EVENT yymmdd10.;
 format BIRTH EVENT yymmdd10.;
cards;
2000/03/02 2001/03/01
2000/03/02 2001/03/02
2000/03/02 2001/03/03
1992/02/29 1996/02/28
1992/02/29 1997/02/28
;

** 【年齢計算】 2月29日生まれの人の加齢タイミング別 ;
data AGE2;
 set AGE;

 /*- ① -------------------------------------
  閏年 の場合 → 2月29日 に加齢
  平年 の場合 → 3月1日 に加齢
 -----------------------------------------*/
 AGE1 = int( (put(EVENT,yymmddn8.)-put(BIRTH,yymmddn8.))/10000 ) ;


 /*- ② -------------------------------------
  閏年・平年ともに → 2月28日 に加齢
 -----------------------------------------*/
 AGE2 = int(yrdif(BIRTH, EVENT, 'AGE'));


 /*- ③ -------------------------------------
  閏年 の場合 → 2月29日 に加齢
  平年 の場合 → 2月28日 に加齢
 -----------------------------------------*/
 AGE3 = int( (intck('month', BIRTH,EVENT) -
         ( day(EVENT) < min(day(BIRTH),day(intnx('month',EVENT,1)-1)) )
        )/12);
run;





結果データセット「AGE2」









解説

①結果自体は、SASテクニカルサポート「年齢の計算方法」にあるやつと同じになる。
他のプログラミング言語で見かけた方法で、
ポイントは、2つの日付を、日付としてではなく8ケタの数字として見て計算してるところ。

ちなみに同じ結果を返す他の計算式として、以下2つの方法などもあり、どれもうまい。
 AGE4 = intck('YEAR',BIRTH,EVENT)-(put(BIRTH,mmddyy4.)>put(EVENT,mmddyy4.)) ;
 AGE5 = int((intck('MONTH',BIRTH,EVENT)-(day(EVENT)<day(BIRTH)))/12);


②「YRDIF関数」の「AGE」オプションを使ったやり方。
「AGE」オプションは人の年齢を計算できるオプションで、SAS9.3から追加された。


③海外のSASユーザー会で発表された、
「Calculating Age in One Line of Code」(Wei Wang, Highmark Blue Cross Blue Shield, Pittsburgh, PA) にあるやり方。
式は複雑だけど、うまい具合に計算してくれる。


まとめ

「うるう年」の取扱いは、各自異なると思うので、その辺の仕様をはっきりさせ最適な方法を使用するようにしましょう。


0 件のコメント:

コメントを投稿