Topsis法是technique for order preference by similarity to ideal solution的缩写,意为与理想方案相似性的顺序选优技术,是系统工程中有限方案多目标决策分析的一种常用方法,可用于效益评价、卫生决策和卫生事业管理等多个领域[1]。此方法对样本量、指标多少及数据的分布无特殊要求和限制,灵活、方便、实用。但目前几种常用的统计软件包并没有提供现成的计算机程序,而现有已发表的关于Topsis法的SAS程序在应用于不同数据时,需要做较多修改,并且不能进行加权Topsis法的运算。本研究就Topsis法综合分析的SAS程序做了进一步的改进,使之更简单实用,以满足实际工作的需要。7 ]# P' `/ h$ @6 Y1 v) e( m
2 \* o" P* | |6 J 1 原理与方法 # }& @: y4 Y. @) h/ D$ J2 w% Z 3 o* D9 A: Q7 Y' v 基于归一化后的原始数据矩阵,找出有限方案中的最优方案和最劣方案构成一个空间:待评价的某方案可视为该空间上的一个点,据此可获得该点与最优方案和最劣方案问的距离(常用欧氏距离(Euclidean distance)),从而得出该方案与最优方案的相对接近程度,借此可进行方案优劣的评价[1]。其原理和方法如下:# ?& J6 ^- C, ? P+ m; C
1 W5 v- q8 r x, s# z% j2 I2 } ① 同趋势化:通常采用低优指标转换为高优指标的方式,可采用倒数法和差值法。 + @' n; [! P# A 5 \. e- S8 Q( i ? ② 无量纲化:为了消除计量单位的影响,需要做归一化处理。设(xij)n×m为同趋化后的指标矩阵,aij=xij/ ?ni=1 x2ij,j=1,2,…,m,建立则归一化矩阵(aij)n×m。 . o' ?! f, a& F6 s' ^+ x, V 1 q$ J3 |% i. W; U, g2 \: I( z ③ 求有限方案中的最优方案A+和最劣方案A- 。最优方案为:A+=(ai1+ ,ai2+ ,… ,aim+),最劣方案为:A-=(ai1- ,ai2- ,… ,aim-)。+ C+ |$ x8 B2 s6 k/ P2 r/ b$ s
0 i; m8 N" o1 t: I, z ④ 分别计算诸评价对象各指标值与最优方案及最劣方案的距离,通常采用欧氏距离。4 [! |8 V8 h: ~2 g' r8 N
$ ~6 a) ?! T+ U- V, g2 \& @; Z H
D+i=?mj=1(aij-a+ij)2, D-i=?mj=1(aij-a-ij)2, T8 @' o- o2 |0 c! e
2 x- ^) G7 X9 s J& n: M
⑤ 计算诸评价对象与最优方案的相对接近程度Ci。 + C2 W2 r; r0 E4 E, I# }7 K & ^0 e* L2 G7 s3 w, |0 Z1 H Ci=D-i / (D-i+D+i) " N: W8 N/ V0 ~- L6 n4 g ( M% _# Q9 D- r0 l- Z4 }: J 2 实例分析与SAS宏程序 ) O- o: p% @3 y: d9 p j ( a4 V" `8 _0 v# `1 O, \3 X 以中文版SF-36为健康调查问卷,于2004年7月~2004年12月间对≥60岁老年人(602人)进行老年人生存质量(QOL)的研究,问卷包含8个领域的指标,分别为x1(生理机能)、x2(生理职能)、x3(躯体疼痛)、x4(一般健康状况)、x5(精力)、x6(社会功能)、x7(情感职能)、x8(精神健康)[2]。得到数据如下:2 y- V. [# g, i4 w) ` \5 P0 X
1 F u9 e# F9 v; t- V9 v 以下是宏程序: ) T6 S. r/ Y3 E6 D* ~5 G7 W ! M; w$ D, z8 D$ u/ z% D1 t %macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); 5 o% a R/ ]+ z+ B) n: b2 y2 s, k 1 G4 e2 _# S7 J; k5 Y %let i=1; : k' t7 ~+ X+ O
# y2 Y6 S7 O6 s, r2 ^ N %let var&i=%scan(&var_name,&i,' ');) r( x* L4 P" k) Z" Y2 V* v( u
3 _, Z3 b8 s0 a( I: {0 n8 E# z1 B
%do %until (&&var&i=); # H3 _5 |% G2 z8 C! k2 b& @
/ b; u* c& x |0 w: P' b
%let i=%eval(&i+1);1 l/ T' Y" `& {1 d$ m4 `' \ R
1 x) P Z# e: k5 F) G8 x
%let var&i=%scan(&var_name,&i,' ');; ?3 _1 x9 b! u! e& a$ b% V
' r( \1 P, Q5 x# e
%end;0 l! y8 e: X& E7 l% m$ u4 p. z
3 Z5 m! N' ?, [6 l; P
%let var_num=%eval(&i-1); *自变量个数; " W/ t5 @7 F7 @4 G; e3 S3 V h + V% F3 ^4 k( C0 o; { *top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行;+ ]0 y/ f7 p" x7 \
2 a9 F* Z% P& G0 R. }
%if &weight=1 %then %do;, G: x, Y; E8 u9 y: ?% |6 }. a
6 ^2 f! T. k7 m/ i7 F& [! B: M3 C
data top_1 top_2; 2 S" t4 G. _. y+ B1 m& m/ z & ~- s A* B# b6 [7 C% P& F/ Z1 e
set &data_name end=last;+ x- I2 c# N' K9 Y
4 p2 q% d2 `7 \5 g8 O if last then output top_2; 8 `6 p9 E' z1 i# k 1 ?4 v) T6 p8 q _ else output top_1; * A! N# G7 a1 N, Z $ @) p4 P% C g9 F. d
run;%end; ' E6 p' J f+ I, `1 w) `5 e7 G " V; ~: r* d# B8 J
%else %do;7 v. t, J" d' |
: U1 z3 P1 o& g- D9 H8 c7 X8 o
data top_1;" C j% z+ E% O) q) ]- ?* F
" G7 d! c" {+ W2 P3 g8 h set &data_name;( N9 t/ k7 L5 w: O& D, l# {
6 m, ~. s. j6 H5 i0 p/ D$ ~ data top_2;( y- [: p/ c6 g
' U3 V2 B4 m; [" s
%do i=1 %to &var_num;9 A1 W& \1 t* c
5 [# g, A+ j" d &&var&i=1;& s) v U5 t8 Z; u3 o
! |8 Q5 g3 s7 Y, y. m6 L3 D0 v
%end; ' a$ v H% H$ J) j * H9 \/ @1 o) Z6 c
run;%end;7 v( N2 ]7 w+ Z5 M; c+ q
$ b7 G& \5 Z' X; U8 v# B0 z data _null_;*样本个数; " V7 R: O* o# Y. R M" q 4 s6 o( q o h9 u set top_1 end=last;! |3 }; X9 S7 h8 b) V
0 a- y1 L7 W, U# | if last then call symput('obj_num',compress(_n_)); ! ] n) ^" C0 W r- i2 S: G $ A9 ~9 F5 d* |% o! V, q8 V; Q; m %let sqr_str=; _5 \4 ]1 f! t% Y' o4 @, g7 }$ ^ $ G. R1 c4 _, x: t data top_a; *求各指标值的平方;- \; s- U7 M5 i( Z
1 L' Z ]. K3 Q, E" h2 c. G( D# }
set top_1 end=last;; \. D& f1 b% a x5 Q
& k/ J& p' }6 J( {, `; H
%do i=1 %to &var_num;, k; U: |1 I9 r/ g0 c0 E5 p/ ? x
. f$ S) w. N: \/ ^5 K &&var&i.._2=&&var&i ** 2;2 b" N5 `1 M' w& D' M
# a. S% j* z: _0 B" ] S %let sqr_str=&sqr_str &&var&i.._2;%end; 9 T! g5 }; B. |! ? $ d& o2 p& A5 O% }9 z( o proc transpose data=top_a(keep=&sqr_str)prefix=top_m out=top_b; *对平方值矩阵转置; 2 `& v4 r+ q8 h' x: ?* q9 X- q$ m 6 i: y: r# y5 |* A
proc transpose data=top_a(keep=&var_name)prefix=top_n out=top_C; *对原始数据矩阵转置;* y5 }! K- d) O5 h& f1 o
, _$ ^6 b/ S% {# j, N6 q- L+ M
proc transpose data=top_2(keep=&var_name)prefix=top_w out=top_w; *对权重数据矩阵转置;& S- h5 _0 A* c: c# _8 [5 z
0 Z4 `" U& b- }3 ^# Y" E" W& o data top_d; *求各指标值的平方和; # e$ t- A- z1 @, \# M + ?; e6 B8 D1 ?% w# G+ o3 A; x set top_b;7 R" I0 d4 v5 p" z: ]3 x
1 z2 R/ F6 L: X$ M1 O z=sum(of top_m1-top_m&obj_num);5 o7 t% }# o2 z$ O
o! f% M. B$ ~- M& [& p2 q6 y7 G %let min_str=;%let max_str=;0 k2 h$ y; f' P9 ]
3 |% |% D8 ?! }- u data top_e;- |2 T) \4 r. u4 j! ]
- b6 p. l1 Z9 |% k merge top_c top_d top_w; / _, v! ]% ]. `3 W6 C5 D & V( T+ p2 i5 l& |0 L %do i=1 %to &obj_num; *求归一化矩阵的转置矩阵; 4 j# K9 u' Y& E% S7 ~( o 1 i4 g* k) j) l+ h9 J9 n/ F, q
z&i=top_n&i/sqrt(z);%end; |3 @8 u2 P( D( q" Q " n5 o4 u1 X; Y" Z; z7 ~) d max=max(of z1-z&obj_num); *求最优方案和最劣方案; ! I/ b; ^ {: B% A5 E# l3 S, {; d! P/ Y + {' H2 s! K* ] min=min(of z1-z&obj_num);/ z1 o7 x1 W' V0 D
: W) ]( D) S" x. d5 {/ W- l9 U
%do i=1 %to &obj_num;: W4 y, y/ @* ?$ ? r
+ C' W( p+ U3 c
d_max&i=top_w1*(z&i-max)**2; / X& j' i }: Q6 I( x. ^# v % u. H, h( z2 O S3 G& D9 |2 d& @ d_min&i=top_w1*(z&i-min)**2; % e& b2 J! A+ g$ k) \9 D , q6 u4 {# v: g
%let max_str=&max_str d_max&i; ' S1 P+ Y* h0 I4 a 8 O+ ? ?5 m4 A$ Z
%let min_str=&min_str d_min&i;%end;6 X* P/ i3 B/ g3 c, E
" h2 L U. D- X" x( b: H9 b
proc transpose data=top_e(keep=&max_str) prefix=max out=top_f; / S% H' c _" y' k 9 @$ P; w, g' O& U- @0 ~' \0 A# Q
proc transpose data=top_e(keep=&min_str) prefix=min out=top_g;*求各评价对象与最优方案的相对接近程度C,并排序; % c* k3 f6 P3 t5 N7 i3 @0 Y . Y" P( ?& }8 S2 i
data top_h(keep=&var_keep d_max d_min c); ! [4 q0 v; ]. _; P # G" L# ^. r3 e merge top_1 top_f top_g ; ; b- {5 g# A4 L) s5 Z6 b + X. ?% a' M7 ~1 {* ]
max_sum=sum(of max1-max&var_num);5 b$ G" D$ x8 b
8 K; k! x6 X- j4 V7 D9 I5 P min_sum=sum(of min1-min&var_num);- z' c0 q- B; x; g0 b