4 t: @" U+ l( A4 Y) u* J1 C' J ⑤ 计算诸评价对象与最优方案的相对接近程度Ci。 ' I$ d, G6 d# n& z: G # }" y0 }# _8 r Ci=D-i / (D-i+D+i) 5 M) ^" Q6 u% }" h9 i O2 P9 _' G& {( W, b& {/ D
2 实例分析与SAS宏程序7 y/ o" T7 t$ c1 a
+ g; }* Y2 f" F2 p) a$ W
以中文版SF-36为健康调查问卷,于2004年7月~2004年12月间对≥60岁老年人(602人)进行老年人生存质量(QOL)的研究,问卷包含8个领域的指标,分别为x1(生理机能)、x2(生理职能)、x3(躯体疼痛)、x4(一般健康状况)、x5(精力)、x6(社会功能)、x7(情感职能)、x8(精神健康)[2]。得到数据如下: & L( k9 T. \, d' s6 P1 Y) e; a T, g; J) }, K9 I
表1 7个地区老年人QOL各领域平均分(略) & i% r2 R1 S( B, J( F h+ |7 B& _; Q3 X
以下是宏程序:; c2 X( {3 _8 Z7 j, K
1 n& b) j7 H( P( x% g %macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); / D, _9 h1 ?1 F- _ + E% u7 `$ |6 X %let i=1; % r3 r. z( E, S' @; Q
5 a, C: ~* k/ d" E* E; {6 p %let var&i=%scan(&var_name,&i,' ');/ K, R' x: ~1 n! }8 r
5 U( F6 q- n5 v# }3 V) R+ h( o- E %do %until (&&var&i=); & e! \: p e, F a
2 k$ O }. ?% j, C e
%let i=%eval(&i+1); & j$ B$ K! a; I8 B , z2 n' d. r% f) R; v %let var&i=%scan(&var_name,&i,' ');9 G5 C/ A. I* w2 C" e4 h
, x* N/ `, l- {: y$ W
%end;9 K9 }/ R/ }: G" @
9 H% V- w9 c s/ E F
%let var_num=%eval(&i-1); *自变量个数;( O! l3 X3 j# |" f8 V
6 [% u' h! y* o- T3 q& F9 Z1 o* ^ *top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行; ) W1 C1 B3 ]0 |2 M& Y / K0 m0 ?8 Y3 g
%if &weight=1 %then %do; % N7 E4 a9 C ^6 u4 |7 E; l( z - S, f* |6 }. [/ Y' e
data top_1 top_2;3 O3 O( W: a' J# ?6 I$ i& H( j( U# l
) `7 b8 {& |; n. w. [ set &data_name end=last; " s$ r9 m) v! F6 V+ r) s* y 9 {, {% B; d& m+ F8 m6 z& H9 a
if last then output top_2; ' C; R, Y- d( B' G b * `5 e6 A7 L7 X& I3 V! F: H# N) ]
else output top_1; - `9 V, l5 A3 e# H5 o4 O % V% O+ g4 b$ k, o1 C% H" \ run;%end; 8 y9 U0 i9 J: `2 n# ]. z& T! x $ P' ]5 s6 c4 ^5 u2 X
%else %do; 8 @ P; t* o/ } / X W7 q1 E+ _& A9 o' X/ N data top_1; 4 z6 e- t9 F+ L( ~ 2 i+ N9 c" X+ F4 [6 z/ h, f" ]
set &data_name; * Y9 k; ^3 x# N* N5 Z # k; ?( O9 r4 S5 G! O! k
data top_2; 7 q& Z, x7 W- r4 q$ @) d4 U 4 q+ L6 e- ]; H %do i=1 %to &var_num;+ J; d+ z% h- ]: F) V
1 {5 s/ _3 {' r4 x/ K" [) \8 k' A
&&var&i=1; / ^! u [8 w* D' k ) T3 _, R; E3 G* x8 d. `
%end;/ M8 Q0 R/ l6 p/ F- e/ t" Y% \
: i5 ~% q% X2 E2 j" G' c4 E' y3 [
run;%end; ; O: c. {( B$ @ ; `6 e3 _; b, N- V6 a) ^- D
data _null_;*样本个数;* ^/ I+ L2 M+ J& K3 _, J
/ \6 D& L% R" i) `: m& B8 [ set top_1 end=last; - G8 v( g" N, I S 0 X, ?# [ q7 @) o8 L8 d
if last then call symput('obj_num',compress(_n_)); ( p6 g2 J* S! ?; I 9 q, c$ a& }* M! M2 Y/ [/ D %let sqr_str=; 2 Y4 `; Y% M! G 7 y X/ G- |/ Z6 S
data top_a; *求各指标值的平方;& A w3 S" B7 f* y
8 B9 V1 z3 N" k4 v) b: p7 \( G7 u. b2 K set top_1 end=last;" ]% D0 n8 H0 b
$ W, ]/ U1 p" ~9 A/ O8 C
%do i=1 %to &var_num;# A0 q' M* G* j0 d* S J# G
5 @* M# \" c+ D e2 w" t$ E( O. a
&&var&i.._2=&&var&i ** 2;, K1 x, l! N0 Q" Z" o* v! F: U6 R
& n3 h; V% n7 g %let sqr_str=&sqr_str &&var&i.._2;%end; 0 e+ I2 b! ? N4 z7 } 4 e$ F) O* W; e- B proc transpose data=top_a(keep=&sqr_str)prefix=top_m out=top_b; *对平方值矩阵转置;4 x9 {* I6 T0 f/ r
$ @# n6 P' A- q. h h% `: U
proc transpose data=top_a(keep=&var_name)prefix=top_n out=top_C; *对原始数据矩阵转置;% J; m2 e" T1 F& K+ @4 b
7 P/ U% K' r, x( q/ G3 O$ |/ g9 b/ _
proc transpose data=top_2(keep=&var_name)prefix=top_w out=top_w; *对权重数据矩阵转置;* Z, f ]3 V) L- i, {
* W. D! q, ]& h. T5 d
data top_d; *求各指标值的平方和;' g9 j0 d" A4 N9 M& p: z! H+ s
( R: d& O) H; x$ v
set top_b;( @- C( y5 v5 V0 p/ l
3 A- ~) U0 B: u# B
z=sum(of top_m1-top_m&obj_num); # n% g) I. X& A" Z' v M) B$ K, `2 D( S3 m' T0 H %let min_str=;%let max_str=;: c+ ?# E4 a( x* T3 l$ ?% Q% _
/ J& ~5 H U( \: }$ N0 K' Y5 D8 l
data top_e;3 s5 k) j5 f+ i4 b) ^9 b