Topsis法是technique for order preference by similarity to ideal solution的缩写,意为与理想方案相似性的顺序选优技术,是系统工程中有限方案多目标决策分析的一种常用方法,可用于效益评价、卫生决策和卫生事业管理等多个领域[1]。此方法对样本量、指标多少及数据的分布无特殊要求和限制,灵活、方便、实用。但目前几种常用的统计软件包并没有提供现成的计算机程序,而现有已发表的关于Topsis法的SAS程序在应用于不同数据时,需要做较多修改,并且不能进行加权Topsis法的运算。本研究就Topsis法综合分析的SAS程序做了进一步的改进,使之更简单实用,以满足实际工作的需要。( R7 i d+ R1 ]! c ?, l7 u4 h
9 ~/ {0 k, f- h 1 原理与方法 ; `! c4 f) T8 {. M$ T' T B E5 g8 m6 C! P- A
基于归一化后的原始数据矩阵,找出有限方案中的最优方案和最劣方案构成一个空间:待评价的某方案可视为该空间上的一个点,据此可获得该点与最优方案和最劣方案问的距离(常用欧氏距离(Euclidean distance)),从而得出该方案与最优方案的相对接近程度,借此可进行方案优劣的评价[1]。其原理和方法如下: + m7 y2 b1 l. F7 Z3 P+ n 1 w/ X( o' Y6 H9 `# L/ T( O) [ ① 同趋势化:通常采用低优指标转换为高优指标的方式,可采用倒数法和差值法。 - v0 @* q9 x& C( s 6 T t# C; F( K8 w6 Z8 a ② 无量纲化:为了消除计量单位的影响,需要做归一化处理。设(xij)n×m为同趋化后的指标矩阵,aij=xij/ ?ni=1 x2ij,j=1,2,…,m,建立则归一化矩阵(aij)n×m。 / u5 D3 E7 M7 Z" B2 D6 y! A- R0 E " C1 k" L1 ?8 J6 Y5 D" S- Z
③ 求有限方案中的最优方案A+和最劣方案A- 。最优方案为:A+=(ai1+ ,ai2+ ,… ,aim+),最劣方案为:A-=(ai1- ,ai2- ,… ,aim-)。 1 d4 z& b& D' h 2 j4 @7 B4 k( S3 D
④ 分别计算诸评价对象各指标值与最优方案及最劣方案的距离,通常采用欧氏距离。" G+ h. y$ G* F1 k& t
' O% v% D1 r3 U Q2 k0 t
D+i=?mj=1(aij-a+ij)2, D-i=?mj=1(aij-a-ij)2 6 ~6 x& {* K. i9 k& W4 ] ; C' T. k' K3 b k ⑤ 计算诸评价对象与最优方案的相对接近程度Ci。 % p& Y. a: P1 m0 d : H7 i7 x) J" ?. u8 \9 n# A
Ci=D-i / (D-i+D+i)* p4 x% Z3 V+ X. y9 G, U
" q7 X; N; f" Z b
2 实例分析与SAS宏程序 ' q# a8 O' a& ]6 ^9 r+ d9 K' p % w# n: Q' ^9 K6 j+ y% P4 ? 以中文版SF-36为健康调查问卷,于2004年7月~2004年12月间对≥60岁老年人(602人)进行老年人生存质量(QOL)的研究,问卷包含8个领域的指标,分别为x1(生理机能)、x2(生理职能)、x3(躯体疼痛)、x4(一般健康状况)、x5(精力)、x6(社会功能)、x7(情感职能)、x8(精神健康)[2]。得到数据如下: 7 _2 t# a# \ F2 B2 X& K, n/ | # U/ u" p2 J1 i- |( k/ W6 N 表1 7个地区老年人QOL各领域平均分(略)0 I* r4 l3 x4 |4 A" E; w
, M# n' O" z! M7 R# H
以下是宏程序:: T2 z% X# w5 K1 Z
3 _ v, B) _' u6 s0 V, E: ~9 u1 S %macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); 7 |3 J! d1 H i " H4 |1 Q+ T4 J/ L/ O0 w, ? %let i=1; ' @* A2 ^9 l" D9 H7 X 5 }" _5 x! ` h2 t+ I
%let var&i=%scan(&var_name,&i,' ');" r+ x# t* z; L( `
* R% Z2 R; Q$ {+ \
%do %until (&&var&i=); - d2 J( s, W7 S 9 K7 ] @9 @* K# i' u %let i=%eval(&i+1); 7 u6 \' s. V' ]$ R1 ]( K1 ?( P. d 7 y7 j }+ g4 U1 l' P %let var&i=%scan(&var_name,&i,' '); 0 ?( B( E' T1 |- H 7 J8 }# o* l; r, r %end;$ G/ x+ Y, j+ } Q2 s6 t
( `8 Q) C0 z' ~4 @ Z
%let var_num=%eval(&i-1); *自变量个数;- A B) P% I* ]! V/ C
: W. m7 j8 B1 ~* ^ *top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行;6 a" v- H' z+ s6 ?( P
, V# P" m% {/ D# Z$ g$ _
%if &weight=1 %then %do; : q' ~% o& T2 ]. I" z( q, R , ]- o7 R& ]+ t: O6 Y8 Y6 E2 j data top_1 top_2;( E: o2 f/ b9 d$ P
2 ?1 `0 l! x+ e4 c' u$ F set &data_name end=last;/ W2 T# J- {$ x D& N# M, i& i
' N7 F. m5 m" `0 N/ w6 W
if last then output top_2; ) T4 O- g, g4 _1 C* T3 T: R: ` ) a; [3 X( Z0 u4 u! T9 y
else output top_1;0 R+ i2 L9 m9 j, s
8 [1 t& R, C& A, G: c9 u# ]7 p run;%end;0 Q' y* I2 h4 K) E2 ?1 j- B
! W$ A9 l; p, C, z
%else %do;& ?* ?9 }( ?9 a, h
) Z) t; z/ W( S& U+ y6 p6 X data top_1;9 I( g6 _* T2 I M
! H3 _; y$ x) t g8 }) \+ Y( y; U
set &data_name;6 [( ^" J' N. g4 n
# V5 i9 P) o+ J! O, b2 Y% m+ o data top_2;# V$ l. c9 A+ _7 t
$ g H- m/ J( G- N& T9 E
%do i=1 %to &var_num; / @' q6 }% ^ k" G8 J% N; Y 9 e& k- B, H# G7 n6 ~4 p& q &&var&i=1; 0 c* o5 }+ `+ t6 Z( D% L; l # w8 c& [7 t& }, W5 _2 H5 C
%end; 5 C5 Z6 L* e) `! K! L9 y# j1 R ; j% _5 }3 B+ A+ e" M, E, T; f run;%end;8 h. W5 `# U$ c
; }" t5 Z( Y) l! C
data _null_;*样本个数;, s/ {7 [& Q+ ^8 x# j
/ u0 {$ d7 u/ f
set top_1 end=last;: L% G8 Q) |1 p. T* Y. I
. t8 V; }# _! U, p& G
if last then call symput('obj_num',compress(_n_));; w: W1 i1 B) L: r: Q: p
P- B. O$ S% j& M5 k4 I8 w `/ e( Z: K %let sqr_str=;7 K" D( f9 `5 r- c- e
' g7 w0 c, j3 d# M# O& f
data top_a; *求各指标值的平方;: p8 K6 ^7 V4 F% Y: l/ M
V2 h) X5 C3 L+ }% L$ [1 q1 g set top_1 end=last; & @& n8 {2 `" k+ s! q1 Y 2 D6 {9 T6 e, M! M7 b
%do i=1 %to &var_num; " T: G2 ]( j* h7 k( S# J ( V3 L9 b' E% X8 }0 }( B% w s &&var&i.._2=&&var&i ** 2; 1 @$ |" w& u; _+ m 9 \) T3 W7 L! G/ z3 p1 {6 o3 J. n. ~ %let sqr_str=&sqr_str &&var&i.._2;%end;8 s* f( r5 d" \1 [' L: h1 f$ d
! n c" Y3 J; l5 t" J6 L# E6 I proc transpose data=top_2(keep=&var_name)prefix=top_w out=top_w; *对权重数据矩阵转置;5 b: p. b0 q/ x& L5 z
; X+ y) \& R4 v* c4 `2 J
data top_d; *求各指标值的平方和;" r+ H# ]0 L( y, Y
" t$ p+ N1 d5 P; ~4 o$ u
set top_b;' \; d; R- i) b6 s
( G# V8 u4 [ k) C- F z=sum(of top_m1-top_m&obj_num);5 h) W- l' g, L/ C$ O4 U* i& o7 d
2 S5 D" W; z9 D, `1 G8 ?2 v %let min_str=;%let max_str=;3 a# e5 }+ q0 Q8 j
# P/ E' R( O. \7 o, n% a1 y+ e
data top_e;1 c' q: ^! B0 Y/ C) Y
5 [/ q1 V% `' `" l
merge top_c top_d top_w; 6 w/ r+ P' A. M6 ^+ H! e 0 {) }/ x% f: c; r- I) n
%do i=1 %to &obj_num; *求归一化矩阵的转置矩阵; 2 t6 B' k& I( S( v) }' U - ?6 i7 E: a$ [ z&i=top_n&i/sqrt(z);%end;8 z4 }, u7 h! p9 \4 a9 n
1 `- u. p$ K {/ K: V! {3 y
max=max(of z1-z&obj_num); *求最优方案和最劣方案;# J$ k L' w4 @' k. U