The Nameless City

何故か製薬やSAS関連のブログ、の予定。

SAS Tips

知っていると便利なproc compareのオプション。

proc compare listvar outbase outcomp outdif outnoequal base=xxx comp=xxx out=xxx ; quit ; |sas|< proc compareの出力は、HTML出力化してもとてもイケてないのは言わずもがな、V6からも変わってない気がします。 存在しない変数も値比較の中で欠損値と…

Programming Data Vectorとはなんぞやという話で。

Programming Data Vector自体は、メモリ上に1レコード分(+アルファ)確保される、DATAステップを処理するために一時的にメモリ上に確保される論理領域、です。 SASデータセットは、可変長文字列とかがないので、1レコードの論理バイト長とかはDATAステッ…

小数点第何桁というのをround丸め用数値とformatの桁数で考える場合

他人のマクロのバグ取りはつらい。 roundの丸め用の数値と、put等で利用するformatの桁数には違いがある。 というのは、結構面倒臭いのだが、 format w.d round 10**(-d) という関係なのであるよと。ただし、d>=0の整数。 data _NULL_ ; a=123.4567891234 ; …

SASのドキュメントの調べ方(英語なのは諦めて)

support.sas.com support.sas.comに行けば大抵はあるよ、という話で終了そんだけだと少しさみしいので足すと。 support.sas.comのあるきかた 製品のマニュアルは「documentation」 SASのHELPは一応全てのパラメータを説明はしてくれています。exampleもあり…

有効桁数で丸めた上で文字列に変換するマクロや自作関数とか

マクロ 自作マクロ故に担保はしない。 使う前に適当にテストしてほしい。 なお、指摘受け付ける。 著作権については、好きにしていいよ。 使い方 %mround_digit : [出力先の文字変数]=%mround_digit([元データになる数値変数], [有効桁数]) ;[有効桁数]は1以…

SASのライセンスとは別に、モジュールにライフサイクル終了があったりするよという話。

タイトル通り。 この期限が来ると、モジュールが動かなくなります。 support.sas.com よくSASのバージョンをどう管理しどう更新していくのかという話がありますが、Enterprise Guideとかを使いゆるくやってる場合には、おとなしくアップデートに流されていく…

SAS関連のPG

github.com SASを使うプログラマーが、SAS言語でプログラムを書く時代が終わりつつある予感。

MFILEが使えそうな。

最近はSASのKnowledgeが溜まらんなあという。 MFILEオプション MPRINTの内容をファイル出力出来る機能。 これを使うとマクロ展開後のソースが出力されるので便利だ。 これってSASマクロで実際には組んでおくけど、マクロの検証が完了しない状況でも作成され…

SASの欠損値

www.cresco.co.jp 見かけて、ふむふむと頷いていたのですが。 SASの欠損値の要諦 missing valueと英語表記されますが、RDBのNULLとは違う挙動をします。 NULLは型としてNULL型があるが、SASの場合には文字列型・数値型などの型を持ちます。 結果として、欠損…

COMPAREプロシージャ使い方(ダブルプログラミング用)

変数の数不一致を検出(しやすいように) LISTVARオプションつける 計算誤差をスルーしたい場合 METHOD=ABSOLUTEとかにして、CRITERION=1E-12を設定する ※1E-12は取り決めであるけども大体これくらいの計算誤差は出る 差があったらERRORをログに出す ERRORオ…

UNIVARIATEプロシージャとMEANSプロシージャとSUMMARYプロシージャの使い分けについて少し。

これらはほとんど変わらない、とSAS V6のマニュアルを見ても書いていた記憶が・・・・・・SAS日本語オンラインマニュアルの、「Base SAS 9.4 プロシジャガイド」に載っているリスト(p.2079)とかが便利です。統計プロシージャのガイドでないところが何とい…

特殊欠損値の扱いについて少し。

sas-tumesas.blogspot.com を見て。特殊欠損値は、気がつく人は気がつく、知らない人は知らないし分かりづらいのであんまり使う事はないのですが。 以下サンプル。 data _NULL_ ; a = .M ; put a ; if a^=. then put '特殊欠損値は通常の欠損値とは異なりま…

独自のエラーをログに書く際に考える事。

SASが標準で作成するログのパターンに合わせるかどうか 「ERROR:...」「WARNING:」「NOTE:」みたいなのに合わせるかどうか。 あと、SYSERR等を取り扱うかどうか。 SAS DMSの中で色が違うだけでいい、というのであれば、ログにputステートメント等で「ERROR:.…

Excelから出てきたようなCSVを、途中の改行を別フレーズに置き換えるサンプル。

こんなの。 filename _IN ... ; filename _OUT ... ; data _NULL_ ; length TEXT $32767. ; infile _IN lrecl=32767 dlm='1a'x; input TEXT ; file _OUT lrecl=32767 dlm='1a'x; length NUM_DQ FLG_DQ 8. ; retain FLG_DQ ; if _N_ = 1 then FLG_DQ = 0 ; NU…

DMS動かしつつ、裏でバッチ実行するというやり方。

と言っても大げさなものではなく、 単純に、SASUSERのパス変えた違うsasv9.cfgで実行させればいいという話です。 パラレルにバッチ実行するには、rsasuserシステムオプションと、ods pathのパスの最初にWORK.TEMPLATEとかをprependしてやればよいです。ちょ…

