Topsis法是technique for order preference by similarity to ideal solution的缩写,意为与理想方案相似性的顺序选优技术,是系统工程中有限方案多目标决策分析的一种常用方法,可用于效益评价、卫生决策和卫生事业管理等多个领域[1]。此方法对样本量、指标多少及数据的分布无特殊要求和限制,灵活、方便、实用。但目前几种常用的统计软件包并没有提供现成的计算机程序,而现有已发表的关于Topsis法的SAS程序在应用于不同数据时,需要做较多修改,并且不能进行加权Topsis法的运算。本研究就Topsis法综合分析的SAS程序做了进一步的改进,使之更简单实用,以满足实际工作的需要。! g T6 F& c% `( m8 p& j% b& n' ?, P
# ?& _8 R. h- \4 J9 D6 q2 t6 b 1 原理与方法4 D& q! P7 U" H9 N7 ^
! g$ Y; x" W# h1 w 基于归一化后的原始数据矩阵,找出有限方案中的最优方案和最劣方案构成一个空间:待评价的某方案可视为该空间上的一个点,据此可获得该点与最优方案和最劣方案问的距离(常用欧氏距离(Euclidean distance)),从而得出该方案与最优方案的相对接近程度,借此可进行方案优劣的评价[1]。其原理和方法如下:" |# H+ d6 C P5 L8 m
1 R3 E9 l' Z" ^% H: y8 |* `2 y, o, u ① 同趋势化:通常采用低优指标转换为高优指标的方式,可采用倒数法和差值法。 5 w( Z- C" ~( v! }0 P& c # }% x4 v' n% S( u- O8 j' ]
② 无量纲化:为了消除计量单位的影响,需要做归一化处理。设(xij)n×m为同趋化后的指标矩阵,aij=xij/ ?ni=1 x2ij,j=1,2,…,m,建立则归一化矩阵(aij)n×m。 U) y* P* L" [) F' Z
* P( Z: z% C. f- I) Q ③ 求有限方案中的最优方案A+和最劣方案A- 。最优方案为:A+=(ai1+ ,ai2+ ,… ,aim+),最劣方案为:A-=(ai1- ,ai2- ,… ,aim-)。 : A( \* w0 ?* l1 f- V& T & V, P5 w# u# }" ]. V
④ 分别计算诸评价对象各指标值与最优方案及最劣方案的距离,通常采用欧氏距离。 : v* s4 R5 _7 u" M: L! l. I 4 F- F# s* n1 q! k0 A* i7 D1 s
D+i=?mj=1(aij-a+ij)2, D-i=?mj=1(aij-a-ij)2 U0 F0 l; J" w
% X: ]/ I! V" t4 K. j
⑤ 计算诸评价对象与最优方案的相对接近程度Ci。 0 u( ~2 k+ T I0 \/ d# o 8 [: Q' r. ^3 k/ N8 G: ?) o Ci=D-i / (D-i+D+i) . @0 y6 E0 o- ]* R" V- Y' n, y0 z3 e" y
2 实例分析与SAS宏程序 % J$ Q- H" u) l/ L( h5 ^ : h% |. ~( e& X
以中文版SF-36为健康调查问卷,于2004年7月~2004年12月间对≥60岁老年人(602人)进行老年人生存质量(QOL)的研究,问卷包含8个领域的指标,分别为x1(生理机能)、x2(生理职能)、x3(躯体疼痛)、x4(一般健康状况)、x5(精力)、x6(社会功能)、x7(情感职能)、x8(精神健康)[2]。得到数据如下:, o$ N, ~* w1 Y
2 G2 q" E- I% L+ h- \9 x3 A 表1 7个地区老年人QOL各领域平均分(略) $ c2 r }0 x/ I3 G+ l 3 i7 o$ Y6 M0 @/ b( Q' }* Y7 ]1 L 以下是宏程序: & u9 I0 Y: ~! e 0 H) @6 I) [ g0 x %macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); / B) q% p+ e0 t6 E ! v7 Q. e: k" @) } %let i=1; 4 q4 E+ O5 x# h6 E 9 K# ~1 e* [6 h2 L9 }) p %let var&i=%scan(&var_name,&i,' ');1 I' {) A [/ f7 V' y* w) ]& P! b. r
9 ~2 {5 U! k0 d' K( l
%do %until (&&var&i=); $ v$ O+ b3 c; ?* E( \6 z ' g; n8 ^8 `5 [: y* t* _ %let i=%eval(&i+1); ; }0 w1 g* q( G: H0 C 5 v8 _& j, K/ {0 K %let var&i=%scan(&var_name,&i,' '); - k3 M1 A% Q4 y) S* ]: H 8 S/ S/ X+ \9 K: L; z& k" m0 Z %end;- s) W( S% G. {; T! ?# t
3 t$ ?7 E5 \' E
%let var_num=%eval(&i-1); *自变量个数; 1 `. e& c* t; E! K: _& K % _5 Y4 W% g* }3 S% X( A5 B
*top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行; ! e% ]# c9 z& s O 5 `+ a1 _5 Z2 |0 ] %if &weight=1 %then %do;( e) M) x( |8 H, ]& z
1 f; Y9 K6 ~( L9 l& I+ f
data top_1 top_2; " o2 q$ _5 m& y% H, H/ }. G - t/ K3 @4 u" k) r ]- X1 p
set &data_name end=last;/ W! ^+ n. h" [. w
$ I9 t+ X" z/ B" ?! T. X7 E6 l if last then output top_2; $ j# q3 ~) o) c6 L" }" { A ' K- Q) N# J( e S1 k9 |" o, [ else output top_1;3 v5 d; q- v0 l( K2 ~& j: x) w$ A2 p
3 O, E# K* N8 { run;%end; 1 e) q8 V: ?& O' \: Q0 N2 a - B* @; B" e) a" y+ F %else %do; , s0 F3 X9 [ t1 ^# _1 x 3 ]# a# F% m, O
data top_1; ) A. T- M& K7 y) C . I8 o3 O) R2 C% E set &data_name;4 h7 d9 b* H* t, B1 W' M- S X
- k3 g% H- f6 ~. \) p$ o data top_2; , Y+ A$ K; B5 D5 I/ u3 v$ N 2 r+ M h/ o! b$ F6 \, t; T6 G
%do i=1 %to &var_num;2 x; _& m/ }5 N* h' w2 Z# D
5 Q: a$ l7 ^4 k& f/ D6 _9 w5 p &&var&i=1; 7 G1 w; }/ ]! H0 x6 E3 W 5 g0 S$ @/ S' @# c %end; , t n/ P K) F9 T2 @! \ & u" x. U- ^- t+ `
run;%end;( k* s8 ~* @9 x( i0 C
8 i/ _% x0 e* I2 C data _null_;*样本个数;$ s! E2 S: L) W) R
# |. A4 [- t# K: D* C( R& `; u set top_1 end=last; ) s V1 G# E" Y5 `3 X: f( j1 l, p % [# }$ U: `! n4 N5 y8 [4 x if last then call symput('obj_num',compress(_n_));" p9 R' Q( A$ I2 ~) ~
! w/ L" `8 k3 q: V4 o% {- T %let sqr_str=;2 t* M" l3 M: z$ ]0 a1 p! ]
" q. U# O, y+ M$ J& K" d7 Q W
data top_a; *求各指标值的平方;9 j! t! S2 Y3 y+ K
# @! Z" i) K% ?. v) A, p8 K, E, | set top_1 end=last; 0 M# p& A) ?4 }5 [/ B9 L- e 9 v( x% l7 x8 `! Y0 D& Y
%do i=1 %to &var_num; C+ K% B! U# Q! y8 v " X8 R! a$ U# B$ l
&&var&i.._2=&&var&i ** 2; ) S- o+ t, |0 n) I _" s, [8 Z 7 F B! ~6 q$ j% e
%let sqr_str=&sqr_str &&var&i.._2;%end;& S, F$ X* Y' j4 `
0 d0 ~4 A2 |/ d" t+ Z2 e4 J0 D proc transpose data=top_a(keep=&sqr_str)prefix=top_m out=top_b; *对平方值矩阵转置; 6 l( K( m' w2 {4 [ + Q( b9 z$ \7 L n proc transpose data=top_a(keep=&var_name)prefix=top_n out=top_C; *对原始数据矩阵转置;( C% W$ y: b/ c* J" Q1 }& x4 m9 w
/ h& T, z$ j4 A, y) `" z/ k& s. N0 [
proc transpose data=top_2(keep=&var_name)prefix=top_w out=top_w; *对权重数据矩阵转置; 2 d2 m( w: y- G& I5 [) P* A; C ) R2 v1 d1 F* s; u. t
data top_d; *求各指标值的平方和;& y8 X- x; r8 v1 l+ r {
5 G9 n7 A, o1 S set top_b;+ t. a5 M& P2 `6 G8 X9 R9 V) V
1 }0 H$ e. o+ G z=sum(of top_m1-top_m&obj_num);( `5 L" W% N1 M$ t, p" L, r) H T
' K, f# ?; P7 ?5 ~" K. g; x
%let min_str=;%let max_str=; 7 q$ J% L4 a5 I3 o# ? + i1 q( a7 a. v' y9 N data top_e; + c k* g, M. V1 U1 H4 @0 { + I2 @4 N, \" {1 Y; u merge top_c top_d top_w; " s" v0 U% `" m' } ( ]* }, j0 Y2 }3 Y u. x" h: w! I
%do i=1 %to &obj_num; *求归一化矩阵的转置矩阵; " z; J2 [8 K$ ?( M + q1 R% y% L+ C# u: ~; h9 j) A
z&i=top_n&i/sqrt(z);%end; 0 I) t8 B& D& \1 m4 ] & `4 \! `* s- v/ I" k# r) y max=max(of z1-z&obj_num); *求最优方案和最劣方案;9 ^- ]4 y. b0 M
; W) X9 b. |8 a4 t6 ^' n' P( o9 K
min=min(of z1-z&obj_num);4 H ]" l1 Z" r' L4 z# n2 d: e5 b