そっかselectで初期化されてない変数うつとそういう結果になるんだったなって話

data a;

   select (X) ;

     when ("A") out ="AAAAA" ;

     when ("B") out ="BBBBB" ;

     otherwise;

   end ;

run;












そっか,怖いですね,これ.いまさらながらに,はっとしました(笑)

SASのクソな部分をぶった切る! をぶった切らない話

 最近,色んな方が凄いレベルの高いブログ更新されてて,すっかり楽しく拝見する側にまわってます.

個人的に尖った人が好きなのですが,

最近,よく「SASのクソな部分をぶった切るシリーズ」について,どう思うんですか?って色んな方から訊かれるのです.普通に面白いって答えてます(笑)

でも,自分の好きなSASがけなされてる?ということで,なんか良くない気持ちになってる人も一定いたり,急に新人がSAS勉強しなくなって困っちゃった人もいるようなので,一応私が思うことだけ

SASのクソな部分をぶった切る!(1) ソフトウェア価格

https://superman-jp.hatenablog.com/entry/SAS-disadvantage-1

>うん,これはわりとその通りかも(笑)いいぞ もっとやれ.

まあ,医薬分野ってSASの売り上げの20%ぐらいだっけ?で,さらにLSAFとかではなくて,ゴリゴリSAS BASE書いてるユーザーはSASからみたら,金額的にそんなに重視する部分じゃないので,多分,眼中にないのでしょう.払うやつ,払えれる民草が払えばいいと(笑)

私もOpen Source Technologyを申請資料作成にみたいなことに絡んでたりするので,確かな流れとして脱SAS一極の流れは感じます.しかし現状各企業のアンケートとかを見る限り,日本におけるOSTの浸透率はまだ極めて限定的ということも思い知らされたりしてます


SASのクソな部分をぶった切る!(2) SASユーザー総会

https://superman-jp.hatenablog.com/entry/SAS-disadvantage-2

>ぐさっときますねぇ….SAS社の情報発信の在り方とか,ユーザー総会の運営・サポートのやり方がベストではないというのは同感です

発表者の実績になりにくい」これはどうかなぁ,N of 1じゃ 証拠にならないかもですが,私は結構転職してる人なのですが,給料交渉で,ユーザー総会の論文発表歴とかで結構上がることが多かったですね.

あと一回医薬でSASに浸かると,他業界(金融とかリサーチとか)にジャンプ転職が異常にしにくくなって書類で全部落ちるのですが,発表歴があると,なんかわりと通ります.それがあったから面接したって面接官が言ってたので効いたりもするのでしょう.自称SAS使い,自称データサイエンティストの怪しい人って巷に結構いるので差別化?区別してもらうのにはいいのかなとか.

あと,社内評価とかも,自己プレゼンのやり方によると思うのですが,「XXXを頑張って勉強する」とかより「XXXを研究した結果を総会で論文発表しました」ってほうがウケがちなのと,会社によるけど社内表彰とかでお小遣い稼ぎできたり.

でも結局,面白い人に会えるから,狂人の一歩手前の賢人とか,いい意味でヤバいプログラマの遭遇率が高いから毎年行ってるのが,私自身の動機かなと自己分析.SASのこと発表したり,知らない人,知ってる人とSASの話すると楽しいなぁとか.

結局,困った時に助けてくれる人とか,普段情報交換する信頼できる人とかが全部ユーザー総会で知り合った人だったりするんですよね.私は変だけど,プライベートも含めて友達が全部ユーザー総会由来だから,人間関係のために参加してるってことになるのかな…

でも,そういう仲良しこよしグループで内輪盛り上がりなムードがあって,それが高齢化と相まって,よろしくない風土をユーザー総会に醸しつつあるっていうのは凄くわかります

ハッシュオブジェクトとか、業務で使うのでしょうか?

まあ,一応,ここだけは…,多分その人の見てきた風景,経験してきた分野や企業の数によると思いますが,普通に使ってるところ多いですよ.キーが一意でない場合にErrorになったり,余計な変数の上書きを防ぎやすいとか

速度以外の理由で,標準化されている会社多いと思います