コードリストになっている文字列から、コード値の数値に変換する方法

要約 コード変換については、SASの場合にはフォーマット/インフォーマットを使うのが楽です。 数値コード→文字列変換 数値フォーマットを使います。 文字列コード→文字列変換 文字フォーマットを使います。 文字列→数値コード変換 数値のインフォーマットを…

連続性の補正、という言葉について。

直接相談された訳ではないので言ってませんが、メモとして。 この単語が出てきた場合には、 何らかの値が本来は離散値であるにも関わらず、連続値として想定し、連続値用の分布を使って近似する場合で、 ちょっと統計的に有意な差が出ないような側に統計量計…

UTF-8で勘違いしてた事。

wつかないlatin-1領域でも、UTF-8に変換すると非ASCIIの所で2バイトになる。 完全にASCIIなら同じに出来るが、latin-1、wlatin-1なら変換が必要で、 latin-1 最悪二倍 wlatin-1 最悪三倍 だなと。 S-JIS領域での最悪は3倍になる事がある。 半角カナが1バイト…

SASのUTF-8で考える事アレコレ。

簡単ながら。 データセットの内容自体はほぼ対応出来る。 文字の固定長指定を長めにしなければいけないとか色々あるけど、とりあえずは出来る。 問題が残る所がある。 SASのラベルの長さが制限されているが、この為、うっかりすると文字が切れる。日本語で25…

トランスエンコーディング、というお話を見て。

namelesscity.hatenadiary.com SASユーザー総会でも誰ぞの発表ありましたが。 エンコーディング情報がないレガシーデータの地獄。 そんなデータあらへんやろーという人に一つだけ言うと。 SAS V6辺りではエンコーディング情報がデータセットにくっついてませ…

立派な客よりマトモな客求む。

もう、あのシステム保守自体切りたいんだけどマジで。 某製薬会社向けの受託開発やったのおそらく十年は前。 システム綺麗にしましょうとかバージョンアップさせましょうとか延々と伸ばされ提案は却下され、保守費用も月数時間とお客さん環境に接続する為のe…

多分、前のDISのは、当面直らないんではと思う。

namelesscity.hatenadiary.com あれからも、このバグって簡単かねえと思いながら見てたのですが、 そういや、 ・Oracleの場合二重引用符で列名を指定する事が出来た なと。 SASは名前リテラル('~'n)というのを持っているので二重引用符と一重引用符の使い…

意外と知られていない、データセットの指定方法。

ネタ用のソース。 手持ちのSASで試して見て下さい。 しかし、SAS On Demandの場合にはこれで動くかはやってないので正確な所は分かりませんが多分出来ないです。SAS University Editionも同様で、SAS Integration Technology上に乗っかってるのでは、XCMDが…

SASの各種ツールはSAS構文全てに対応している訳ではない、例としてのDISの変な挙動の話。

DISのマッピングで出てる警告について聞かれたのですが。 DISにはDISに食わせる為の書き方というのがあって、例えソースが一種類であっても、「テーブル.列名」という記述をする必要があったんじゃないかと記憶しているのです。 面倒臭いなと思ったら生SASを…

COMPRESS=オプションの活用。

実は、V6時代から存在するけど、その実あまり使われていないような気がするオプションですが、 パフォーマンス等にメチャクチャ影響するので、適度に使う事を推奨したいオプションです。 個人的にはCOMPRESS=YESってデフォルトでもいいと思うんですけどね。 …

SASデータセットでストレージが圧迫されて困る人へのTips。もう少し深めに。

「○○ではサイズがちょっとだったのに、SASデータセットにすると大きくなる」というのは、あるあるなので。 その予断を地上から消し去りたい。 SASデータセットでストレージが圧迫されて困る人へのTips - The Nameless City SASの固定長文字列型という所が悪…

SASデータセットでストレージが圧迫されて困る人へのTips

とりあえずの策 COMPRESSを有効にして保存してみる事をお勧めします。 特に文字データが多い場合には有効です。固定長文字列を採用している事もあって、SASデータセットは文字データを含んでいると無駄な容量食ってる事が多いです。 暇なら、固定長文字列の…

SASのResponseファイルが文字化けを起こす。

SAS Deployment Wizardを使うと、%userprofile%\AppData\Local\SAS\SASDeploymentWizard の中にいろいろSDWの実行ログができるんだが、その中には、画面からの選択を記憶しておいてくれるResponseファイルというのがあるんだが。 これを使って記録していた情…

HRESULT系のエラーがSASに絡むと大変だよなあという。

頭を悩ませて来た問題ではあるんだけど。 混ざって来てたから一緒の問題だと思い込んでたけど、違うわ・・・・・・ HRESULT 800ac472 from set operations in Excel Yes, you are getting the VBA_E_IGNORE error that Excel will return when you try to in…

SAS Hot Fix Analysis, Download and Deployment Tool(SASHFADD)に残念感を覚えつつ、FTPを使わずにHotfixを取得する。

うんまあ、一応言っておくと、SASのせいとは言わない。 言わないんだが、もう少しどうにかしてくれてもいい感じはある。 FTPのプロキシ設定を超えるのが、ここんとこ難しい。 ウチのProxyはPACファイル仕様である。そもそも、Windows謹製のFTPがProxyに対応…