2.6K Views
April 04, 24
スライド概要
[第7回大阪sas勉強会]森岡裕
SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです
SAS Undocumented Procedure& Minor or Lost technology -SAS裏技集- イーピーエス株式会社 森岡 裕
大前提としてSASのリファレンス管理はずさん 一昨年,米ダラスでのGlobal Forumで何人かのSAS開発者と交流してその時訊いた内容が元ですが 開発チーム(者)が細分化されていて,基本的にリファレンスの項目はその開発元の記載をベースに編纂される リファレンスに載っていない文法,関数,プロシジャ(内のオプション)などはたくさんある ただし,バリデーションのとれていない機能は原則,WARNINGでExperimental といった記載がでるので,製品 に含まれていて実行できる機能は保証されていると考えて良い SAS開発者つかまえて 酒飲ませないとSASの 機能は全部わからんぜ ドキュメント 糞面倒 Proc format開発者 有名なSAS Instructer
リファレンスから漏れる理由と判明する理由 ①開発者の申告し忘れ →ほぼコレ 何故それが判明するのかというと,SAS開発者は必ず,開発した機能周りのPaperをForumその他の種々の会 で発表するのですが,そのPaperの中で,普通に紹介してて判明する ②開発者の消失 →古いプロシジャに多い SASが初期の頃に,買収した会社の製品を組み込んでプロシジャ化したけど,その会社の社員がいなくなっ て,機能だけが残るパターン.リファレンス編纂チームに申請上げる人がいないので漏れる 古いリファレンスに載ってたりするので,判明というか,会社の長老が教えてくれる ③リファレンス編纂チームの怠慢・編纂者の消失 →単純に多い リファレンス編纂チームも細分化されているので,どっちのリファレンスにいれるか微妙な機能はどっちに もはいらず漏れたりする.編纂者が引き継ぎせずに辞める.あと,次版で入れようと予定しておきながら普 通に忘れてるケース多い.開発予定をくまなくチェックしたりSASNewsを隅々まで読むような変態がブログ とかで教えてくれる.あと開発者 ④謎 →誰が作ったのか,いつからあるのか…?機能すら正確にわからないが,確かにある… 判明経路は,だいたい変態がsashelpのvfunc viewの中を探索したり,適当なキーワード総当たりで試して みつける…
UDP代表格 Proc delete たぶん,9.13とかもっと前とか,15年以上前からいて,開発者論文とかでバレたらしいプロシジャ ・イジメられている奴.また今回も載らなかったね,かわいそうな子… がバージョンアップの度の定番ネ タだった.リファレンスの怠慢説,開発者の消失説あり data a; x=1; run; proc delete data=a; run; proc delete data=work._all_; run; proc delete data=a b c; run; データセットを消すことに特化したプロシジャ.どんなに巨大でも最短最速で消しさる.Proc datasetのよ うにデータセットの余計な情報(ディスクリプタ部)を見に行かず,ただだた消す. シンプルで,速く,説明書がなくても,間違えようのない名前のため長年愛されてきた が…
9.4でとうとう,正式なリリース!! 高度なプロシジャ・複雑な統計プロシジャに混じって, なんでこんな基本的機能が今さら??と新規ユーザーを困惑させた SASマニアの間では,嬉しいような, 悲しいような… 自分たちだけが知ってるアングラなのがメジャー デビューしたような気持になったとか なんないとか…
Proc spell version6とかの時代にSASが買収したシステム会社が作っていたスペルチェックシステムをそのまま,SAS の基幹システムにぶち込んで誕生. SAS成長期のゴタゴタに紛れて,リファレンス更新から漏れて今に至る ふっるいリファレンスではその存在と機能を確認でき,9.4M6でも問題なく動く 単純なミスほど真におそろしいものなので,普通に愛用しているプロシジャです
proc spell words=target suggest; run; suggestオプションをつけると,辞書 との一致度をみて,候補ワードを提 示してくれる.
辞書って? proc catalog catalog=sashelp.base ; contents; quit; マスター辞書 MASTER ……… ……… Proc catalogでその存在は確認できるが,特殊なタイプで保存されており,中身は多分みれない. MASTERだけ,特別な辞書で,NOMASTERオプションをつけない限り,絶対にこの辞書は照合に使用される ちなみに,既知の補助辞書という名前で NAMES=[一般的な英語のファーストネーム],CITIES=[アメリカ合衆国の都市型],CNTRIES=[国の名前], STATES=[州の名前,およびUnited States Post Office(FIPS)コードによって,識別されるものの名前] が入っているので利用可能.使ったことないけど
補助辞書の作成 filename target "xxxxxx¥test2.sas"; proc spell words=target; run; 実務上,実際のSASプログラムを単純にproc spellにかけても,プログラマ名や一時変数,SAS関数, および臨床用語や統計用語など無害なものが大量にひっかかってしまい,見にくくてしょうがない.
補助辞書の作成 マスター辞書 MASTER ……… ……… 補助辞書1 (ユーザー作成辞書) XXX ……… ……… Spell Check!! 補助辞書2 (ユーザー作成辞書) XXX ……… ……… ユーザーが補助辞書を作成して,それをマスター辞書にたしてチェックできる
補助辞書の作成 filename learning " xxxxxx¥追加.txt"; proc spell words = learning create dict = work.mycatalog.spell; run; work. mycatalog. spell すでに存在する辞書カタログに追加する場合は createの箇所をupdateに変える. createはすでに同名の辞書がある場合,リセットしてから作成してしまうので注意!! つぎ足しながら 作っていくことが多いので気を付けて
補助辞書の使用 proc spell words=target dictionary = work.mycatalog.spell suggest verify ; run; work. mycatalog. spell マスター辞書 MASTER ←先ほど,でていた誤検知が全て消えている ・複数の補助辞書を使いたい場合はdictionary = (lib1.catalog.s1 lib1.catalog.s2 lib1.catalog.s3) のようにリスト形式で指定する ・補助辞書を利用する場合,verifyをつけないと余計なログがでる ・補助辞書だけでチェックを行いたい場合はNOMASTERといれればよい
実務で活用する上のヒント ・古いプロシジャのため,結果をデータセットにだしたり,html表示やEXCEL表示もできない. 結果を外部ファイル化するためにはproc printto を使う必要あり proc printto print=“xx¥xxx.txt" new;run; proc spell …;run; proc printto;run; ・SASHELP.VFUNCなどにSAS関数の情報が全て入っているので,それを一度テキストに吐いて,補助辞 書に追加してやればよい.SDTM,ADaMで使用される変数名や, terminologyも食わしてやればよい ・補助辞書追加するときに,なぜか,全大文字,全小文字両方で登録してやった方がよいようです.片方 だけだと誤検知がおきます.一旦データセット化してupcaseとlowcaseで2obsずつ吐くように森岡はして ます ・補助辞書だけでチェックを行いたい場合はNOMASTERといれればよい
よりマニアックな話 ・まずproc spellは,読み込んだ文書を単語単位(ポテンシャルワード)に切り分けます ブランク,特殊記号,改行文字に先立つアルファベットを見つけ,ポテンシャルワード開始位置とします 特殊記号は,‘ , “ , ( , { ,[ ,< です 無効な文字列に到達した時点で,その直前の有効な文字までをポテンシャルワード終了位置とします ここでいう有効な文字とは ・すべてのアルファベット文字 ・のちにアルファベット文字が続いているハイフン ・のちにアルファベット文字が続いているアポストロフィ(または単引用符) つまりdosen’t copy-edit , xxyy’zz は3つのポテンシャルワードということになり “’embedded (nested) quotation ‘” は’embeddedとnestedとquotationという3つのポテンシャルワードとし て扱われます
よりマニアックなテクニック 複数形・ed・現在進行形 (ing) affair/s として,スラッシュsをつかって辞書登録すると ①affair ②affair の2ワードを登録したのと同義になる affect/* としてスラッシュ*をつかって辞書登録すると ①affect ②affects ③affected ④affecting の4ワードを登録したのと同義になる
Proc Nickname 俺が自分用に作った確認用プロシジャが,なんか製品版に入っててよHAHAってやつ proc nickname; run; ・利用可能エンジンの略称と詳細がみれる…
調査中…
(番外編)悲劇の Proc MACHART SAS9.4M3で評価版として実装されM4で正式に削除された悲劇のプロシジャ.忘備録のmatsuさんが紹介し たので,なぜか日本での知名度が高いが が…,SAS社が一時期MSと揉めて,廃盤
(番外編)なにこれ?っていうプロシジャいっぱいあります ods listing close; goptions reset=all device=javaimg; ods html; proc gkpi mode=raised; speedometer actual=0.65 bounds=(0 0.25 0.5 0.75 1) /target=0.8 format="percent8." colors=(red yellow green blue); run; quit; う,うん…
Proc FSLIST(公式) 私以外,使っている人を見たことがない….Paper紹介数1ケタ ただ個人的には有用なプロシジャと思っている 平テキストをSAS上のFSLISTウインドウというものでリアルタイムに確認できる. メタプログラミング,Proc streamなどで文字列生成した結果を,すぐに確認してTry&Errorするのに すごく便利なんだけど…
UDF(Un Documented Function)代表格 monotonic関数 処理連番(関数を通過するであろう仮想連番数)を返す関数 proc sql; select name from sashelp.class where monotonic()=3; quit; proc print data=sashelp.class; where monotonic()=3; var name; run; data A; set sashelp.class curobs=cur; where monotonic() in (3,5,10); a=monotonic(); b=cur; keep name a b; run;
monotonic関数 非常に癖強い関数. where 3 <= monotonic() <= 6 などとかくとSAS内部で WHERE (3<=MONOTONIC()) and (MONOTONIC()<=6) に変換され,1記載ごとにカウンタリセットされてし まうなど,あまり応用を効かせようなどと考えると痛い目をみるのでほどほどにしておいた方がよい 多分,説明するのが面倒なのと,余計なクレーム来てほしくないからリファレンスにのせないのだろうと,まこ としやかにささやかれている SQLでMONOTONIC関数を使用することについて。[SAS忘備録] https://sas-boubi.blogspot.com/2014/02/sqlmonotonic.html monotonic関数でアイタタタ [データステップ100万回] http://sas-tumesas.blogspot.com/2016/04/monotonic.html
UDS(Un Documented Statement)代表格 Do over ステートメント 非明示配列によるインデックス変数不要のループ data Q1; X=1;Y=2;Z=3;output; run; data A0; set Q1; array AR{*} X--Z; do i=1 to dim(AR); AR{i}=AR{i}+1; end; drop i; run; data A1; set Q1; array AR X--Z; do over AR; AR=AR+1;output; end; run;
Do over ステートメント インデックス関数がいらずiやjなどでミスることを防げるので非常に有用 特に配列全部を一律処理したい場合は本来,カウンタの設定は不要なのでdo overは非常に重要 初期の頃のリファレンスにはあったらしいが,いつごろからか消えたため, 将来的に削除予定なのか?SAS社としては非推奨なのか?とユーザーが混乱した. よくDo over推奨派と否定派のバトルになっていた が… 最近明記された….SAS社の開発者のtwitterで,忘れただけみたないのがあったらしい…. オイオイ…
UDR(Un Documented Routine)? Call sorthルーチン data _null_; x=2; y=3; z=1; call sortn(x,y,z); put x= y= z=; run; data _null_; x="C"; y="A"; z="B"; call sortc(x,y,z); put x= y= z=; run; 変数の中身を横方向にソート入れ替えするルーチンで,対数値ようのSORTNと対文字値用のSORTCが あって,一時期たぶん,UDとしてCALL SORTHという,そのスイッチを自動でやってくれるものが あって,最近評価版になってて,最新では 名前を変えて登場…
UDF最強 DMAX関数(DMIN,DSUM,DMEAN) Paperヒット数驚異のゼロ! リファレンスには過去一度も載らず! 海外コミュニティでも話題ゼロ!! でも… たしかに存在している恐怖 data TEST; A1=50; B1=20; C1=30; D1=40; A2=1; B2=3; C2=3; D2=.; ANSWER1 = dmax(A1,A2, B1,B2, C1,C2, D1,D2); put ANSWER1 =; run; なんだ??一体どう最大を計算したら20になるんだ??
SASブロガーによる地道な検証の結果,浮かび上がる挙動 data TEST; A1=50; A2=1; B1=20; B2=3; C1=30; C2=3; D1=40; D2=.; ANSWER1 = dmax(A1,A2, B1,B2, C1,C2, D1,D2); put ANSWER1 =; run;
DSUMとDMEANは第2引数の意味は今だ不明… data TEST; A1=50; A2=1; B1=20; B2=3; C1=30; C2=3; D1=40; D2=.; ANSWER1 ANSWER2 ANSWER3 ANSWER4 = = = = dmax(A1,A2, B1,B2, C1,C2, D1,D2); dmin(A1,A2, B1,B2, C1,C2, D1,D2); dsum(A1,A2, B1,B2, C1,C2, D1,D2); dmean(A1,A2, B1,B2, C1,C2, D1,D2); put (ANSWER1-ANSWER4) (=); run; 結果ログ ANSWER1=20 ANSWER2=50 ANSWER3=100 ANSWER4=33.333333333 そもそも,誰が一体,何の目的でいつから実装? そして公式,非公式,何故一度も,触れられない??
WebブラウザベースのViyaとリファレンスが統合されたことにより,ローカルSASの固有機能が どんどん漏れまくっていっている現状… このままだと,どんどん,今までの小技がUndocumentなオーパーツみたいになっていきそう… SAS社は多分そんなこと,どーでもいいと思ってる
カスタマイズツールの技術
右クリックカスタマイズの技術
結論 • ほぼ役に立たない知識である.しかし,ムダが文化を生むといわれ るように,プログラミング文化,SAS文化はきっとこういうくだら ないところから作られていくんだろう… • こういう他愛のない話は面白いので,臨床統計の世界にも,私みた いなのが少しはいてもいいかなと,文化の担い手と開き直って活動 していこうと思いました(笑)
ご清聴ありがとうございました!!