2018年12月28日金曜日

SASで雪だるまを描く




2018年も本ブログを見て頂いた方、コメントしてくださった方、どうもありがとうございました!
来年もどうぞよろしくお願いいたします!!

SASでグリーティングカードを作ってみました。


以下が今回作ったプログラムです。SAS9.4以降で動作します。
*** 描画用データ作成 ;
data SNOW;
  * ゆきだるま描画用データ作成 ;
  retain x1  0  y1  0;
  retain x2  0  y2 -6.5;
  retain x3 -1  y3 1;
  retain x4  1  y4 1;
  retain x5  0  y5 0;
  retain x6  0  y6 0.5;
  retain x7  0  y7 5.5;
  retain x8  0  y8 7;

  * ゆき描画用データ作成 ;
  call streaminit(777);
  do scene=1 to 5;
     do snow_x = -10 to 10 by 1;
        snow_y = rand('uniform')*30-15;
        output;
     end;
  end;
run;

*** 描画 ;
title ;
options  ANIMATION=START  ANIMDURATION=1   PRINTERPATH=GIF ;

ods noresults;
ods printer file="出力するパスを指定\test.gif";
ods graphics on / height=4in width=4in;

%macro ANIMATION;
  %do i=1 %to 5;
  proc sgplot data=SNOW noautolegend;
     where scene=&i;
     styleattrs wallcolor=skyblue;
     symbolchar name=SNOW char='2744'x;
     scatter x=snow_x y=snow_y /  markerattrs=(symbol=SNOW  size=1.5cm color=white);
     scatter x=x1 y=y1  /  markerattrs=(symbol=circlefilled  size=3cm color=white);
     scatter x=x2 y=y2  /  markerattrs=(symbol=circlefilled  size=4cm color=white);
     scatter x=x3 y=Y3  /  markerattrs=(symbol=circlefilled  size=0.2cm color=black);
     scatter x=x4 y=Y4  /  markerattrs=(symbol=circlefilled  size=0.2cm color=black);
     scatter x=x5 y=y5  /  markerattrs=(symbol=ArrowDown  size=0.5cm color=black);
     scatter x=x6 y=y6  /  markerattrs=(symbol=TriangleDownFilled  size=0.3cm color=orange);
     scatter x=x7 y=y7  /  markerattrs=(symbol=TriangleFilled  size=1.2cm color=red);
     scatter x=x8 y=y8  /  markerattrs=(symbol=CircleFilled  size=0.6cm color=white);
     inset "Happy Holidays"  /  position=top textattrs=(color=green size=35cm family='Arial');
     xaxis min=-3 max=3  display=none;
     yaxis min=-5 max=1  display=none;
  run;
  %end;
%mend;

%ANIMATION;

ods graphics on / reset=all;
ods printer close ;
ods results;

options  ANIMATION=STOP ;


2018年12月14日金曜日

現地時間などから日本時間を調べたい




海外のなんかのイベントで「ライブ配信がxx時yy分から行われます」って情報があったとき「日本時間だと何時だろう」って知りたい事ありますよね。




例1

直近だと、自宅で使ってる SAS OnDemand for Academics のメンテナンス終了予定が

    Dec 13, 2018 17:00 UTC

みたいに書かれてて、日本時間でいつ終わるのか知りたいってことがあります。ネットで調べれば速攻で分かりますが、SAS使いとしてはSASで調べてみましょう。


data _null_;
   utc_dt = '2018-12-13T17:00:00'dt;
   jpn_dt = tzoneu2s( utc_dt, 'Asia/Tokyo' );
   put jpn_dt= datetime.;
run;

Log
jpn_dt=14DEC18:02:00:00


なるほど、日本時間だと12月14日の2時にメンテが終わるってことですね。

  • TZONEU2S関数」は、UTC(世界協定時)を指定したタイムゾーンIDの日時に変換します。
  • ちなみに「SAS timezone id」とかでググれば都市ごとのタイムゾーンIDが載ってるSASのリファレンスが見つかるはずです。



例2

テキサス州ダラスで現地時間2018年12月12日23時10分になんかのライブ配信が行われますってなった時に、日本時間だといつか調べたいとします。

data _null_;
   dal_dt = '2018-12-12T23:10:00'dt;
   utc_dt = tzones2u( dal_dt, 'America/Chicago' );
   jpn_dt = tzoneu2s( utc_dt, 'Asia/Tokyo' );
   put jpn_dt= datetime.;
run;

Log
jpn_dt=13DEC18:14:10:00


日本時間で13日の14時10分からライブ配信が開始だってのが分かります。

  • TZONES2U関数」は、指定した日時とそのタイムゾーンIDからUTC(世界協定時)に変換します。
  • ちなみにテキサス州ダラスのタイムゾーンIDがないっぽいので、同じタイムゾーンを持つ 'America/Chicago' を設定しています。(この同じタイムゾーン調べるのも少し面倒)


関数の区別方法

TZONEU2SとTZONES2Uって似てますが、

・TZONEU2S・・・「UTC datetime to SAS datetime」
・TZONES2U・・・「SAS datetime to UTC datetime」

と考えると覚えやすいと思います。




