Topsis法是technique for order preference by similarity to ideal solution的缩写,意为与理想方案相似性的顺序选优技术,是系统工程中有限方案多目标决策分析的一种常用方法,可用于效益评价、卫生决策和卫生事业管理等多个领域[1]。此方法对样本量、指标多少及数据的分布无特殊要求和限制,灵活、方便、实用。但目前几种常用的统计软件包并没有提供现成的计算机程序,而现有已发表的关于Topsis法的SAS程序在应用于不同数据时,需要做较多修改,并且不能进行加权Topsis法的运算。本研究就Topsis法综合分析的SAS程序做了进一步的改进,使之更简单实用,以满足实际工作的需要。! Q- [/ P4 L: T) A8 d
- q& o8 J$ P7 u X* L; F P0 L
1 原理与方法+ c/ x7 l N+ T3 k5 n% b! H
; A0 g2 ^* w( J4 N, f/ D# Q7 F5 H 基于归一化后的原始数据矩阵,找出有限方案中的最优方案和最劣方案构成一个空间:待评价的某方案可视为该空间上的一个点,据此可获得该点与最优方案和最劣方案问的距离(常用欧氏距离(Euclidean distance)),从而得出该方案与最优方案的相对接近程度,借此可进行方案优劣的评价[1]。其原理和方法如下: 9 J# n/ l5 z6 V- S+ Z* B4 t : n7 }7 v( e( ]4 i/ S) o ① 同趋势化:通常采用低优指标转换为高优指标的方式,可采用倒数法和差值法。 : x: P4 U/ z0 i8 o1 u/ y ) |% z$ }* T. L4 d; q. {- E ② 无量纲化:为了消除计量单位的影响,需要做归一化处理。设(xij)n×m为同趋化后的指标矩阵,aij=xij/ ?ni=1 x2ij,j=1,2,…,m,建立则归一化矩阵(aij)n×m。' N8 n' i& u: `* w6 d
0 g7 G- k: z* U
③ 求有限方案中的最优方案A+和最劣方案A- 。最优方案为:A+=(ai1+ ,ai2+ ,… ,aim+),最劣方案为:A-=(ai1- ,ai2- ,… ,aim-)。3 }' n4 ?/ Q9 |" g4 I
$ B" Q4 Q F( n# V: s& T ④ 分别计算诸评价对象各指标值与最优方案及最劣方案的距离,通常采用欧氏距离。 3 e4 Y: L% d( v& y / r& {+ m; H0 {1 t7 Q$ q& n/ N D+i=?mj=1(aij-a+ij)2, D-i=?mj=1(aij-a-ij)2 Y8 Q. C1 X% { 9 h# v$ N; |1 o# ?& V ⑤ 计算诸评价对象与最优方案的相对接近程度Ci。 - q H5 l( g7 v r7 Z" p- g. |3 K) @& U2 x6 _
Ci=D-i / (D-i+D+i)1 P4 s9 `5 R v2 x
' }- L, @3 ^) l7 p& [ 2 实例分析与SAS宏程序6 B5 b* y, q( P( f3 t3 f% M
3 M D/ g% w v% i8 V5 S" r 以中文版SF-36为健康调查问卷,于2004年7月~2004年12月间对≥60岁老年人(602人)进行老年人生存质量(QOL)的研究,问卷包含8个领域的指标,分别为x1(生理机能)、x2(生理职能)、x3(躯体疼痛)、x4(一般健康状况)、x5(精力)、x6(社会功能)、x7(情感职能)、x8(精神健康)[2]。得到数据如下: 3 k* H( u! |* ^. y+ l7 B S! H' I4 k" K; B3 u' d+ Y9 J# h1 L
表1 7个地区老年人QOL各领域平均分(略)# Y2 V w% J7 Y7 F
8 t$ L( @' B9 F, V2 k8 _2 L. t
以下是宏程序: / m+ P2 ^2 s: S5 d& p2 _% g) a# x/ `8 [: @2 {/ b
%macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); % g j4 l# }0 A% _/ \ 2 U. }# `& z; i0 H( j: y2 m
%let i=1; : y7 Z& L+ c: [; _
- e: g. i7 W- M! {. i3 f8 J
%let var&i=%scan(&var_name,&i,' ');" a, b1 g" ~. v" }2 _0 Y. h& g7 `- {5 J& Y
0 r* n/ ?2 I, s% {& \$ T
%do %until (&&var&i=); 8 O' }# j) [5 m" A9 n T& r, J
9 m3 p6 ]) D& F1 C9 Y
%let i=%eval(&i+1); 9 e4 e3 _* a3 h' P& @6 ~% O 8 V- A8 b% \: N8 i% o! L %let var&i=%scan(&var_name,&i,' ');% S4 C& h. s+ X
2 C0 s! h! `- Q2 D* `- ^
%end; ( i; c% G( {- [+ @5 T/ H - v+ o$ q, a' i/ [: S& e, K4 F
%let var_num=%eval(&i-1); *自变量个数; 4 {$ n/ l4 a. K+ |3 a( `" n) T - D" I y. _6 V- [$ I3 |) {
*top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行; - p/ B) t w9 g' h 1 c" D1 Q8 E$ B/ Y4 O %if &weight=1 %then %do; ! o/ `& `9 w1 F- q3 W3 e( J 3 h( I1 @5 X3 O h+ g$ s* {2 M data top_1 top_2;0 j5 `6 n, u& Q
+ k+ G6 g, l2 a8 s: G
set &data_name end=last;. w! ]2 s2 Z5 T( M
8 d P7 H: D6 P. p7 N: H3 w# ?, |. c if last then output top_2; ) `9 U' F a7 O 0 \0 D0 k" c% |) e( S else output top_1; 5 g0 I1 c- h0 _$ B * U$ C' ?, s! Y$ ]5 M% N; L* h
run;%end; + i3 N% a, z5 C; I7 S5 @ * \+ {; s/ ^6 ?/ | K: i9 Z7 ^ %else %do; ^# V$ I9 ?& A7 V5 O) T7 J
: F$ x' H2 y" y7 v5 R8 s3 h
data top_1; 0 q% R, |: u% R7 x5 K: n% h- R & U$ L8 ?- d" W9 P
set &data_name;" L# W/ n$ N' E" G! n
6 I+ m$ g7 K, Q$ i# l2 y3 P+ q7 ?
data top_2;2 o; m$ U) A+ h2 Y/ j' F% N
( b! o& z& j* e %do i=1 %to &var_num;6 r8 G! T: |9 Z" D4 B- F3 O
! o0 o) _( u* }, T6 ?) v8 s &&var&i=1; " q F" j% J- ?* Y3 q* [ 8 ?, @$ \3 y- Z8 z* B- I* }2 U %end;0 W( Q) t0 m9 l0 p4 ?
0 h! o! `! m/ P: Z
run;%end; ) Z- s. W" b5 A8 ~2 Z8 H 4 z* D# V) _& T
data _null_;*样本个数; & K* x5 h3 I( G. Z8 t% O) J , b! p; p: \. W2 b# ^0 e" W
set top_1 end=last;; v! o7 J! ^" b r: ^# s8 d
' U/ q% e, x. \2 P, B- M if last then call symput('obj_num',compress(_n_)); - y7 H" k1 P9 a: g" F. h; u: q/ F % \- y4 m; f3 L* |% m8 b2 @ %let sqr_str=; 6 r" f* [6 H l. k2 e# j2 ? 0 N6 d2 X. c% ] data top_a; *求各指标值的平方; # r9 {4 @/ ^- _1 o( d8 d1 M & c x. I9 [. g- b _0 L% c& G. ~ set top_1 end=last; % ], C1 } M$ {7 x5 J; c0 |) x & V9 i/ D# `+ |7 w$ E
%do i=1 %to &var_num;: z; E& s. k) j1 R: p1 ~* H
7 y b: X+ X( v: u& [/ }' x# A
&&var&i.._2=&&var&i ** 2; 8 _# J3 N- z+ R& Y & k7 {" i+ Y2 a3 a+ n3 o9 d
%let sqr_str=&sqr_str &&var&i.._2;%end;4 |( F0 M9 l' ]+ ]3 B
4 u( M8 w! \5 ]- z9 h n5 C
proc transpose data=top_a(keep=&sqr_str)prefix=top_m out=top_b; *对平方值矩阵转置; , J2 L: {# B; X5 X4 [ 6 \ ^; y$ C% P2 e4 F. p( |6 F* ?! j
proc transpose data=top_a(keep=&var_name)prefix=top_n out=top_C; *对原始数据矩阵转置;/ S$ [& q$ a6 f7 U- L% u
" ]" ?4 B- Z" s) f' k4 N6 F( T proc transpose data=top_2(keep=&var_name)prefix=top_w out=top_w; *对权重数据矩阵转置; + z) N8 N: J) g 5 X5 u1 J w: ?) U# Z( n1 a data top_d; *求各指标值的平方和;8 ^" a; t @" k6 b, H6 A* O3 i