2018年1月27日土曜日

SASオフ会に行ってきました

露骨にブログ記事を稼いでいくスタイルを見せつけています.
特に内容はないです.

先日(1月26日)にデータステップ100万回の管理人さん含めて6人でオフ会しました
せっかくの飲み会…ということで一人一つsasネタを持ち寄って軽く紹介しあいました
ユーザー会より気楽にネタ作ってポンと発表できるのはいい感じでしたね…

私が持って行ったネタの資料はswayに転がしておきました
こちらから閲覧できます.
pptの資料をswayに変換しただけなのでイマイチ見にくいかもしれません

次の開催は4月か5月頃ですかねえ.年度末は忙しいですし.

2018年1月25日木曜日

Wilcoxonの符号付き順位和検定_proc univariate

SASでWilcoxonの符号付き順位和検定は,proc univariateを実行することで出来ます.
こちらはWilcoxonの順位和検定と異なり,対応のあるデータに対して行います.

univariateプロシジャに,対応前後の差の値(変化量の様なもの)を格納した変数を指定します.
以下の仮のデータセットで言う所の「CHG」に当たります.(after-beforeで導出)

以下のプログラムではTEST_UNIのデータセットにunivariateプロシジャの結果を出力しています.
Wilcoxonの順位和検定のp-値は「_PROBS_」に格納されています.

今回はnoprintを指定することでoutput画面への出力を抑制していますが,
outputでは「位置の検定」の項目に結果が出されています.


/*---------- プログラム ----------*/

data TEST ;
 CAT = 1 ;  BEFORE = 1 ; AFTER = 3 ; CHG = 2  ; output ;
 CAT = 1 ;  BEFORE = 2 ; AFTER = 6 ; CHG = 4  ; output ;
 CAT = 1 ;  BEFORE = 3 ; AFTER = 1 ; CHG = -2 ; output ;
 CAT = 1 ;  BEFORE = 4 ; AFTER = 3 ; CHG = 1  ; output ;
 CAT = 2 ;  BEFORE = 5 ; AFTER = 2 ; CHG = -3 ; output ;
 CAT = 2 ;  BEFORE = 6 ; AFTER = 1 ; CHG = -5 ; output ;
 CAT = 2 ;  BEFORE = 7 ; AFTER = 6 ; CHG = -1 ; output ;
 CAT = 2 ;  BEFORE = 8 ; AFTER = 5 ; CHG = 3  ; output ;
run ;

proc univariate data = TEST outtable = TEST_UNI noprint ;
 class CAT ;
    var CHG  ;
run ;

2017年12月13日水曜日

SASの処理は1obsごとに行われていると言う話

これは私のプログラム力が低いと言う話です.
何を今更こいつ......となるかもですが,そこはそっとしてあげてください

data DAT1 ;
    a = 1 ; n = 10 ; output ;
    a = 3 ; n = 20 ; output ;
    a = 4 ; n = 30 ; output ;
    a = 6 ; n = 50 ; output ;
run ;

これまで上のデータセットから,a=1の時のnの値をマクロ変数に入れる時は
「if a = 1 then call symputx("_all1" , N)」と書いていたわけです.
同様にa = 2 の時のNを格納したマクロ変数を作る時は,
「if a = 2 then call symputx("_all2" , N)」と書いていました.

これって1つとか2つとかならいいんですが,3つ4つとマクロ変数を作らないといけない時は
下の様にif文をいっぱい書いていたわけです.ほんと無駄ですね.

data _null_ ;
    set DAT1 ;

    *---------- Aの値毎にマクロ変数作る時にif文で分岐させてた ;
    if A = 1 then call symputx("_all1" , N)
    if A = 3 then call symputx("_all3" , N)
    if A = 4 then call symputx("_all4" , N)
    if A = 6 then call symputx("_all6" , N)

    *---------- 同じことが1行で書けちゃう ;
    call symputx( cats("_all" , A) , N) ;

run ;

別に1obsごとに実行するのはマクロ変数作る時だけではないです.…今更ですね

data MOLEC ;

    A = 1 ; COUNT = 5 ;  output ;
    A = 3 ; COUNT = 10 ; output ;
    A = 4 ; COUNT = 20 ; output ;
    A = 6 ; COUNT = 11 ; output ;

