Topsis法是technique for order preference by similarity to ideal solution的缩写,意为与理想方案相似性的顺序选优技术,是系统工程中有限方案多目标决策分析的一种常用方法,可用于效益评价、卫生决策和卫生事业管理等多个领域[1]。此方法对样本量、指标多少及数据的分布无特殊要求和限制,灵活、方便、实用。但目前几种常用的统计软件包并没有提供现成的计算机程序,而现有已发表的关于Topsis法的SAS程序在应用于不同数据时,需要做较多修改,并且不能进行加权Topsis法的运算。本研究就Topsis法综合分析的SAS程序做了进一步的改进,使之更简单实用,以满足实际工作的需要。. z' v9 f$ N( G* X9 Z) ]
n; U# R8 ~: l1 t8 h( a/ s 1 原理与方法 : @) I1 F' d; B7 Z# f4 X) g7 w - U! B5 g* w- B: w; L- Z
基于归一化后的原始数据矩阵,找出有限方案中的最优方案和最劣方案构成一个空间:待评价的某方案可视为该空间上的一个点,据此可获得该点与最优方案和最劣方案问的距离(常用欧氏距离(Euclidean distance)),从而得出该方案与最优方案的相对接近程度,借此可进行方案优劣的评价[1]。其原理和方法如下: b) S0 Q3 j1 s+ @' O 3 m- T9 Z5 l( _$ |, B8 U+ U E ① 同趋势化:通常采用低优指标转换为高优指标的方式,可采用倒数法和差值法。 % W) L2 p4 O; q& J + o$ I/ o7 ?. c3 Q2 A" D/ B: N ② 无量纲化:为了消除计量单位的影响,需要做归一化处理。设(xij)n×m为同趋化后的指标矩阵,aij=xij/ ?ni=1 x2ij,j=1,2,…,m,建立则归一化矩阵(aij)n×m。 ) g! s5 p; _3 E& v 8 L! n4 K( m, ~ ③ 求有限方案中的最优方案A+和最劣方案A- 。最优方案为:A+=(ai1+ ,ai2+ ,… ,aim+),最劣方案为:A-=(ai1- ,ai2- ,… ,aim-)。4 ?# f; k' V6 t! K
4 h1 j! E0 w4 _) \# X/ r, y$ @0 n3 X Ci=D-i / (D-i+D+i) " n4 K# ~8 G' @8 ^! ]+ Z. {# B- U1 K$ d* `4 b2 O
2 实例分析与SAS宏程序 - B: n0 o0 t2 q4 P# L % x# |- j: i. `5 t. z) }' L 以中文版SF-36为健康调查问卷,于2004年7月~2004年12月间对≥60岁老年人(602人)进行老年人生存质量(QOL)的研究,问卷包含8个领域的指标,分别为x1(生理机能)、x2(生理职能)、x3(躯体疼痛)、x4(一般健康状况)、x5(精力)、x6(社会功能)、x7(情感职能)、x8(精神健康)[2]。得到数据如下: " o9 _$ p( | q6 p4 X/ a' g0 w4 ~8 P6 X
表1 7个地区老年人QOL各领域平均分(略) 0 |- t0 q1 H0 @2 _5 ` + q8 U7 e. Y, |9 L1 L$ N+ z 以下是宏程序: / L" g" Z6 Z) a" s& A! W7 o3 S! |+ d) Q3 x! V% b0 @+ Q' v
%macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); 6 h( V5 u" V; i! N5 q9 u# P7 F 8 a7 w, S: ~* A5 S %let i=1; `0 b2 k2 L! e5 q7 F : e2 M! D/ n" p %let var&i=%scan(&var_name,&i,' ');7 ]# o" O% X1 K. o4 Z2 {
' e+ @1 G3 J5 ~6 ]" Z% j
%do %until (&&var&i=); ) w% ~0 Z- U0 q' x, s5 u 7 z2 W0 W7 { Z+ h, s$ }8 v( h- F
%let i=%eval(&i+1);1 `4 I6 J5 F: |9 c
: {; X! k* O [
%let var&i=%scan(&var_name,&i,' '); ; L$ U1 {/ d0 g7 B: M * ^- y9 i8 y+ f4 y; ] %end; 3 K9 @0 ?; b7 z: ~& a5 v 5 `8 \7 P" }; O0 f0 M. c
%let var_num=%eval(&i-1); *自变量个数; 6 ^ m" j! M) K$ J5 I$ f9 o' R) u 6 \; b3 }7 {# Z" d( y
*top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行;9 e1 {. ~& x$ c9 M2 X
: b. C* h3 q1 U& e, o %if &weight=1 %then %do; Z+ [) }/ @5 F" _2 C, X v m
O. H, o* S8 ] data top_1 top_2; ! I8 s. a. V1 q " R& v3 `! }& O
set &data_name end=last; \( O# }3 [ B2 j5 @! t* D/ q8 s# M0 v % ~9 r2 }+ ^3 [9 k
if last then output top_2;2 U5 v( L7 s! S& I, @) m2 G# p
4 ^- I! T+ Z; X# T2 d6 ?0 [# e else output top_1;9 C q' x T. Q6 u& }0 G8 Q( k0 J
! o' r& |, z p$ ?- y2 K# B* _% n run;%end;7 {2 s# ^6 ?- J0 J' q. H& e0 F
) l8 P* y2 ]2 g, q9 s5 ?
%else %do; . c" h. e/ D2 M7 s: @ # b$ _8 e1 Y. M$ L, o5 W& H) l4 u data top_1; ) r2 [9 U( t6 S Z ( A' `# m: {9 M) k) S set &data_name;! }( `6 T$ d2 I5 n2 `# e6 L" H+ g
; n3 y5 H h: |1 O7 o
data top_2; 6 `! I! l- G* L : \! [+ T: K% y5 c5 \$ X
%do i=1 %to &var_num;, |& e9 L$ l% ^$ ?7 @
7 E+ H: O3 W4 {* q7 Z6 H; d Q3 B, H &&var&i=1; & m$ S" _' R/ i3 m3 [: i: }+ d, O ! U7 E" H r% R! i8 d3 \- X0 Q %end; b( I3 H" u/ R
, v3 X1 D+ x0 L. H {& g: G& A5 V run;%end; . D: S" G7 A6 L - D8 R$ z% h* J. [
data _null_;*样本个数; . c8 W8 P2 }- [" u 6 n q! Q. a9 h/ i, p1 I+ T
set top_1 end=last;1 O; ^. B. s7 k5 {8 j4 q" S
9 L3 G8 G2 B0 s* X4 `5 D' e9 c
if last then call symput('obj_num',compress(_n_)); 8 L& w4 W; A8 W# f7 L" R6 f 4 [( o W/ z2 ^0 O %let sqr_str=; 0 Q5 ?: r0 H" u 4 `/ ]# b' q$ D' x7 _
data top_a; *求各指标值的平方;! Y* h) R0 u9 l. k1 m% z
8 j: t: s2 `0 z4 E E5 `$ _( [ set top_1 end=last;& i5 ]7 }+ U4 G+ m1 l! e
]6 l$ Q0 A8 f %do i=1 %to &var_num;4 G: k. ~/ m# ]8 ]2 R
# s& U6 q9 v4 F2 W% R
&&var&i.._2=&&var&i ** 2;0 h, b; p8 J8 k: B: K* L
+ n0 F1 ^9 @4 q+ E3 t1 j6 Y0 ?" I
%let sqr_str=&sqr_str &&var&i.._2;%end; 7 w N! Y4 E! W/ ^5 X& K 1 S4 w+ G( j9 H5 p- D( G3 D
proc transpose data=top_a(keep=&sqr_str)prefix=top_m out=top_b; *对平方值矩阵转置;+ d3 }* N1 |7 o4 D' o& Y
* \/ E# k H) d( @3 o, j! ?
proc transpose data=top_a(keep=&var_name)prefix=top_n out=top_C; *对原始数据矩阵转置;( y, y1 P5 c( w' b# @# T6 ]
9 x/ w! r" Y* K proc transpose data=top_2(keep=&var_name)prefix=top_w out=top_w; *对权重数据矩阵转置;( V0 ?8 v: U" I
( D$ U1 r/ n- J7 I data top_d; *求各指标值的平方和; w( U7 d, b( _! j* z
+ t/ Y1 }) z7 D, T set top_b; ! }; C- G/ u% W( v# c 8 U* B& M) f- c& U" Q, G T
z=sum(of top_m1-top_m&obj_num); & b9 l% ]7 d$ i* J 1 f F2 L+ S( M %let min_str=;%let max_str=;2 M0 h5 \5 c+ h1 @% v: |7 l6 y
2 n4 t4 G3 l8 G5 ~" Z5 f data top_e; , ?9 f' f6 l0 z: \1 h/ l4 A2 { + _9 d" b2 K T2 w! d0 P+ C0 M
merge top_c top_d top_w; 3 b3 V" B5 f/ e
% h, a" N* T8 v" Z- R. w. z O: M
%do i=1 %to &obj_num; *求归一化矩阵的转置矩阵; ! T+ A3 P+ N5 {) F* j ( F9 p" q* g0 d! g6 K z&i=top_n&i/sqrt(z);%end;5 U! y" O9 ~7 H; A0 r
7 T; V/ V" ]5 D+ c2 k. |
max=max(of z1-z&obj_num); *求最优方案和最劣方案;! u; L6 j( A) P. i$ z2 ` ~. R- C" {
3 i% [. O% g( Z! e" K( T9 D
min=min(of z1-z&obj_num); 8 z: i$ h2 V& A8 t5 p3 N8 r6 z! h* T 9 W! B0 _0 o5 _# O ?1 a %do i=1 %to &obj_num; , C2 X+ m+ @8 `8 v, o5 B ! ]: R2 r% J' d/ A T7 W& Y7 f3 s d_max&i=top_w1*(z&i-max)**2;" I- F' T: K, V% q2 ]' v& L+ j
2 q" c; ?, f0 R/ ?4 ~
d_min&i=top_w1*(z&i-min)**2; ' d8 y1 b; q( ], n/ b2 w2 g F . K8 m/ i! }) f% G" S# M
%let max_str=&max_str d_max&i; ' {% H6 l ^, n G! `: i ' J$ h" A& J' _( v/ K& P %let min_str=&min_str d_min&i;%end; ' o% |7 Y9 `: s8 @8 }1 S . S5 `0 }$ j9 C }6 L& A+ t proc transpose data=top_e(keep=&max_str) prefix=max out=top_f;+ z8 L' Y, \4 x1 w& G2 q
0 O7 m4 z, A. l- ^
proc transpose data=top_e(keep=&min_str) prefix=min out=top_g;*求各评价对象与最优方案的相对接近程度C,并排序; / H, X5 D z8 _ & w/ w5 n0 g: }' D" Z
data top_h(keep=&var_keep d_max d_min c);) ~: Q; h; ^& Z5 w8 L
" }9 R0 G ~3 S" c5 Y7 J. N
merge top_1 top_f top_g ; 1 F5 T2 B7 ]/ F1 W " u8 q h" a1 @8 B max_sum=sum(of max1-max&var_num);2 h9 U3 y5 {# [ S
+ G: p( n9 x# ~5 L0 T min_sum=sum(of min1-min&var_num); . t5 A* @! w* u0 |% i/ l. N n ) r j: w% |3 t$ l6 r d_max=sqrt(max_sum); . r- V- ?3 i$ V. | 7 X) A4 Z! M7 W ]; L, X/ o, d
d_min=sqrt(min_sum); / e( R+ ]8 T* }0 p* g/ Q0 R Y5 t9 L/ ?+ l B5 I) K
C=d_min/(d_max+d_min);/ G9 }7 }9 ]7 i3 s# T' p" L