SAS

【SAS】SPDEとTHREADによる並列処理

SAS

今まで、大規模なトランザクションデータについてはパススルークエリを投げてDB側で処理をしてもらってからSASに持ってくるようにしていたので、SASでの並列処理は考えなくても不便はありませんでした。 今回、諸事情によりSAS側で大きな(100GB程度)のトラ…

【SAS】ランダムな文字列を生成する

SAS

ランダムな変数を返す関数はRAND()ですが、ランダムな文字列を返す関数が見つからなかったので作ってみました。 うまいやり方があると思いますが、これで十分でした。まず、自作関数を定義します。 proc fcmp outlib=XXXX.fucntions.test; function getRando…

【SAS】マクロ変数の更新されるタイミング

SAS

おそらく、SASマクロ初心者にありがちなミスだと思うのですが、マクロ変数の値が思ったタイミングで更新されなくて悩んでいました。 いろいろ実験した結果、SASのマクロってやっぱりよく分からないという結論に達しました。 DATAステップ内でマクロ変数に代…

【SAS】PROC DS2でhttpのgetとJSONのパースをやってみた

SAS

同じ状況になる人はあまり居ないと思いますが、SASからREST APIを使ってJSON形式で情報を取ってきた後、JSONをパースしてデータセットに格納しています。 proc ds2; data xxx (overwrite=yes); /* GlobalでJSONパッケージインスタンスの宣言 */ dcl package …

【SAS】PROC HTTPを使ってみた

SAS

SASはPROC HTTPを使えば、GETやPUTなど基本的なことはできるようです。 REST APIで情報を取得するのに必要でした。 ここでは、GETした内容をローカルのファイルに書き出しています。 簡単ですね。 FILENAME resp "C:\xxx"; PROC HTTP METHOD="GET" URL="http…

【SAS】Enterprise Guideを止めるコマンドは存在しない!

SAS

該当する人は多くないかもしれませんが、SAS Enterprise Guide(以下EG)での作業が定常化してきて、EGのスケジュールを用いてWindowsのタスクスケジューラに登録してバッチ化しています。(残念ながら、Base SASは現環境にありません) そうすると、データが…

【SAS】キーが複数存在するテーブルで重複レコードを抽出する

重複レコードの数を数える キーが複数あるようなテーブルで、重複しているレコードを取り出したいことがある。 そんなときは、まず重複するレコード数を数える。 たとえば、ID1とID2の2つを指定することでレコードが一意になるテーブルで、ID1とID2のセット…

【SAS】マクロで戸惑ったこと

SAS

SASでマクロを書いたときに、戸惑った覚えがあることを残しておきます。 どうでも良いですがSASでマクロを書くと、(書いたこと無いけど)COBOLとかの昔からある言語はこんな感じかなぁと思ってしまいます。 PUT、INPUT関数 これを%SYSFUNCの中で書いたら、…

【SAS】ROC曲線を描く

SAS

PROC LOGISTICのオプションではなくて、予測値と実績値が揃っているデータセットに対し、ROC曲線を描く方法。ここを参考にしました。 http://www2.sas.com/proceedings/sugi22/POSTERS/PAPER219.PDFDATAIN = データセット名 LOWLIM = データ分割範囲の下限 U…

【SAS】EMのデータをEGで読み込む

SAS

EGとEMを同時に使っている環境はわりとあると思う。たぶん。 ただ、EGとEMでデータセットをやりとりしようとすると、なぜかうまくいかないことがある。 そこで、割と無理矢理編み出した感があるデータセットのやりとり手法を忘れないうちに載せておこうと思…

【SAS】プロンプトを使ってみた

SAS

この前、とある人からSASの研修資料片手に、「プロンプトって何?」と聞かれた。 正直、そんなのあったっけ?という感じだったので、ちょっとさわってみたら使い方によっては便利だった。 プロンプトの使い方 (SAS EGのスクリーンショットを撮れる環境では無…

【SAS】IFNとIFC

SAS

条件によって処理を変えたいとき 普通に考えればif文やcase文を使う。 たとえば、販売金額(sales)10万円以上の場合は、手数料(commission)が2%で10万円未満では手数料が5%みたいな計算をしたいとき、dataステップでは if sales >= 100000 then commission = …

【SAS】変数を区分値化する

SAS

たとえば、確率を1%区切りにして、1%の集団での契約確率を出したいときなどには、連続値の確率を1%ごとの区分値化する必要がある。(データをエクセルに移して、図を描きたいときとかですね)PROBが確率で0から1の連続値が入っている変数だとすると CAT_PROB…

【SAS】正規表現の取り扱い

SAS

SASでPerl仕様の正規表現を使ってみよう SASで正規表現を使用したい場合はPRXの関数を使うことになります。 ただし、2バイト文字の取り扱いには非常に苦労しました。 (SASはShift-JISとあまり相性が良くないと思います。 そのくせ、日本語版のSAS EGとかだ…

【SAS】グループで最大値を持つレコードの抽出

SAS

グループで最大値を持つレコードを取りだそう! たとえば、次の様なテーブルがあったとして 同一IDで最大の金額を持つレコードを取り出した次の様なテーブルが作りたいとします。 並び替えて最初のレコードを取り出す PROC SQLだけで書けそうで書けなかった…

【SAS】ROC曲線のAUCを計算する方法

SAS

SASのLOGISTICプロシジャでAUC計算 SASでロジスティック回帰などを実行する際にROC曲線を描いてAUCを計算したいと思うことがあるだろう。 その場合、もちろんPROC LOGISTICのオプションでROC曲線とAUCを出すことができる。 プログラム例 /** LOGISTICプロシ…