run ;

data HOGE ;
    set MOLEC ;
   
    *---------- 今まではifで分岐させてマクロ変数を指定して割り算していた ;
    if A = 1 then OUT = round(COUNT / &_all1 , 1e-08) ;
    if A = 3 then OUT = round(COUNT / &_all3 , 1e-08) ;
    if A = 4 then OUT = round(COUNT / &_all4 , 1e-08) ;
    if A = 6 then OUT = round(COUNT / &_all6 , 1e-08) ;

    *---------- 同じことが1行で書けちゃう ;
    OUT2 = cats(COUNT / symgetn( cats("_all", A) ) , 1e-08) ;

run ;

いやー自分のスキルのなさが恥ずかしい

あ,いまさらツイッタ始めました
<https://twitter.com/dap123586>


2017年11月8日水曜日

SASのnotepadの話

SASにNOTEPADが実装されています(9.3で確認)
拡張エディタと同様にプログラムを書いて実行することが出来ます.

拡張エディタとの違いは,NOTEPADに書いた内容はSASを落としても保存される点です.
拡張エディタに書いた内容は外部ファイルに保存しない限りSASを落とすと消えますが,
NOTEPADに書いた内容はSASを新しく立ち上げなおしても保持されたままになっています.

このプログラムを一度きれいな環境で実行したい,とかの時に便利だと思っています.
限られた状況ですが...

NOTEPADを起動するには,
dm "notepad" ;
と拡張エディタで実行します.

NOTEPADに書いたプログラムを実行するには
dm notepad "notesubmit" ;
と拡張エディタで実行するか,ツールバーからボタンで実行を選ぶかです.
実行したログは普通にログ画面にいつも通りに表示されます.

NOTEPADの中身は
dm notepad "clear" ;
できれいになります.

dm notepad "close" ;
を実行するとNOTEPADは閉じます.
これだと閉じただけですので,NOTEPADの中身は保存されています.

NOTEPADのいまいちなところはキーボードマクロが使えないところと,ハイライトが付かないところですかね…

2017年10月15日日曜日

9.4のメンテナンスリリース5がでてるやんけぇと言う話

出てますね,9.4M5.
日本語での案内ってでますかねこれ.
イマイチ見当たらないんですが.
sas studioも9.4M4なので実際に触れないのですが,いくつか新機能が出ているようです.
そのうちの二つを紹介しようと思います.

proc dstods2 がそのうちの1つです.
なんでもデータステップをDS2言語に変換して出力するプロシジャのようです.
inにsasプログラムをよみこんで,outから「.ds2」形式のファイルを出力するようです.
データステップのhashも一部対応してるよ!(Partial support for the hash object. )
とのことなので実際にいろいろ変換してみたいのですが,いかんせん9.4M5が触れないですね
幾つか未対応の機能もあるようなので,そこは気を付けたいところです.

該当のdocument
<http://documentation.sas.com/?cdcId=pgmsascdc&cdcVersion=9.4_3.2&docsetId=proc&docsetTarget=p0zok9sr2a2t46n1r8zfuw5145t5.htm&locale=ja>

取りあえず以下はsasのdocumentから引っ張ってきた例です.

data _null_;
   length x y z w 8;
   set x;
   by x--z w;
   put x=;
run;

このデータステップをdsex1.sasに保存して

proc dstods2 in="dsEx1.sas" out="ds2Ex1.ds2"; run;

上のプロシジャに掛けると,
下の様なコードがds2ex1.ds2として出力されるようです.

data _NULL_;
  dcl double X;
  dcl double Y;
  dcl double Z;
  dcl double W;
  method run();
  set X;
  by  /* X--Z */ W;
  put X=;
  ;
  _return: ;
  end;
enddata;

もう一つはgzフォルダにfilenameステートメントでアクセスできるようになったようです.
filenameステートメントのzipオプション下でgzipオプションをつければアクセス可能になるとのこと.
ただgzipオプションとmemberオプションの両方を書くと,memberオプションは無効になるようですね.

と言うか9.4からZIPにはアクセス出来るようになってたんですね.
そこすら知らなかったです.

