Topsis法是technique for order preference by similarity to ideal solution的缩写,意为与理想方案相似性的顺序选优技术,是系统工程中有限方案多目标决策分析的一种常用方法,可用于效益评价、卫生决策和卫生事业管理等多个领域[1]。此方法对样本量、指标多少及数据的分布无特殊要求和限制,灵活、方便、实用。但目前几种常用的统计软件包并没有提供现成的计算机程序,而现有已发表的关于Topsis法的SAS程序在应用于不同数据时,需要做较多修改,并且不能进行加权Topsis法的运算。本研究就Topsis法综合分析的SAS程序做了进一步的改进,使之更简单实用,以满足实际工作的需要。 7 C9 B9 Y- i4 e% D8 x : G( E+ L v/ M0 `; \- o 1 原理与方法 4 j5 l8 i7 O6 }; Z 5 c/ B, v4 x4 M& a# d. J. q 基于归一化后的原始数据矩阵,找出有限方案中的最优方案和最劣方案构成一个空间:待评价的某方案可视为该空间上的一个点,据此可获得该点与最优方案和最劣方案问的距离(常用欧氏距离(Euclidean distance)),从而得出该方案与最优方案的相对接近程度,借此可进行方案优劣的评价[1]。其原理和方法如下:, |9 N9 f9 \1 k# a M8 Y k
4 u4 O' y6 Y+ x) ^7 X' V T ① 同趋势化:通常采用低优指标转换为高优指标的方式,可采用倒数法和差值法。, Y; f; I, K0 q! r5 F1 c
; f" J; y8 a6 o" l7 I7 p
② 无量纲化:为了消除计量单位的影响,需要做归一化处理。设(xij)n×m为同趋化后的指标矩阵,aij=xij/ ?ni=1 x2ij,j=1,2,…,m,建立则归一化矩阵(aij)n×m。 / c: B; k. O6 t& u; i; ^ 9 E+ P6 w& Q" Z& ^ Y ③ 求有限方案中的最优方案A+和最劣方案A- 。最优方案为:A+=(ai1+ ,ai2+ ,… ,aim+),最劣方案为:A-=(ai1- ,ai2- ,… ,aim-)。9 \# R2 H) z J
$ q$ M+ ~0 y1 P$ J: i
④ 分别计算诸评价对象各指标值与最优方案及最劣方案的距离,通常采用欧氏距离。3 v: O+ [2 h. A
1 G* E0 P/ B+ m6 J D+i=?mj=1(aij-a+ij)2, D-i=?mj=1(aij-a-ij)2 2 \$ k1 F" {* ^! c0 s ; D1 N0 ?& }% ~# S
⑤ 计算诸评价对象与最优方案的相对接近程度Ci。6 r! e5 a/ o& Y5 n6 `7 G H2 W
: w4 U5 H8 I4 O2 p
Ci=D-i / (D-i+D+i) 0 h4 {0 }5 y' p! {" M1 K0 n. J+ ^% t* q% o# L/ J
2 实例分析与SAS宏程序 " ?1 v7 S: h+ B# I0 j! J) g / s9 G* T9 j% f/ v6 h @ 以中文版SF-36为健康调查问卷,于2004年7月~2004年12月间对≥60岁老年人(602人)进行老年人生存质量(QOL)的研究,问卷包含8个领域的指标,分别为x1(生理机能)、x2(生理职能)、x3(躯体疼痛)、x4(一般健康状况)、x5(精力)、x6(社会功能)、x7(情感职能)、x8(精神健康)[2]。得到数据如下: 1 X# E: v8 d+ P5 [4 F" g! g3 ^- _+ c& u$ \ Y2 L: o
表1 7个地区老年人QOL各领域平均分(略) ) o: M4 u0 p$ _5 B8 g8 Q, y+ R& R. M+ E
以下是宏程序: ( \: h3 k4 g; Q. f* o8 n, y- N# V # n8 y9 b7 v" N% \% v# Q4 M %macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); L, c% Z: q* Y, p; b/ T4 \ , {& o, u5 I& m- | I4 C! j- o %let i=1; ( E0 j1 h' V* C! v' v ( \7 |3 g5 L+ ^
%let var&i=%scan(&var_name,&i,' '); ) s3 @9 m. \- Y- h# t * W* B4 e4 H" h6 S %do %until (&&var&i=); 2 m, y7 j6 S9 W7 M
8 B% v% N$ x, }
%let i=%eval(&i+1); 8 [9 x: R% j8 `6 v7 u3 e9 C8 J# F # z7 j( s+ E% ]$ z H! i
%let var&i=%scan(&var_name,&i,' ');5 g/ ?" n3 y3 x
- b/ b/ d& R* { D% i
%end; / V/ W* y8 {$ q3 l- j 2 O# I4 V; V9 |/ ^% e9 w
%let var_num=%eval(&i-1); *自变量个数;5 C9 x" A4 H' f' U8 w U% D* R
8 P4 [$ C8 U* \$ v% g R
*top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行;1 T* k. L& e, @- ^) d3 ]
- {* l, D! g7 _ ~9 F data top_1 top_2; ; v' u9 g' n0 R \ P9 S : L( P( g# b! ?; d0 K# x( e" x
set &data_name end=last; 4 c7 K }" Z O- M' R ; d& s* a' S: |9 L9 R4 G2 G% x
if last then output top_2; 4 o* X0 G+ Q; ^ S 8 j ?/ J2 z' o' K- I else output top_1; 2 T( S8 T" ~1 T' G9 d t0 n/ q S* { + q% ]+ I9 V ^1 e4 K) H$ ?6 q. J
run;%end;: G3 x& d" T' c( @. c" T
8 b2 s/ v, A& f8 z4 ^3 \4 C
%else %do; ^- D% `/ f, U. }3 w$ L# Y 6 Q7 p9 `/ O C, R% b: H2 O' M0 S
data top_1;" `; M6 n3 c% `' s5 q
9 e5 a! {! B7 s$ c7 R0 m
set &data_name;5 V" c- Q! }1 G+ g* y
( p% T/ J+ n) C* v
data top_2; + b/ ~) g4 b Y7 C* o8 ^ / S4 X$ A: u0 G1 w, I
%do i=1 %to &var_num; : g9 @1 l. W7 _* J3 }* w' o 4 N1 g7 b; H' C, l9 F; N) {9 [* `
&&var&i=1;% [ z) Q% s5 ]; ^7 [
0 @" U& ~$ w0 y
%end;: w8 Q( A+ }: m- u
6 c% Z7 F% v. v( u7 K* s% F run;%end; * b4 Z- d: [) w' w s( ~4 `- M/ C 9 i b' v3 o/ m" }+ |/ `' T data _null_;*样本个数;! b# ?- _8 C3 y j" x. E# N
1 l+ M8 B/ z4 m/ D$ v
set top_1 end=last; ! r$ _- F# F* b O3 K( W' h 1 c A/ \. G; }8 u
if last then call symput('obj_num',compress(_n_));7 w* @9 J6 \2 F" `+ H& d
( \, _" J4 t9 g2 v2 M" ^
%let sqr_str=;1 i! l# q+ {9 x2 F- o4 j2 R. A
; }( J; @' s) ]0 m1 w) S0 w data top_a; *求各指标值的平方;5 \; i2 B/ [, w: V- S7 j
- ^- p/ l& t0 o; M, w* f x/ n
set top_1 end=last; ( N( M4 B6 P3 d2 x$ G6 l ; R/ ?+ l, [7 u% ?" l: {2 |
%do i=1 %to &var_num;0 ? w2 x4 T& h/ F) |+ S6 s
. v4 {7 j( L3 K u &&var&i.._2=&&var&i ** 2; % i7 M3 U# G/ O. k( \$ S( x$ c 1 F+ W3 K; l2 A' G4 n/ a" l
%let sqr_str=&sqr_str &&var&i.._2;%end; $ ~$ g! Q3 m7 F) L5 A' Z" n% j7 Y7 C 4 x8 N3 u* E: K" ?/ w6 U' e/ i& ^$ W7 x proc transpose data=top_a(keep=&sqr_str)prefix=top_m out=top_b; *对平方值矩阵转置; % u! ^; Z( y! A- F: O5 Q: c + Z0 K: u9 n- b0 c: n @# v proc transpose data=top_a(keep=&var_name)prefix=top_n out=top_C; *对原始数据矩阵转置;4 V4 U$ I6 k3 u- l$ A
* l- C! |, H7 I proc transpose data=top_2(keep=&var_name)prefix=top_w out=top_w; *对权重数据矩阵转置;/ n# i" ~0 P. y, t! g9 Y$ A
7 E. J: D$ _. B data top_d; *求各指标值的平方和;: D* C1 @% i* R7 `- ]) ~2 n; Z
- Q6 j. x: o8 X6 |
set top_b; " g0 R4 Z) t) R . R& S0 d% p/ ^8 [. x1 [' w' ~
z=sum(of top_m1-top_m&obj_num);1 g% q. P0 n& _; O) A# s* _( S4 ?3 @. l
7 v1 e/ q: U; M0 U %let min_str=;%let max_str=;9 O" Z0 Y$ W8 e# l- N
\) h4 p$ `* t! `
data top_e;/ }/ Y: B7 f( Z M+ d8 c4 O
* G5 {+ j( X* T- r+ y0 c( q; T merge top_c top_d top_w; O# p* L) U. u2 k ; e3 o& e+ n0 ^& _7 {" T
%do i=1 %to &obj_num; *求归一化矩阵的转置矩阵;+ H0 g0 \0 ? l) o
7 L1 A7 j A% n" \% G& Z4 s z&i=top_n&i/sqrt(z);%end;1 ~9 `" @, [; Q8 W' P