2017-08-29 12 views
0

免責事項:マクロ変数(下記参照)を使用した機能的なソリューションがあり、このサイトでは不適切な場合があるため、ほとんどのスタイル/ベストプラクティスに関する質問です。非正規化されたリスクスコア、例えばのデータセットを考えるSAS - マクロ変数を使用しないグローバル正規化係数の使用

.:

Dataset_1:

Person, Score 
A, 1.00 
B, 4.00 
C, 2.35 
... 

Iは算術平均が1.0となるよう正規化したいです。このデータセットを要約し、平均リスクスコアを作成し、そのリスクスコアで各観測値を分割することができました。例:

proc要約....; 1つの観測とデータセットをもたらす:

Dataset_2:

Avg_Score 
2.5 

は、次に使用:

Data _null_; Set Dataset_2; 
    Call Symput("NormFactor", Avg_Score); 
Run; 

そして:

Data NormalizedScores; 
    Set Dataset_1; 
    Score_Norm = Score/&NormFactor.; 
Run; 

をしかし、これは私にはゴミのコードのように思えます。これを行うより良い方法はありますか?

答えて

2

をお試しください。データセットをマージするだけです。そうでなければ、ただ一つの意味があればそれらを設定してください。例えば

(。あなたはBY変数を持っている場合、マージ):SETの文から来

data dataset_1; 
input Person $ Score; 
datalines; 
A 1.00 
B 4.00 
C 2.35 
; 
run; 
proc means data=dataset_1 noprint; 
    var score; 
    output out=dataset_2 mean=avg_score; 
run; 


Data NormalizedScores; 
    set dataset_1; 
    if _n_=1 then set dataset_2; 
    Score_Norm = Score/avg_score; 
Run; 

変数が自動的に保持され、我々は一度だけ第二のデータセットを読み込むために、彼らはありませんよ置き換えられるか、または欠落に設定されます。

PROC STANDARDの新しいバージョンであるPROC STDIZEを使用するともっと滑らかな方法がありますが、正確に特定の方法があるかどうかはわかりません。

+0

'STDIZE'はSAS/STATの一部であり、' PROC STANDARD'はBaseにあります。私はそのためにSTANDARDを使う傾向があります。 – DomPazz

1

は、あなたがそれを昔ながらの方法を実行したい場合は、マクロ変数より良い方法があるPROC STANDARD

data test; 
input Person $ Score; 
datalines; 
A 1.00 
B 4.00 
C 2.35 
; 

proc standard data=test out=test2 mean=1; 
var Score; 
run; 
+0

私はスコアを乗法的に正規化したいと考えています。私は "標準的な"手続きを知らなかった。変換をログに記録してこのメ​​ソッドを使用することができますが、この手順でこれをより滑らかな方法で実行するオプションがありませんか? – riemannh

+0

私はそうは思わない。おそらく、ログ変換が最良の賭けです。これを行う別の手順があるかもしれませんが、私は考えることができません。私はこれを行うマクロを記述し、必要なときにそれを使うだけです。 – DomPazz

関連する問題