filename foo ZIP 'U:\directory1\testzip.zip' member="test1.txt" 
これで指定したzipの中のtest1.txtにアクセス出来るらしいです.

該当のdocument
<http://documentation.sas.com/?cdcId=pgmsascdc&cdcVersion=9.4_3.2&docsetId=lestmtsglobal&docsetTarget=n1dn0f61yfyzton1l2ngsa1clllr.htm&locale=ja#p0c653wf2di4jln10vjxwuub1ptz>


後はviyaを見据えた変更点がありそうなくらいですかねぇ
にわか知識なのであまり詳しいことはわかりませんが.
日本語の記事とかあったら知りたいです.

2017年10月10日火曜日

sas studioにログインできなかった話

まさかの月に複数回更新

久しぶりにSAS studioにログインしようとすると入れませんでした.
どうもライセンスを更新しないといけない様子です
sasのsupportページ<https://support.sas.com/ondemand/caq_new.html>の
「general questions」のところに記載がありました.

Q.
I am unable to sign on to the Control Center or other SAS OnDemand for Academics software applications.

A.
You may be using a mixed or upper-case user ID. Only lowercase values are acceptable for your user ID. Additionally, you may be using the wrong password or your account may be disabled. You must renew your license agreement each year. Your account will be disabled if you fail to renew.
  •  If you have forgotten your password or wish to reset it, see What should I do if I forget  my password?
  •  If you have reset your password and are still unable to sign on, you can sign on to the Registration application and update your license agreement. After that,    you can try to sign on again.
  •  If you have tried both of these items and are still unable to sign on, then you can send e-mail to SASAnalyticsU@sas.com to receive technical support.

二つ目の○のところに,「update your license agreement」と書いてあります.
Ansの部分の概要に,「You must renew your license agreement each year.」とあるので,一年に一回はライセンスを更新しないといけないようです.

/*----- 20190110追記 ------*/
ココ勘違いしている気がします.年一回アカウントの更新が必要なのではなく,年に一回はログインしないとアカウントの更新が必要になるんじゃないでしょうか.
どっかでログインしていればアカウントの更新をしなくてもいいはずです.
/*----- 20190110追記ここまで ------*/

ここからは更新の仕方についてです.
アカウントを作るページ<https://odamid.oda.sas.com/SASODARegistration/>に
自分が作ったアカウントのFirst name,Last name,email addressを入力してCountryを選んでsubmitします.
(更新なのにCreate an accountのページなのが違和感ありますね.そんなもんなんでしょうか)

submitすると,「You are already registered with SAS OnDemand for Academics. 」と言われるので,
下のテキストボックスにアカウントのパスワードを入れて「continue」をクリックです.
この時にlicenseにagreeする旨のチェックボックスにチェックを入れてください

次のページで「Your account is ready to use. 」と出てくるので,これでOKです.
このページで自分のUSERIDを教えてくれますので,ログイン時はそのIDと設定したパスワードを使ってください.

これで一年間はまた使えるはずです.
一年後にまたライセンスの更新を忘れずにしましょう

2017年10月2日月曜日

sgplotを実行した時に,自動でグラフのイメージが出力される話

改めて見るとよくわからないタイトルですね.適当よくない

sgplotでグラフを書くと,グラフのイメージが勝手にpng形式で出てきて困ってました.
ods rtfでrtf形式を指定しているので,改めてpngは要らないのです.
そういう時は「ods listing close ;」でpngの出力止めれますよ,と言う簡単な話です.

それか出力先を自分のsasのworkにしてしまえば,
sasを落とせば勝手に消えるし出力の確認もできます.
workをこんな使い方していいのかは知りませんが.

*----- pngの出力止める(outputへの出力を止める) ;
ods listing close ;

*----- rtf出力start ;
ods rtf file = "hogehoge\test.rtf" ;

proc sgplot data = sashelp.class ;
     vbox HEIGHT / category = SEX ;
run ;

ods rtf close ;
ods listing ;


/*---------- 出力をworkにする ----------*/
%let _wk = %sysfunc(getoption(work));
%put &=_wk ;

*----- outputの出力先を指定 ;
ods listing gpath = "&_wk."