2018年12月6日木曜日

【PROC MEANS】OUTPUTステートメントでの出力変数の指定方法



PROC MEANS(または PROC SUMMARY)の「OUTPUTステートメント」で統計量をデータセットに出力することが出来ます。


今回は統計量を出力する際の変数の指定方法を紹介したいと思います。




例① 分析変数が1つの場合


proc means data=SASHELP.CLASS;
   var HEIGHT;
   output out=OUT1  min=MIN_HEI  max=MAX_HEI;
run;

または

proc means data=SASHELP.CLASS;
   var HEIGHT;
   output out=OUT2  min( HEIGHT )=MIN_HEI  max( HEIGHT )=MAX_HEI;
run;


・HEIGHTの最小値をMIN_HEI、最大値をMAX_HEIに格納してます。

・基本的に「統計量( 分析変数 ) = 出力変数」という構文ですが、「統計量 = 出力変数」というように分析変数を省略した場合は、VARステートメントに指定した分析変数が使用されます。






例② 分析変数が2つ以上の場合


proc means data=SASHELP.CLASS;
   var HEIGHT WEIGHT;
   output out=OUT3  min = MIN_HEI  MIN_WEI
                              max = MAX_HEI  MAX_WEI;
run;

または

proc means data=SASHELP.CLASS;
   var HEIGHT WEIGHT;
   output out=OUT4  min( HEIGHT WEIGHT ) = MIN_HEI MIN_WEI
                              max( HEIGHT WEIGHT ) = MAX_HEI MAX_WEI;
run;

またはまたは

proc means data=SASHELP.CLASS;
   var HEIGHT WEIGHT;
   output out=OUT3  min( HEIGHT )=MIN_HEI  min( WEIGHT )=MIN_WEI
                              max( HEIGHT )=MAX_HEI  max( WEIGHT )=MAX_WEI;
run;


・HEIGHTとWEIGHTの最小値をそれぞれMIN_HEI、MIN_WEIに格納
・HEIGHTとWEIGHTの最大値をそれぞれMAX_HEI、MAX_WEIに格納




AUTONAMEオプションの利用

proc means data=SASHELP.CLASS;
   var HEIGHT WEIGHT;
   output out=OUT5  min=  max= / autoname;
run;


AUTONAMEオプションをつけると、SASが自動で出力変数名を決めてくれます。
「分析変数名_統計量」という感じの変数名がつけられます。



以下のような書き方も。

proc means data=SASHELP.CLASS;
   var HEIGHT WEIGHT;
   output out=OUT6  min( HEIGHT )= / autoname;
run;




ちなみに指定出来る統計量は、、
  統計量   内容
    N
  NMISS  欠損値の数 
  SUM  合計
  MEAN  平均値
  MIN  最小値
  MEDIAN   中央値
  MAX   最大値   
  RANGE  範囲
  MODE  最頻値   
  STDDEV  標準偏差   
  STDERR  標準誤差   
  Q1  下側四分位点 
  Q3  上側四分位点  
  QRANGE  四分位範囲  
  KURT  尖度
  SKEW  歪度
  …etc

など、その他豊富に取り揃えています。詳細はリファレンスを参照ください。




2018年12月5日水曜日

【PROC UNIVARIATE】OUTPUTステートメントでの出力変数の指定方法




PROC UNIVARIATE の「OUTPUTステートメント」で統計量をデータセットに出力することが出来ますが、「統計量を出力する際の変数の指定方法がよく分からない!」って方がいたので、まとめておきます。




例① 分析変数が1つの場合

proc univariate data=SASHELP.CLASS noprint;
   var HEIGHT;
   output out=OUT1  min=MIN_HEI  max=MAX_HEI;
run;

・分析変数HEIGHTの最小値をMIN_HEI、最大値をMAX_HEIに格納してます。




例② 分析変数が2つ以上の場合

proc univariate data=SASHELP.CLASS noprint;
   var HEIGHT WEIGHT;
   output out=OUT2  min=MIN_HEI  MIN_WEI
                               max=MAX_HEI  MAX_WEI;
run;

または

proc univariate data=SASHELP.CLASS noprint;
   var HEIGHT WEIGHT;
   output out=OUT3  min=MIN_HEI  min=MIN_WEI
                               max=MAX_HEI  max=MAX_WEI;
run;



・分析変数HEIGHTとWEIGHTの最小値をそれぞれMIN_HEI、MIN_WEIに格納
・分析変数HEIGHTとWEIGHTの最大値をそれぞれMAX_HEI、MAX_WEIに格納



ちなみに指定出来る統計量は、、
  統計量   内容
    N
  NMISS  欠損値の数 
  SUM  合計
  MEAN  平均値
  MIN  最小値
  MEDIAN   中央値
  MAX   最大値   
  RANGE  範囲
  MODE  最頻値   
  STDDEV  標準偏差   
  STDERR  標準誤差   
  Q1  下側四分位点 
  Q3  上側四分位点  
  QRANGE  四分位範囲  
  KURT  尖度
  SKEW  歪度
  …etc

その他あわせて40~50個程度の統計量を豊富に取り揃えています。詳細はリファレンスを参照ください。