今まで、大規模なトランザクションデータについてはパススルークエリを投げてDB側で処理をしてもらってからSASに持ってくるようにしていたので、SASでの並列処理は考えなくても不便はありませんでした。 今回、諸事情によりSAS側で大きな(100GB程度)のトラ…
VirtualBox 1.5.2 + Ubuntu 16.04 LTSの環境で、Ubuntuをアップデートしたら左側のLauncherと上のタスクバーが消えた。Unityの設定を変えて再起動したり、いろいろ試してみたが、実はすごく単純なところで引っかかっていたので忘れないようにメモ。まず、PC…
ランダムな変数を返す関数はRAND()ですが、ランダムな文字列を返す関数が見つからなかったので作ってみました。 うまいやり方があると思いますが、これで十分でした。まず、自作関数を定義します。 proc fcmp outlib=XXXX.fucntions.test; function getRando…
SAS日付と8桁数値の変換方法はいくつかあるみたいなので、覚え書き。 SAS日付→8桁数値 日付関数を使う YEAR(SAS_DATE)*10000 + MONTH(SAS_DATE)*100 + DAY(SAS_DATE) 文字値に一度変換する INPUT(NLDATE(SAS_DATE, '%Y%m%d'), best8.) 文字値に一度変換する…
おそらく、SASマクロ初心者にありがちなミスだと思うのですが、マクロ変数の値が思ったタイミングで更新されなくて悩んでいました。 いろいろ実験した結果、SASのマクロってやっぱりよく分からないという結論に達しました。 DATAステップ内でマクロ変数に代…
同じ状況になる人はあまり居ないと思いますが、SASからREST APIを使ってJSON形式で情報を取ってきた後、JSONをパースしてデータセットに格納しています。 proc ds2; data xxx (overwrite=yes); /* GlobalでJSONパッケージインスタンスの宣言 */ dcl package …
SASはPROC HTTPを使えば、GETやPUTなど基本的なことはできるようです。 REST APIで情報を取得するのに必要でした。 ここでは、GETした内容をローカルのファイルに書き出しています。 簡単ですね。 FILENAME resp "C:\xxx"; PROC HTTP METHOD="GET" URL="http…
該当する人は多くないかもしれませんが、SAS Enterprise Guide(以下EG)での作業が定常化してきて、EGのスケジュールを用いてWindowsのタスクスケジューラに登録してバッチ化しています。(残念ながら、Base SASは現環境にありません) そうすると、データが…
重複レコードの数を数える キーが複数あるようなテーブルで、重複しているレコードを取り出したいことがある。 そんなときは、まず重複するレコード数を数える。 たとえば、ID1とID2の2つを指定することでレコードが一意になるテーブルで、ID1とID2のセット…
SASでマクロを書いたときに、戸惑った覚えがあることを残しておきます。 どうでも良いですがSASでマクロを書くと、(書いたこと無いけど)COBOLとかの昔からある言語はこんな感じかなぁと思ってしまいます。 PUT、INPUT関数 これを%SYSFUNCの中で書いたら、…
PROC LOGISTICのオプションではなくて、予測値と実績値が揃っているデータセットに対し、ROC曲線を描く方法。ここを参考にしました。 http://www2.sas.com/proceedings/sugi22/POSTERS/PAPER219.PDFDATAIN = データセット名 LOWLIM = データ分割範囲の下限 U…
EGとEMを同時に使っている環境はわりとあると思う。たぶん。 ただ、EGとEMでデータセットをやりとりしようとすると、なぜかうまくいかないことがある。 そこで、割と無理矢理編み出した感があるデータセットのやりとり手法を忘れないうちに載せておこうと思…
この前、とある人からSASの研修資料片手に、「プロンプトって何?」と聞かれた。 正直、そんなのあったっけ?という感じだったので、ちょっとさわってみたら使い方によっては便利だった。 プロンプトの使い方 (SAS EGのスクリーンショットを撮れる環境では無…
条件によって処理を変えたいとき 普通に考えればif文やcase文を使う。 たとえば、販売金額(sales)10万円以上の場合は、手数料(commission)が2%で10万円未満では手数料が5%みたいな計算をしたいとき、dataステップでは if sales >= 100000 then commission = …
たとえば、確率を1%区切りにして、1%の集団での契約確率を出したいときなどには、連続値の確率を1%ごとの区分値化する必要がある。(データをエクセルに移して、図を描きたいときとかですね)PROBが確率で0から1の連続値が入っている変数だとすると CAT_PROB…
インストールしたいもの homebrewとpipで↓のライブラリを入れたい NumPy pandas matplotlib iPython SciPy 前提 homebrewとpythonとpipはインストール済み (pyenvでpython2とpython3を共存させるとか、パスの通し方などは別途検索してください) homebrewの…
SASでPerl仕様の正規表現を使ってみよう SASで正規表現を使用したい場合はPRXの関数を使うことになります。 ただし、2バイト文字の取り扱いには非常に苦労しました。 (SASはShift-JISとあまり相性が良くないと思います。 そのくせ、日本語版のSAS EGとかだ…
グループで最大値を持つレコードを取りだそう! たとえば、次の様なテーブルがあったとして 同一IDで最大の金額を持つレコードを取り出した次の様なテーブルが作りたいとします。 並び替えて最初のレコードを取り出す PROC SQLだけで書けそうで書けなかった…
SASのLOGISTICプロシジャでAUC計算 SASでロジスティック回帰などを実行する際にROC曲線を描いてAUCを計算したいと思うことがあるだろう。 その場合、もちろんPROC LOGISTICのオプションでROC曲線とAUCを出すことができる。 プログラム例 /** LOGISTICプロシ…
ばらつきを見る尺度として標準偏差があるが、ばらつきを比較する尺度としては必ずしも適切では無い。 個々の値の大きい(平均値の大きい)集団の方が、標準偏差が大きくなる可能性が高いからである。この場合、標準偏差をそれぞれの平均で割った変動係数(CV…