Topsis法是technique for order preference by similarity to ideal solution的缩写,意为与理想方案相似性的顺序选优技术,是系统工程中有限方案多目标决策分析的一种常用方法,可用于效益评价、卫生决策和卫生事业管理等多个领域[1]。此方法对样本量、指标多少及数据的分布无特殊要求和限制,灵活、方便、实用。但目前几种常用的统计软件包并没有提供现成的计算机程序,而现有已发表的关于Topsis法的SAS程序在应用于不同数据时,需要做较多修改,并且不能进行加权Topsis法的运算。本研究就Topsis法综合分析的SAS程序做了进一步的改进,使之更简单实用,以满足实际工作的需要。9 @! W& x" @9 ^& J( _
7 @: A/ {# Z1 a
1 原理与方法# Q8 ^. h Y9 }
3 g! k! _, N- f$ s6 S$ H/ j! l: C* p 基于归一化后的原始数据矩阵,找出有限方案中的最优方案和最劣方案构成一个空间:待评价的某方案可视为该空间上的一个点,据此可获得该点与最优方案和最劣方案问的距离(常用欧氏距离(Euclidean distance)),从而得出该方案与最优方案的相对接近程度,借此可进行方案优劣的评价[1]。其原理和方法如下:* v; o2 q$ K! p v+ y; g+ C
* {8 r% q5 |* m1 c1 O- d. t' w0 ?
① 同趋势化:通常采用低优指标转换为高优指标的方式,可采用倒数法和差值法。 ) E7 e# K( Y6 Q+ i4 A7 w9 z1 G1 ~3 P # W5 o' y: t5 ^& L/ R& X- R- x0 y
② 无量纲化:为了消除计量单位的影响,需要做归一化处理。设(xij)n×m为同趋化后的指标矩阵,aij=xij/ ?ni=1 x2ij,j=1,2,…,m,建立则归一化矩阵(aij)n×m。 4 S) F0 R+ ~4 Y* y ( k. I& H2 R9 b5 Y! V$ q+ ?+ M ③ 求有限方案中的最优方案A+和最劣方案A- 。最优方案为:A+=(ai1+ ,ai2+ ,… ,aim+),最劣方案为:A-=(ai1- ,ai2- ,… ,aim-)。, c v& Y7 n- j1 K" G3 N
4 Z. S2 e) U5 {7 \) t" S %macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); / Y8 }' v6 H% C" @ 8 W( z! n- W7 o3 p' G
%let i=1; - V( ?: d0 H0 b4 Y
( r# g: n6 E1 C( z %let var&i=%scan(&var_name,&i,' '); ) o# V9 V1 R( K0 ~ ; B" A2 z. u1 `6 [2 M
%do %until (&&var&i=); 2 Q' X/ a9 H$ A2 W4 J- v / [0 ~* b) U- B H% f" ?8 l& {$ B %let i=%eval(&i+1); 0 E8 }( p# V* r # @& g1 K3 s: c; U% n %let var&i=%scan(&var_name,&i,' ');3 W Z! |+ u6 D g5 j$ r% T
- [6 r9 ^& b$ ^, b" ]/ R, c
%end;6 J% a7 E# D9 d+ e7 p* T
2 V6 U% O6 W0 u! c
%let var_num=%eval(&i-1); *自变量个数; 1 i+ d# ~4 H) W0 v% s" j; N 7 h7 a8 M' C3 ?3 y" I
*top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行;5 U1 N& A6 }1 v# ]( n& v0 k) q
) P3 z3 y; b1 N
%if &weight=1 %then %do;4 h6 p1 j7 l9 \3 }; I2 E
. N/ Q0 r6 s. {* q8 C& e data top_1 top_2; ! N; t4 p$ u( @+ z2 [# \& L 5 D+ e5 N C/ c# K! q
set &data_name end=last;; g0 p3 ]! c1 ^ R9 z# [' n! s
& i2 Z, q+ q0 M( j: k$ Q if last then output top_2;4 L @( i7 X$ {; s( d3 h
7 [- n7 [% Q! p( K, D8 A- ^! m else output top_1;0 Z0 ^. I3 L }0 X" U) i) y
8 }8 n# k' O4 F
run;%end; 6 K, t8 G, ?0 A' V- x 8 L) ^1 \* I# ]# @9 y
%else %do; . T1 o5 M6 ^5 \ ] 3 D$ P. G! @4 F$ L4 W5 J data top_1; + L X2 d L* j : D" @- x) P! Z1 V$ [: C set &data_name; 1 q: T# A! h; c, m2 U) V% \0 z . s" }# {3 ]+ X: O+ y data top_2;4 W7 P; G/ X$ `# N( u. F! s% u1 _
/ A; @% J6 H. q %do i=1 %to &var_num; c: [9 v1 ]0 u n- b d) s
7 P* E$ N7 l8 p* E" e; }1 [5 v
&&var&i=1;7 c" j$ ~; k4 C4 Z3 {+ S* J, _) e
, r! F* t8 o, a$ Y %end; ! d, Y+ q: J9 K. k- z/ X 8 [7 O X" i7 x/ s. x run;%end; - W0 P' G8 g( r & e& B3 p. b/ T1 V4 L) g/ K5 R$ Q
data _null_;*样本个数;0 B2 j# X a0 ^( s2 w
: i5 k/ q9 F6 j! _7 d set top_1 end=last; 5 o4 a, ?" K% s6 s4 W 4 O; h. H3 i. [& i! S3 ~7 { if last then call symput('obj_num',compress(_n_)); " k& N g& G) ]# o0 E7 @/ j) y3 p* I : {) J! w0 C& r( e %let sqr_str=; 5 }& e5 G+ T2 X, r 6 Q# L; S6 o |/ { data top_a; *求各指标值的平方;' U; S n6 b4 V( C. o* ~
5 F8 L. X2 o6 H- [ set top_1 end=last; 5 p2 E* _9 N6 [' i 6 Y, N/ C. K* U* a1 o
%do i=1 %to &var_num; , e# D5 H0 T9 V+ b" o. U! @ ! B4 F: O- d$ z1 ?9 I
&&var&i.._2=&&var&i ** 2; 3 C6 G% S& o+ U 9 h' G! e* r; k) I %let sqr_str=&sqr_str &&var&i.._2;%end; - Y+ N1 m- K" X0 r0 r! E0 x & a! f' J3 X- c. }& j3 D4 \1 V proc transpose data=top_a(keep=&sqr_str)prefix=top_m out=top_b; *对平方值矩阵转置;8 D/ M& w/ S4 m4 N7 \: \. J" n5 r+ W
" h8 T! f& H6 [; R2 K proc transpose data=top_a(keep=&var_name)prefix=top_n out=top_C; *对原始数据矩阵转置; + S& o9 z* b) z. G " B$ \ m1 y% a+ E% X
proc transpose data=top_2(keep=&var_name)prefix=top_w out=top_w; *对权重数据矩阵转置;& N" B2 i/ X: k' E: o
4 h/ f/ N" t. f# \: h% O
data top_d; *求各指标值的平方和; 6 N7 D0 {! K- y! D( }) J 1 A5 ^2 V6 ]- d set top_b; : D/ a% n: T- Y* Y. O& N& t& ] ; H. A; A8 S& d9 A0 P z=sum(of top_m1-top_m&obj_num); % k6 ]5 }$ V _/ I3 t: Q( O ' R4 U* l- u/ a. C; o5 ~2 c+ Q %let min_str=;%let max_str=;- I6 S; g7 E( R% _% \) |, S
! G, F0 Q) H# R7 Y9 b
data top_e;' k8 Q/ o% ^* j5 o9 x
- J- S! W* p% R# U8 D C
merge top_c top_d top_w; ! D" w$ z5 d z% ?* M$ ?
9 {4 c) H1 ]7 Z d6 a
%do i=1 %to &obj_num; *求归一化矩阵的转置矩阵;0 W! P Y4 p/ ~' n6 y
) ]: T2 X7 n# V( L5 Y; M, z
z&i=top_n&i/sqrt(z);%end; 7 |8 F) L W' o1 Y" n/ I2 U : O- |: f( L8 J5 ~0 [4 v% `
max=max(of z1-z&obj_num); *求最优方案和最劣方案; 8 ^+ Q: L; O9 P+ S5 | F1 z3 ?/ r 9 _6 V3 d- n; d" H* }4 \ min=min(of z1-z&obj_num); 2 _# |) O: T; n- u9 _; o1 @+ v1 n ' o, u4 K# h+ B/ m
%do i=1 %to &obj_num; / d+ ?9 B$ ~% E4 r; `8 ]4 v / d1 g$ d5 G: T5 V1 }
d_max&i=top_w1*(z&i-max)**2;; X7 x u( Z$ b3 A, N3 A# N1 M
2 h4 a E8 I- }- J* u d_min&i=top_w1*(z&i-min)**2; * _, }$ b7 D8 p% o 7 S0 I/ c9 V' a# g/ N' x %let max_str=&max_str d_max&i;. H: y" f2 ^; {9 B# |
, v! _, }+ H1 {' Y
%let min_str=&min_str d_min&i;%end; / Q( c6 f1 V4 r; z6 a1 ] 9 w- L+ t7 l( K% W
proc transpose data=top_e(keep=&max_str) prefix=max out=top_f; Q, o4 P) V g ; m7 ~/ `6 w7 q) A proc transpose data=top_e(keep=&min_str) prefix=min out=top_g;*求各评价对象与最优方案的相对接近程度C,并排序; 7 f" w! p% x" ~ + W8 d4 A. ]9 v4 ] data top_h(keep=&var_keep d_max d_min c); ; Q# a* E) n9 F- k/ Y! g) c$ f$ Y: D & U& e7 e: v a# v4 l8 Y merge top_1 top_f top_g ;2 I# b( e j0 X% e
]/ E7 G+ s2 h5 A max_sum=sum(of max1-max&var_num);/ G4 O$ h* Z1 |' W/ j, n# e) Q
9 R+ c% G K0 N2 Z. g) {( H K
min_sum=sum(of min1-min&var_num); 3 M) p5 v. V" ` ( A. J4 h+ n: p d_max=sqrt(max_sum); 6 M7 K) x+ o, K' C1 Y 6 ]" G1 I% l3 r
d_min=sqrt(min_sum); 6 A+ s7 R2 Z. H; Z$ ` ( g/ C# G' O5 K" s C=d_min/(d_max+d_min); . M& h( j# o4 z. e- D% E6 v( l [9 G5 }; h: |% }3 A& o# F proc rank data=top_h descending out=topsis_result;$ }3 _0 L2 P F( U- C' F) D
" H0 d% `, M0 W, J ranks order; ( K' U0 g" O( T" H7 A7 d2 J5 H6 z6 H 4 I# v7 W0 v2 S- [. N* K4 H
var c;7 m2 A& m) ?4 n: d6 }8 ^
: i- T% R! O" o+ [
proc print;run ; / y7 b& t8 y m5 a3 s " S6 k5 _8 t7 u %mend topsis;) F& t/ Y4 a0 K6 I8 C: v* s
$ `8 A& l9 y# d8 ~- C. R
设数据集名为topsis,地区变量名为city,var_keep为需要打印出的变量,weight为是否进行加权Topsis法运算,默认为0(否)。运行宏程序如下:! Z3 g1 Z6 A+ W. H: g
* Z% r: t J* t) U8 J, P: Y
%topsis(data_name=topsis,var_name=x1 x2 x3 x4 x5 x6 x7 x8,var_keep=city,weight=0); 6 w0 \$ k; X: B. p- ^0 z : j" j2 g8 T1 |( V- D: f" c, L# K 运行结果如下: ; A1 j) C1 q" i5 W$ o& O; E% p" q4 e4 V& P% z; p Z$ q/ ^
Obs CITY d_maxd_minCorder1长沙0.186680.161690.4641442苏州0.178900.115590.3925173沈阳0.195440.142200.4211564广州; B# |: B+ z4 E! u4 ?/ H# c
0.128570.175710.5774625成都0.093750.238970.7182316天津0.205630.164550.4445157上海0.144700.194060.5728631 W/ C! L' N- M5 D- ]
6 p" c, O; d" K( W6 r: H1 N- k4 r 3 讨论1 [: P& D* w+ B& d