Topsis法是technique for order preference by similarity to ideal solution的缩写,意为与理想方案相似性的顺序选优技术,是系统工程中有限方案多目标决策分析的一种常用方法,可用于效益评价、卫生决策和卫生事业管理等多个领域[1]。此方法对样本量、指标多少及数据的分布无特殊要求和限制,灵活、方便、实用。但目前几种常用的统计软件包并没有提供现成的计算机程序,而现有已发表的关于Topsis法的SAS程序在应用于不同数据时,需要做较多修改,并且不能进行加权Topsis法的运算。本研究就Topsis法综合分析的SAS程序做了进一步的改进,使之更简单实用,以满足实际工作的需要。4 z) {+ {2 o5 m) m, v% N
, r: O; J3 u/ n3 f' m! |: l ③ 求有限方案中的最优方案A+和最劣方案A- 。最优方案为:A+=(ai1+ ,ai2+ ,… ,aim+),最劣方案为:A-=(ai1- ,ai2- ,… ,aim-)。% s# m& T" d+ C8 f& h
9 Q0 U( _* \6 \, x8 ` x ④ 分别计算诸评价对象各指标值与最优方案及最劣方案的距离,通常采用欧氏距离。 4 }& g6 B% B1 S/ Y8 G ; u! ]/ Z* f2 |& u
D+i=?mj=1(aij-a+ij)2, D-i=?mj=1(aij-a-ij)2 + d% b$ G1 T z6 A* V9 p ! K- ~! S0 @( E' c7 B ⑤ 计算诸评价对象与最优方案的相对接近程度Ci。 1 y7 n# @* j m- u + f6 S. i q- a" p- O7 d" V
Ci=D-i / (D-i+D+i) + O/ _6 N- U1 K0 X7 b5 X8 F# Q8 ?0 n* `9 u
2 实例分析与SAS宏程序 + K2 d7 ?- {- ?4 h0 z1 B, u / K1 b. j1 A0 ^" l$ I 以中文版SF-36为健康调查问卷,于2004年7月~2004年12月间对≥60岁老年人(602人)进行老年人生存质量(QOL)的研究,问卷包含8个领域的指标,分别为x1(生理机能)、x2(生理职能)、x3(躯体疼痛)、x4(一般健康状况)、x5(精力)、x6(社会功能)、x7(情感职能)、x8(精神健康)[2]。得到数据如下:7 V3 N h" |8 U; q1 i; H5 y+ K
Z: F# V- g, Q
表1 7个地区老年人QOL各领域平均分(略)9 Q! A& D$ P; o+ e& S3 E8 O" e
7 Y- Q) `- F4 v+ X; H2 r 以下是宏程序: - [7 j0 f4 k0 ` 1 v( [0 x) R% J/ q, q %macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); 4 r3 r. d- C5 V' s+ K0 o( V8 R& r ! H' Y' o9 ~ @
%let i=1; m/ V8 `3 [/ B 1 r x" U) v4 K% A
%let var&i=%scan(&var_name,&i,' '); ( h! |9 u+ C. i( w" _ - X! {5 R2 \% o" e# D# v! p8 j %do %until (&&var&i=); 8 S8 @7 T% h3 _! q. W9 C8 h: h- t % l4 t. K: d' a: i, @ %let i=%eval(&i+1); / E" D6 M2 r6 h* r# O, a M * b2 N& j. z/ {
%let var&i=%scan(&var_name,&i,' '); 0 y+ d- ~7 `3 f$ a& s 5 S ~. n+ [5 u7 v! T: L %end; Q9 ]; g' Y! u& z& x# s ; U7 j- Q# ^: i5 `' t% m
%let var_num=%eval(&i-1); *自变量个数; 7 Y& m; H% D# A. ]0 e7 n* ? 4 Q6 I' f+ b0 Z) a- w *top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行; / `! a5 S/ C" M3 U+ a+ i8 u3 @ 4 p9 n' U0 O+ i0 T( g0 x8 w
%if &weight=1 %then %do;; t% \ d D% D* ^, \ _+ K
0 I5 M) q. i; }6 O" d. [
data top_1 top_2;) ^5 t* J) ] d- L& O
" d+ K' {! f( R! A1 x" {4 e
set &data_name end=last; 7 Q; F5 \( t7 F- n0 B+ }6 K 7 E% ]' ^9 Z' ^# V. c
if last then output top_2;! ~8 `6 k5 H3 j8 O5 l& v5 |
$ d/ b0 ~0 X9 W* E! k else output top_1; 1 J2 M. R* [2 t/ I , C k, T, q+ I: c run;%end; 3 }' k' I" C5 W ; t9 M3 ]/ F! a) P) n( s% Z %else %do; : ^: ]+ t' j2 z6 K! R) t0 Z8 | 5 }& z& s0 T" |7 _ data top_1;3 o9 p9 w0 W6 }$ V
; ^5 m* b1 L R5 m5 D3 T& a( J
set &data_name;/ O* t+ @3 `! o4 n0 N
" M$ K& k r, y$ X data top_2; ( Z* G& b# ~5 y. b # ^5 {% z+ [4 P; Y5 K
%do i=1 %to &var_num;2 v) A5 q a' R$ `2 i
) i3 ~( V0 k, b1 @1 y5 H
&&var&i=1; : _$ e2 v3 R+ \1 D! p6 Y+ r - d3 c: h! C' |. ]! Y %end;6 g+ b" t R$ s; d( |$ v% G' c9 s
7 A0 w. {% R6 _ run;%end;( U: z4 b" Q/ p& m a7 g8 k
: @2 ]8 ?2 e$ E4 e u data _null_;*样本个数; % x5 W: a& \, M8 M' A 1 o. M7 \ x9 q/ d9 V
set top_1 end=last;# Z1 N7 g. Z( c- ?* c T) g6 y& }' Y
( d2 \: H9 | [8 g3 s/ r
if last then call symput('obj_num',compress(_n_)); 9 j9 P2 H4 G6 C8 h9 N 7 ]* p. Q3 y1 h5 \% Q %let sqr_str=;) ]0 N. q$ T" Z+ K, W
, u2 {8 j; Q# J; T! V; I0 l; u data top_a; *求各指标值的平方;7 }- V6 e8 n) X/ o
$ ?; J o4 W% C( Y5 |# \
set top_1 end=last;# e3 |. X. E0 M) R. I5 @6 w1 X
% N# m( [* v+ ^, x, a
%do i=1 %to &var_num; + I9 y; y! W. M3 a % g `7 S! q7 a o1 I6 ~& v &&var&i.._2=&&var&i ** 2;9 d; l( |' |7 d/ ?( X( |
* ]: ~. m+ t3 j, v! l; x& \2 g) o %let sqr_str=&sqr_str &&var&i.._2;%end; - \: d9 V0 y4 E) Q0 {5 r & `' e5 K& P; t+ W( \ proc transpose data=top_a(keep=&sqr_str)prefix=top_m out=top_b; *对平方值矩阵转置;% _9 n5 V3 Z: B4 \
! C5 I1 D/ G$ g$ m# { Y
proc transpose data=top_a(keep=&var_name)prefix=top_n out=top_C; *对原始数据矩阵转置; , Y' A! G# j" [$ S/ v3 \- w; O8 q4 ? * u# m, Y; F, @" i1 p7 ] proc transpose data=top_2(keep=&var_name)prefix=top_w out=top_w; *对权重数据矩阵转置; 6 H2 D) p8 ~6 z! Q0 s# u, w 6 E* o1 c8 S" {
data top_d; *求各指标值的平方和;4 P* t0 ]4 Q/ a, e2 a
* J; W8 a3 Q4 ]# ?: [/ Z7 y5 K1 O
set top_b; % E9 ?' e" b) N/ Z/ h 7 n7 b* ? m( h( _% K z=sum(of top_m1-top_m&obj_num); 4 t- o. Y1 X& X! r ' |9 S: H9 ?6 z5 c; H7 r- e %let min_str=;%let max_str=; . Z- x2 k# d1 b# w ! `2 A6 [6 s/ O1 O& s. u2 ~3 @
data top_e;8 ~1 d$ V2 n$ ?- Y& |; {& f6 d" R
4 v. L6 v) x" A. [ merge top_c top_d top_w; # a, s5 w4 H. W+ F# y
) J9 M9 h. l, E/ D' l %do i=1 %to &obj_num; *求归一化矩阵的转置矩阵;& N% N7 W0 P/ ^4 H, P$ y2 P