2017-08-29 46 views
0

聲明:這主要是一種風格/最佳實踐問題,因爲我確實有一個使用宏變量的功能解決方案(如下所述),因此可能不適合本網站。SAS - 使用全局歸一化因子W/O使用宏變量

鑑於非規範化的風險評分的數據集,例如:

Dataset_1:

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

我想歸這樣的算術平均值爲1.0。我可以總結這個數據集,建立平均風險評分,並將每個觀察結果除以該風險評分。例如:

Proc Summary ....;產生的數據集與一個觀察:

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

如果你想這樣做的老式方法,還有比宏變量更好的辦法;只是合併數據集,或者如果只有一個意思就設置它們。 (合併如果你有一個可變)

例如:

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; 

的變量來自SET聲明被自動保留,因爲我們只在第二個數據集讀取一次,他們不是更換或設置爲丟失。

更光滑的方式將使用PROC STDIZE,這是PROC STANDARD的較新版本,但是我不清楚如果有一個特定的方法,正是你想要的。

+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