Topsis法是technique for order preference by similarity to ideal solution的缩写,意为与理想方案相似性的顺序选优技术,是系统工程中有限方案多目标决策分析的一种常用方法,可用于效益评价、卫生决策和卫生事业管理等多个领域[1]。此方法对样本量、指标多少及数据的分布无特殊要求和限制,灵活、方便、实用。但目前几种常用的统计软件包并没有提供现成的计算机程序,而现有已发表的关于Topsis法的SAS程序在应用于不同数据时,需要做较多修改,并且不能进行加权Topsis法的运算。本研究就Topsis法综合分析的SAS程序做了进一步的改进,使之更简单实用,以满足实际工作的需要。 , S+ G) f( \& Z! a" R, e; w6 q1 D0 l+ @2 G# J: u
1 原理与方法 # z3 {0 p4 t* Q* J 9 n2 p W$ z( G$ c! G 基于归一化后的原始数据矩阵,找出有限方案中的最优方案和最劣方案构成一个空间:待评价的某方案可视为该空间上的一个点,据此可获得该点与最优方案和最劣方案问的距离(常用欧氏距离(Euclidean distance)),从而得出该方案与最优方案的相对接近程度,借此可进行方案优劣的评价[1]。其原理和方法如下: 3 k X2 q* p7 V# ]* p/ k! t 9 G! y' K4 W/ }5 Q+ ]4 Z# a$ K
① 同趋势化:通常采用低优指标转换为高优指标的方式,可采用倒数法和差值法。% e& U$ u) s" n. q. J0 }
5 L' h2 o( d- Q7 } ② 无量纲化:为了消除计量单位的影响,需要做归一化处理。设(xij)n×m为同趋化后的指标矩阵,aij=xij/ ?ni=1 x2ij,j=1,2,…,m,建立则归一化矩阵(aij)n×m。 & C$ Q5 q, U# L2 K : V4 U" h5 |6 j; O3 S& K
③ 求有限方案中的最优方案A+和最劣方案A- 。最优方案为:A+=(ai1+ ,ai2+ ,… ,aim+),最劣方案为:A-=(ai1- ,ai2- ,… ,aim-)。 6 W6 ?# s1 b) K * a7 S% }" y/ X( g- p) z0 d! ?9 F ④ 分别计算诸评价对象各指标值与最优方案及最劣方案的距离,通常采用欧氏距离。 , V. }+ j; q0 V; y8 _ 4 q4 Y; p) ? n: Y
D+i=?mj=1(aij-a+ij)2, D-i=?mj=1(aij-a-ij)2; _! b' Z& q: T; }
$ O: s8 A2 [& I4 ]
⑤ 计算诸评价对象与最优方案的相对接近程度Ci。/ e: z% f0 s! F5 y
! D( o |: r9 x6 m% L
Ci=D-i / (D-i+D+i)8 n& t% _/ H0 }# J* u5 W
9 r) t+ k4 I4 \* o- E, e
2 实例分析与SAS宏程序 w+ V& f2 y8 \# o; D, ^: @/ W+ L
2 v) S2 X8 q( |1 q/ K% @
以中文版SF-36为健康调查问卷,于2004年7月~2004年12月间对≥60岁老年人(602人)进行老年人生存质量(QOL)的研究,问卷包含8个领域的指标,分别为x1(生理机能)、x2(生理职能)、x3(躯体疼痛)、x4(一般健康状况)、x5(精力)、x6(社会功能)、x7(情感职能)、x8(精神健康)[2]。得到数据如下:0 K X7 e8 z6 y7 K
0 N. G9 h& ^) n, K% r A9 {
表1 7个地区老年人QOL各领域平均分(略); H9 j) o, \' Q/ i) t7 C
. F6 F. o. X* f. |1 z4 a 以下是宏程序:5 i h; B. Z4 R& a& S: }4 `
( _3 C. z; a1 s% P7 t %macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); % m) R# y' g& \ - s5 U6 F2 I' I5 b
%let i=1; % W) ?0 y; B5 Q2 Q- A 3 _, l1 g% d" k- y l+ W+ v" J %let var&i=%scan(&var_name,&i,' '); V4 k) O; z5 w; T/ c
, o1 m0 ?7 ]+ A* o- i) B# I %do %until (&&var&i=); + y! }, z( H p ! a& i: K3 f+ O, G, f. w %let i=%eval(&i+1);! e. i) g" F( o; ]8 D1 c1 n
! g0 [$ ~4 h! x( K+ a( S %let var&i=%scan(&var_name,&i,' ');1 p4 s/ }' {' ~" h8 w) |5 c; C7 B
# D5 Y& c- }, H- V; u* a3 k
%end;) J3 X M3 T- Q) ^
$ A) o# r4 s8 e" _, N# Q7 i* Q
%let var_num=%eval(&i-1); *自变量个数;* p4 V, k4 ?' r% V
8 F4 L6 F' k* c, U3 ^0 ] *top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行;% V4 P! b3 K I0 g- j; {) y' \/ Y' T4 C
, F+ y' k: c$ O3 S% E
%if &weight=1 %then %do; ' w5 S+ H( n/ x$ T' c/ y& \' p ( X' i& ^$ w: w! t data top_1 top_2;9 z: ^0 m- i7 }3 |; y
% _6 W9 X$ {# ]) |$ h
set &data_name end=last;$ w& O1 Q! d- `
3 @' }: E% Z. T if last then output top_2; % u( G0 z- {: u) }, s6 r* h 4 ~9 _& r# c- w" ^5 A. M
else output top_1;+ q5 S# m+ j) z& D2 x# S- ]0 i, L
& \' D8 o f2 q2 i) h& [ run;%end;& M6 T$ O& j$ l' d# F% g% K0 B
r0 A4 Y i+ Y2 r! X8 k %else %do; 9 I$ _2 l% S: U! }* g 7 ~) A( J$ g+ I& }1 E7 `
data top_1;# I H2 |4 o4 i' f0 b* `2 u" Q
7 e7 |) f. d% e4 a' I set &data_name;. I' e7 w. ^6 N, I8 @
& Y* V3 [- J6 I& C data top_2;! s) V9 s5 Y% `% R7 I2 Q8 D
" L& s* @& M. L: x" m: E9 [" i %do i=1 %to &var_num; & E; O% ]+ |6 y. r- u5 g6 p 4 m% |+ P; v- ]; F+ N/ v8 z
&&var&i=1; ! F; `( o1 Q8 M $ _; c: y+ y; G8 I- d# D# j %end; * E. F1 }. n* }0 j: q$ f( C- R* X+ R 0 ?1 ~0 ^8 w" U7 K8 z: x run;%end;" T ~4 Y9 l* G' M: r) {$ y
" G- ]* [' N6 R: s
data _null_;*样本个数;% Q! [/ Z! n z9 o$ f. `; v
6 R; y4 [: R' a/ ^* s' S
set top_1 end=last;3 A9 o3 N, H/ {6 m6 y7 z
" d0 F! a1 P V; @) o( B8 u/ s
if last then call symput('obj_num',compress(_n_));" {, S' m' W+ I3 ]
: j" V% i: h9 m" |$ D %let sqr_str=; / n' S' W) t) g6 a ! j- L0 J9 L ]+ ^' D
data top_a; *求各指标值的平方;" M) B( F) [7 k4 T" ]5 D9 ~
7 b i7 X' P$ j set top_1 end=last; / H3 t m) \1 ~7 p" b T. X s# e" `: E. K
%do i=1 %to &var_num; 7 M+ U5 @3 k' a( d* w$ V ; y5 g' ?& k+ F2 `! O$ S' b5 \& z &&var&i.._2=&&var&i ** 2;* L" o {/ @4 W4 A/ B7 U. u5 G
+ {* H8 Z! b' Q %let sqr_str=&sqr_str &&var&i.._2;%end;# d) \" e% V e$ G& d: C
/ W3 I( ~. K# ?; \ data top_d; *求各指标值的平方和; - R1 Z. j7 {) D 7 u- v" ~. i0 y6 N; N
set top_b;+ X! v! }5 y$ c6 {& w# ^* c
" K- k3 e f9 T, J( K( K5 L$ l
z=sum(of top_m1-top_m&obj_num); ; J- l. X& g3 P2 G! H0 V , A# ]. H# u& z' p6 O3 l( p %let min_str=;%let max_str=; 8 H- [0 A' {* p. c( S" |' G' W6 ] 6 X# ]% O; E- @- ^
data top_e; ) R+ m( t4 w1 D4 s! W 5 E) h- {+ ]1 E! J, E. ^ merge top_c top_d top_w; . N, ^& Q9 u, v) W+ b% E 2 X4 T% F2 r$ a- \2 w8 f1 v %do i=1 %to &obj_num; *求归一化矩阵的转置矩阵;0 r7 T0 f; ~4 K& Q
' H$ s' x; J( r. O. `( H
z&i=top_n&i/sqrt(z);%end;0 H; K2 A4 S& C
3 j& Q& n+ U3 K0 C$ {( E
max=max(of z1-z&obj_num); *求最优方案和最劣方案;( d& U- `8 S2 B% Z5 x. f6 D
B9 v* f F7 `/ ~$ n
min=min(of z1-z&obj_num); , z3 v7 c) M! I$ X ' z& `6 l2 v4 U7 W# x2 U- w( I
%do i=1 %to &obj_num; # C' ~+ a# p: N9 f$ h# {$ _ , W2 d' T& Y7 ]5 S# j' F d_max&i=top_w1*(z&i-max)**2; - ~* u) P5 F6 U+ P+ u 2 H, x+ m% `' v8 | d_min&i=top_w1*(z&i-min)**2;, i- D0 w9 f: j! y
' h& w( {3 O! | b, R; A
%let max_str=&max_str d_max&i;, |( |) | e, L
/ Z! H( f. g5 Z. L %let min_str=&min_str d_min&i;%end; - j) V2 m- L0 I" L 7 ?. i- b2 s* g- w1 T7 i
proc transpose data=top_e(keep=&max_str) prefix=max out=top_f;; u, N' F% V# ?* o