SASハッシュオブジェクトは使うべき?(https://superman-jp.hatenablog.com/entry/SAS-hash-object)

でも速度中心に論じられているのですが,個人的にはハッシュオブジェクトを使う理由として,「速度」はおまけと考えています.どちかというと構造化しやすい,多人数の開発で処理を共通化しやすい,キー・データの管理がしやすいのがメリットかなと.

なので,臨床だとSDTMやADaMの形って,ハッシュオブジェクトで一番,扱いやすい形で,はめ込みやすい感じなのですね.極端な例ですが,ADSLとかだとfind メソッドと checkメソッドで,1データステップで処理が簡素に終わることもありえます

あと,自己参照したり,普段だとデータステップって上から下にしかいかないので,前後の推移をみて分岐するとかがやりにくいのですがハッシュオブジェクトやハッシュ反復子だとそれに反することができるのでいいかなと.

ePROやウェアラブルデバイスを試験に使うことが増えてきたので,業界的に利用を見かける機会は増えたかなと思うのですが,まあ私のところにそういう情報や質問が選択的に集中してるからそう感じるだけなのかもですね


SASのクソな部分をぶった切る!(3)作図環境

https://superman-jp.hatenablog.com/entry/SAS-disadvantage-3

>これもわかります(笑) 私は肌にあうのでRやPythonよりSASグラフ好きで(ただしgplotは糞嫌い),GTLもSGPLOTでも描きます.SGPLOTのオプション増えたので,基本SGで済ますけど,GTLが全ての母であるのもわかるので,GTLも書くことありますし,全部GTLで書く人も嫌いではない

SASのクソな部分をぶった切る!(4)拡張性

https://superman-jp.hatenablog.com/entry/SAS-disadvantage-4

>そうですね,これもわかります

PDVについては,この方式は,これはこれで1つの在り方として正解だと思いますね.グローバルフォーラムでアメリカに行った時に,SASの開発周りの方々の話も多く聞きましたが,1obs inputしてoutputするシーケンシャルな処理を極限まで突き詰めたのが現状のSASで,それに適した形の概念としてPDVがあるので,そういう設計思想なんだなと.

必ずしも高速化処理に向かないとは思わないかな.文字値のレングスの持ち方が処理のボトルネックになるところは正直クソだと思いますけどね

しかしながら,良き悪きは別としてPDVは独特なので,視野を広くしておかないと,SASばっかりやったあとにSQLとか行列系言語やると,習得がしんどいんですよね

ある言語の理解を深めるために他言語を勉強するのは真理だとおもいます


SASのクソな部分をぶった切る!(5)proc DS2はいらない子

https://superman-jp.hatenablog.com/entry/SAS-disadvantage-5

まあ,私自身はそんなにかかないのですが,周りにユーザーがいて,他の業界にいた時も職場で使われていたので,少しだけコメント.

SDTMとかADaMとか,形の決まったプログラムをDS2で管理してパフォーマンスあげたり,金融やリサーチ業界での定型処理をうまくDS2にしてたりして,すごく効率的に回してる現場もあるので,まあ,導入メリットなし,無意味とまではいえないかなと

なんちゃってオブジェクト指向なので,他言語の開発者に短期間で,SAS書いてもらわなきゃいけない時によかったり,DS2の方が学習コスト低いから,みたいな例もあるみたいです


つらつら書いてみましたが,特に自分の正義を主張するつもりもなく

私自身は毎日面白おかしくSASで仕事したり遊んだりする日々ですが,久しぶりになにか書いてみたくなったので書いてみました


来年こそは…

今年は10記事はあげると言っておきながらこの有様。
しかもずっと最近記事が、Pythonに浮気の話って…。ほんとすみませんでした
せめて最新のエントリーはSASの話にしておきたい

SASやめちゃったんですかって心配されるので、一応自己フォロー、
今年はSAS Global Forum,SASユーザー総会,Pharma SUG JAPAN SDE,Phuse JAPAN SDE(12/10)など、過去にない濃密さでSASやってました
日本のすべてのSASやってる人間に刺激と娯楽をという思いは相変わらずです。単純に時間がなかっただけです。

今年のお気に入りは、FCMPの中でハッシュ入れちゃうことですね。whereステートメント内でメソッドが動くのが素敵。

data Q1;
do x=1 to 5;
 output;
end;
run;

data Q2;
do x=2,3;
 output;
end;
run;

proc fcmp
outlib=work.functions.common;
function check(x);
declare hash h1(dataset: "Q2");
rc=h1.definekey("x");
rc=h1.definedone();
rc=h1.check();
if rc eq 0 then return(1);
else return(0);
endsub;
quit;
options cmplib = work.functions;

data OUT1;
 set Q1;
 where check(x);
 run;

これでQ2に存在するデータのみ、Q1から読み込まれます。

あとdictionaryオブジェクトっていうのもあって、面白そうなのと、最新だとPythonオブジェクトとかもでました

来年こそは、色んな活動と、並行して、ブログも書けまくれるように、成長したいです



浮気の話 Python 3 エンジニア認定基礎試験とったりしました

色々やらなければ,ならないことがあって,てんてこまいなのに,Pythonに手を出したりしてます.

だって,SASの集まり行っても,Python,Pythonと耳にすることが多くて,褒めるにせよ貶すにせよ,まず自分がやってみないとなと.
どうせやるなら,基礎からやろうということで,SAS BASEにあたるような試験とかないかなぁと思って,探して受験したのが

Python 3 エンジニア認定基礎試験
https://www.pythonic-exam.com/exam/basic
→プログラム設計者ご本人のチュートリアル本が,出題範囲となっていて,まあそりゃあ,確かですけどって試験ですね.
この本にプラスして,コーディングしながら学べる基礎本を1冊買うのがおススメかなってかんじです

合格体験記を投稿すると,かわいいヘビのぬいぐるみが貰えるという面白い趣向があります(なくなり次第終了ですって)
https://www.pythonic-exam.com/archives/category/success-story

またいつか,ゆっくり書きたいなぁと思ってます

お詫び-SASプログラミング掲示板をいったん閉鎖しますという話

ちょっとした困りごと
掲示板をやっていて、SAS公式のCommunityが稼働してからも使っていただける方がいて、細々とやらしていただいていました。
というか、私は放置状態で、何名かの優しいスペシャリストの善意に甘え続けていました

SASプログラミング掲示板(データステップ100万回)
https://tumesas.progoo.com/bbs/

がしかし、利用していたProgooのレンタル掲示板サービスが2019年2月28日 23:59をもって終了しますという連絡がきてしまいました。

う~ん、こまりました。
本当に申し訳ないです。とりあえず今の掲示板は3月から見れなくなってしまいそうです。
投稿いただいた記事のデータはCSVでエクスポートできるようなので、他のサービスにうまく引き継げるなら、そうしてもよいのですが、どなたか無料で、いいの知りませんでしょうか?

引き継げないようなら、アドレスとかそういうものを消して、質問と回答部分のみ、ダウンロードとかできるようにしましょうかね…。

なんかいいアイデアないでしょうか?最後まで人頼みという…

ただ、SAS社が既にJapan SAS Discussionという素晴らしい仕組みを運営していて、そちらが活発なので公式の利用をお勧めします。
https://communities.sas.com/t5/Japan-SAS-Discussion/bd-p/ja_forum

SAS社には未来永劫の継続をお願いしたいです

新年の挨拶とか近況とかproc DSTODS2とか

あけましておめでとうございます。本年もよろしくお願いいたします

全然更新できてないですね、まさか去年1年間で5記事しかだせてないとは…。
今年でこのブログも7年目ですかね。今年は少なくとも10記事はだせるように頑張ります。

社会人も10年くらいにして、やっと観念して毎日せっせこ真面目に働いてしまうようになってしまったということ、2歳児って元気で、SASコード書いてるとキーボード触ってきて打てないよっていうこと、面白いSASブログ書かれる人が増えていい時代になったので、そういうの見てて割と満足しちゃうよねっていうのが主な言い訳です(仕事に必要な技術はだいたい忘備録にあるしなぁ)。
しかし、他にも、ちょっとPythonに浮気してみたり、あと今大阪に住んでるのですが、関西も実は結構SASプログラマがいて、そんな人たちと集まってSASで戯れてたりすると、時間が経つのが早くて、それのせいかもしれませんね。

ちなみに話が変わりますがSAS Global Forumっていうイベントご存知でしょうか?

https://www.sas.com/en_us/events/sas-global-forum.html

SAS社の説明を使わせていただくと
======================================
全世界のSASユーザーが集う年次のイベント SAS Global Forum。
本イベントは、600を超えるセッションでワークショップ、プレゼンテーション、e-ポスター、デモおよび交流プログラムがありアナリティクス活用についての事例やテクノロジーが多数紹介されます。昨年は5400人もの登録者があり、世界中のデータサイエンティストと情報交換が可能です。
======================================
ということです。日本でいうユーザー総会みたいなもんですが、さすがSASの総本山、規模がケタ違いです。
2019年4月28日から5月1日まで、米国テキサス州ダラスで開催予定なのです。

で、なんでいきなりそんな話かというと、一応そこにPaperだして、20分間発表させていただけそうです。
アブストラクト審査は通ったようで、あとは論文本体を書いたり、頑張ればいけるはずです。
何人か既に知っている方が日本から参戦することは把握しているのですが、私もでるよって方がいれば、連絡いただけると嬉しいです。
まあ、そんな感じで、毎日頑張ってる感じです。色々レスポンスが遅くて、すみません…。

さてさて、てめぇの近況なんかどうでもいいよ、こっちはSASのこと知りたくて、わざわざこのブログ見に来てんだよ!って思われていると思うので。

小ネタ。

SAS 9.4M5から、DSTODS2プロシジャという、ちょっとネタみたいなやつが実装されてます。絶対、忘備録か晴れSASで紹介するだろうから、それ待とうっと思ってたんですが、なかなか書いてくれないのでさわりだけ。
→/*====訂正======*/
晴れ時々SASで既に紹介されてました!ごめんなさい!
http://dengonmemo.blogspot.com/2017/10/945.html

どういうプロシジャかというと、データステップを書いたプログラムを指定すると、それをDS2のコードに変換して出力するという面白プロシジャです。

まあ、やってみましょうか

適当に意味のないデータステップを1つ書いて

data test;
length  z $200.;
x=1;
y=1;
z="a";
array an{*} x y;
 do i=1 to dim(an);
an{i}=an{i}+1;
 end;
 drop x;
 a=10;
 rename z=z2;
run;

それをPG1.sasという名前で保存します。

そして
proc dstods2
 in="入力パス\PG1.sas"
 out="出力パス¥PG2.sas";
run;

だけです。

するとPG2.sasができており、その中身は

data TEST;
dcl char(200) Z;
 drop X ;
rename Z=Z2 ;
vararray double AN[*] X, Y;
 method run();
X = 1.0;
Y = 1.0;
Z = 'a';
do I = 1.0 to DIM(AN);
AN[I] = AN[I] + 1.0;
end;
A = 10.0;
;
_return: ;
end;
 enddata;

おおぉ!なんかDS2の書き方になってる。
すげーって、最初ぱっと見で、思うんですが、実は結構変換が雑というか、認識可能な文法が少なすぎです…。少なくとも新規変数の宣言とかは自分で足すしかないので(コードからだけだと新規かどうかわかんないので仕方ないですが)、ある程度DS2知っていないと厳しいです。
あと、きほん全部runメソッドにぶち込まれるので、if _N_=1とかって書いたらinitialメソッドになるかなぁとか期待しても裏切られます

サポートとサポート外の文法については
https://documentation.sas.com/?docsetId=proc&docsetTarget=p0zok9sr2a2t46n1r8zfuw5145t5.htm&docsetVersion=9.4&locale=en
をみてください。

あくまで個人の感想ですと前置きした上で、はっきり言わせていただきます。
使えねぇ…。
これで出てくるコードを手直しできるレベルの人なら、1から書いた方が絶対はやいだろ。

ちなみに例ででてきたPG2.sasですが、以下のように補完してやれば一応動きます。

proc ds2 libs=work;
data TEST(overwrite="yes");
dcl char(200) Z;
dcl double a;
 drop X ;
rename Z=Z2 ;
vararray double AN[*] X, Y;
 method run();
dcl double i;
X = 1.0;
Y = 1.0;
Z = 'a';
do I = 1.0 to DIM(AN);
AN[I] = AN[I] + 1.0;
end;
A = 10.0;
;
/* _return: ; */
end;
 enddata;
run;
quit;

今後の進化を期待なのかなぁ




nofmterrが想定してないエラーを隠してしまうこともあるんだよって話

ユーザー定義フォーマット が参照されているSASデータセットを開く場合は、カタログがwork等、デフォルトで検索される場所以外にあるのであればfmtsearchでカタログの存在するライブラリ名を指定する必要があります。

しかし、とりあえず、フォーマット当たってなくて、値でいいから開きたいという場合に
opions nofmterrを指定するケースがあります。そうしておけば、ユーザー定義フォーマットが見つからなくても、値で表示するので、開けるようになります。

で、結構パッと過去のデータみたいけど、フォーマットが見当たらないみたいな時に、使って、効いたまま、次の処理や作業をしちゃうことがあります。

そういう時に怖いのが以下のようなケースです

data  _null_;
x=input("2018/01/01",yymmdds10.);
put x=;
run;

よくあるミスですが、入力形式にyymmdds10というものは存在せず,yymmdd10.と指定するべきなので、当然














エラーになるので、気づくことができます。

ところがoptions nofmterrが効いていると



























赤線は残りますが、ERRORという扱いではなくなり、欠損のまま、問題なく処理が終了してしまいます。
これは見落としてしまいがちなので、要注意です。
必要がなくなったらoptins fmterrに戻しておくことをおすすめします。
あと、SAS ondemandなど一部のパッケージではデフォがnofmterrだったりするっぽいので気をつけてくださいな。