Topsis法是technique for order preference by similarity to ideal solution的缩写,意为与理想方案相似性的顺序选优技术,是系统工程中有限方案多目标决策分析的一种常用方法,可用于效益评价、卫生决策和卫生事业管理等多个领域[1]。此方法对样本量、指标多少及数据的分布无特殊要求和限制,灵活、方便、实用。但目前几种常用的统计软件包并没有提供现成的计算机程序,而现有已发表的关于Topsis法的SAS程序在应用于不同数据时,需要做较多修改,并且不能进行加权Topsis法的运算。本研究就Topsis法综合分析的SAS程序做了进一步的改进,使之更简单实用,以满足实际工作的需要。 8 g1 u% m4 @3 I) h, F: Y# X+ F9 B- z; a3 z$ n
1 原理与方法 * C$ r! \# [2 j0 d 8 V. L' W# s5 C) w% x. ]7 N$ q, ? 基于归一化后的原始数据矩阵,找出有限方案中的最优方案和最劣方案构成一个空间:待评价的某方案可视为该空间上的一个点,据此可获得该点与最优方案和最劣方案问的距离(常用欧氏距离(Euclidean distance)),从而得出该方案与最优方案的相对接近程度,借此可进行方案优劣的评价[1]。其原理和方法如下:; r, J% S, H- W2 \
7 @9 r6 {/ s& \/ H7 s: t/ G
① 同趋势化:通常采用低优指标转换为高优指标的方式,可采用倒数法和差值法。 ) `9 F8 n! y, k8 ^; T+ o5 D, n - ]+ U; E% ^, J8 ?4 r1 `/ B1 I
② 无量纲化:为了消除计量单位的影响,需要做归一化处理。设(xij)n×m为同趋化后的指标矩阵,aij=xij/ ?ni=1 x2ij,j=1,2,…,m,建立则归一化矩阵(aij)n×m。) U* C$ S O7 y: _1 W2 p5 R
- r: X% r4 j/ D- K( e ③ 求有限方案中的最优方案A+和最劣方案A- 。最优方案为:A+=(ai1+ ,ai2+ ,… ,aim+),最劣方案为:A-=(ai1- ,ai2- ,… ,aim-)。; F2 {% ~+ X1 ~. W& E. e
4 p& s8 d' u0 Y: f: H3 u7 } ④ 分别计算诸评价对象各指标值与最优方案及最劣方案的距离,通常采用欧氏距离。 / Q6 v! J) x+ W. v1 c * U) T: c- [8 \, f" H
D+i=?mj=1(aij-a+ij)2, D-i=?mj=1(aij-a-ij)2% v( a, n% \) f4 }# C1 o
% X2 z/ d; Y# K; G2 ^: ~- H- z ⑤ 计算诸评价对象与最优方案的相对接近程度Ci。( ]0 F6 g- g# h8 m
; b2 ]/ P- k3 }9 W2 o* ?
Ci=D-i / (D-i+D+i) 4 p. o6 W" ~; p) T/ N! ?6 z g# r7 z; T3 |2 t
2 实例分析与SAS宏程序 2 s' a2 a4 N, t# i2 Y " F- }; k+ f' s- \8 |: U
以中文版SF-36为健康调查问卷,于2004年7月~2004年12月间对≥60岁老年人(602人)进行老年人生存质量(QOL)的研究,问卷包含8个领域的指标,分别为x1(生理机能)、x2(生理职能)、x3(躯体疼痛)、x4(一般健康状况)、x5(精力)、x6(社会功能)、x7(情感职能)、x8(精神健康)[2]。得到数据如下: # z; P9 c$ F$ _+ P- M x8 v3 G/ O: s7 H5 D
表1 7个地区老年人QOL各领域平均分(略)5 j7 A7 F$ |* M' X' M" h
: V* R4 s, u" \( x: I3 I3 \: ?; x2 N
以下是宏程序: " s( L: I5 r# j2 y. z: S$ v6 F+ \1 [# z3 n V& @! B
%macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); + |! o* D! \) ^" Z
6 B$ l7 m4 z8 n2 s& u
%let i=1; $ j& a0 _9 J) N" i3 d7 t+ S4 @ a- L! c+ d! A+ X' k+ c8 j
%let var&i=%scan(&var_name,&i,' '); ' v$ {5 P s/ c$ e# G6 `0 R, C ' U" R0 \! q/ _7 E& V! Q* b
%do %until (&&var&i=); . T$ w. [- [2 y5 @# Y
/ ^) H; D% t* n %let i=%eval(&i+1); ! c- S4 @8 L- g9 ?* _ 5 C% X( l" s! x; O; [- S$ r7 d/ L %let var&i=%scan(&var_name,&i,' '); 1 h9 I a: N7 F ( h3 n5 ?' W# f! _9 j, Y1 d* y
%end;8 l; w. Z# e$ z8 j
" }2 \6 ?& `5 C9 |0 w
%let var_num=%eval(&i-1); *自变量个数; 3 I% L2 Y7 a8 c& R# Z ( J, G0 w3 I! w
*top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行;! @" j1 I* @# N' l A1 r
2 K7 t% F9 g+ ~ i C %if &weight=1 %then %do; 1 D# T0 Q, W' {& {8 J % ]' b; p. N7 `- k! V% v data top_1 top_2; ! w. |* }4 H" r: |( c* C 5 b# V. J E' g
set &data_name end=last; ; Z6 k. A# g. b8 ~, ` $ t! i9 ^" M) M1 o if last then output top_2; ( A4 M! n2 c$ X5 Q4 n/ Q7 M6 n % [( y1 D$ k0 E2 V' V
else output top_1;5 ^/ z* ?: J+ i; ?
6 E, Q: s q7 ?, J4 d' c9 C run;%end; * P0 h" D% k ? $ H. D0 ^! e6 a6 c %else %do;9 h( T% Y, D7 j6 `0 `( ]# C
( ?+ x: H! x' i9 O% B- x7 q data top_1; ! u9 S x7 h e1 E7 k/ ]8 k# X6 {! i 6 M9 r- }( F8 G8 X, | set &data_name;! P! k3 Y4 Q8 j5 v2 K
6 p! e- h% v' G( y6 l4 ]1 _7 J data top_2; . Z: M+ o, D0 q' k) G/ u/ m : j) I" {# Y5 i8 A; Z6 U0 T3 o
%do i=1 %to &var_num; ; Z; Z2 b6 C& t8 p 8 G$ o0 c; q3 Y7 r$ }" m+ n& {
&&var&i=1; $ Q- e% C3 O4 T" h6 z- \7 s# m! n5 G 9 R7 {5 t% B$ n
%end;+ L( E& Y0 w! N; ^3 z5 X( N
, H9 V$ A- [3 h run;%end; 1 J6 Y& |/ `) K; P( C # o' O3 j/ [% i$ `; \4 ?6 C( H1 Q
data _null_;*样本个数;# P1 f# e L( ^1 M) O( a3 m
" v0 k4 @( }6 r4 Q3 L
set top_1 end=last;% H+ `* O+ ^$ C5 c* R2 U2 Z- D6 m
4 M6 R0 v) v3 ?' | R9 q+ ?
if last then call symput('obj_num',compress(_n_)); / F$ t& F* s' a 7 l6 v/ B% M9 F; d1 N2 }3 a %let sqr_str=;; v. p" E/ f7 y6 `5 b3 A: E; D1 V$ G8 R
$ j; e6 s6 k1 j) |9 c2 m
data top_a; *求各指标值的平方;0 P: H8 F+ [# d- }9 R
8 o' E* j2 P. G4 C: S
set top_1 end=last; ; n. w" _! i7 g4 Z" t7 ~2 x5 p / f6 [0 F4 G4 v# _
%do i=1 %to &var_num; 0 s+ ]$ O! I: P; u. j) K O7 \ l2 F, w7 Q6 e. |! W
&&var&i.._2=&&var&i ** 2; * p4 J Y8 P s' k1 ^2 D, q / l& }1 ^9 {9 h
%let sqr_str=&sqr_str &&var&i.._2;%end;8 M. o9 c* f& s0 J0 n. h