Topsis法是technique for order preference by similarity to ideal solution的缩写,意为与理想方案相似性的顺序选优技术,是系统工程中有限方案多目标决策分析的一种常用方法,可用于效益评价、卫生决策和卫生事业管理等多个领域[1]。此方法对样本量、指标多少及数据的分布无特殊要求和限制,灵活、方便、实用。但目前几种常用的统计软件包并没有提供现成的计算机程序,而现有已发表的关于Topsis法的SAS程序在应用于不同数据时,需要做较多修改,并且不能进行加权Topsis法的运算。本研究就Topsis法综合分析的SAS程序做了进一步的改进,使之更简单实用,以满足实际工作的需要。 + J, w+ y( F' f8 @3 a# u* D9 N1 ]0 C j2 j8 m! c. N
1 原理与方法2 [* ^; ~9 D* i/ Z2 l6 l
) ^( k, r) F5 \* s/ h8 ?* r& b) W) @ 基于归一化后的原始数据矩阵,找出有限方案中的最优方案和最劣方案构成一个空间:待评价的某方案可视为该空间上的一个点,据此可获得该点与最优方案和最劣方案问的距离(常用欧氏距离(Euclidean distance)),从而得出该方案与最优方案的相对接近程度,借此可进行方案优劣的评价[1]。其原理和方法如下: 4 r0 n+ N, o- l5 p7 v " J- V7 L, e; |1 ?# R% v ① 同趋势化:通常采用低优指标转换为高优指标的方式,可采用倒数法和差值法。 + o) v" }& n9 ~! A c& ?( ~( D 4 C- ^: u0 P% ~0 l, M2 `
② 无量纲化:为了消除计量单位的影响,需要做归一化处理。设(xij)n×m为同趋化后的指标矩阵,aij=xij/ ?ni=1 x2ij,j=1,2,…,m,建立则归一化矩阵(aij)n×m。 # m7 Q) M1 ^9 s3 Y , Q: l' i6 [2 g! g" t$ _$ Q# _ ③ 求有限方案中的最优方案A+和最劣方案A- 。最优方案为:A+=(ai1+ ,ai2+ ,… ,aim+),最劣方案为:A-=(ai1- ,ai2- ,… ,aim-)。 2 B" \0 }- E2 J5 V7 F @! w5 g8 y: U& s) a. l& N
④ 分别计算诸评价对象各指标值与最优方案及最劣方案的距离,通常采用欧氏距离。 ! _( O! O# m4 s+ k, x( l / S- H4 A3 I" c1 n D+i=?mj=1(aij-a+ij)2, D-i=?mj=1(aij-a-ij)20 T/ G" t" V6 ~
8 X# Z( K. L* X% x2 Q5 n" z+ j% L
⑤ 计算诸评价对象与最优方案的相对接近程度Ci。0 O+ s- N* s) N; B( [1 l) I: p" ?
$ Z5 g1 y! `' }2 ?
Ci=D-i / (D-i+D+i) 2 E3 y6 d- K/ t4 Q ! I3 S, b# B) e# Q/ N) m0 X& S 2 实例分析与SAS宏程序 4 V& c- ~1 U ? . F, U# }& X9 a( b- @8 [
以中文版SF-36为健康调查问卷,于2004年7月~2004年12月间对≥60岁老年人(602人)进行老年人生存质量(QOL)的研究,问卷包含8个领域的指标,分别为x1(生理机能)、x2(生理职能)、x3(躯体疼痛)、x4(一般健康状况)、x5(精力)、x6(社会功能)、x7(情感职能)、x8(精神健康)[2]。得到数据如下: 0 o" R: ~6 [: T: F, H' O, \* [0 d% r, x7 G6 ^1 O9 }9 o
表1 7个地区老年人QOL各领域平均分(略) * x1 i. M0 u) t7 y( c' @+ T! X, i
以下是宏程序: 2 D' G/ i1 @$ l' S+ x) i( p6 T+ f8 F6 y* Q5 Z
%macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); 9 ]- a5 P- x! @: _" n6 s ( a4 T$ j' V2 e/ c8 g %let i=1; & K- O V+ w' @3 }
- A( B0 C4 Q- B/ Q
%let var&i=%scan(&var_name,&i,' ');$ |7 o- t5 f( Q6 b# \) @8 W
% k! ]% z- ^& b8 P2 q
%do %until (&&var&i=); ) m0 H* r6 B' @9 @+ D4 @$ Z " ]: ^( S! T/ e8 u# \/ j9 ^
%let i=%eval(&i+1);; g7 f3 g3 `7 b) ]4 q
) i" X3 o* k5 {' k$ [- r %let var&i=%scan(&var_name,&i,' '); ( g, E- r- U2 w4 e. j; I 9 M. Q6 `; [6 C" K* _1 r, O
%end;$ G& T# b6 K# L: _
6 S' f O K. Y* X
%let var_num=%eval(&i-1); *自变量个数;+ }4 N+ o! X: u7 M9 T" V# d( t& U$ C
5 g5 t) o9 I- d$ w
*top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行;$ {/ ^$ w( y) X* S- s
/ ?. C. P1 H# ~9 v J %if &weight=1 %then %do; , l3 e. X1 _! v6 U5 |5 U 4 D2 w5 y5 z( e
data top_1 top_2;) W, T$ W1 {) Y; [
# C5 U5 [8 a, e/ W set &data_name end=last;9 I8 U9 v2 w5 H% j- w8 S' j
i: t# W( Q6 O" G8 }' {; D8 k
if last then output top_2; 4 I( u" I( S; \( p- K 2 E6 V7 O! j- [3 W+ ]# n: _
else output top_1;0 X3 a2 h- M8 I/ Z# Y5 c
' j, R" S4 j* H9 J7 `
run;%end; , }, u- n& C5 q# g% q 1 [% C" @4 P8 y5 d8 Q% B: q `
%else %do;! \" q4 g& L. M: J% j% `, H
: l2 E) L* @% `% R5 }, I2 A9 S data top_1;' \9 I/ w5 c C8 @
" t: S4 e8 m/ T1 x set &data_name;7 J- [' o1 y8 t' }! w1 n- L
$ K3 b( y; b" v% @+ z3 p! k6 y
data top_2; y6 e, l1 Z' x ) f, d, ^ `) f5 r' [ %do i=1 %to &var_num; 1 \; T2 h: e: _7 X7 V2 K/ X1 i1 V% a % c; A+ `, n' q( f, g- h &&var&i=1;4 m% z7 j0 b1 N9 ?& |9 U