Topsis法是technique for order preference by similarity to ideal solution的缩写,意为与理想方案相似性的顺序选优技术,是系统工程中有限方案多目标决策分析的一种常用方法,可用于效益评价、卫生决策和卫生事业管理等多个领域[1]。此方法对样本量、指标多少及数据的分布无特殊要求和限制,灵活、方便、实用。但目前几种常用的统计软件包并没有提供现成的计算机程序,而现有已发表的关于Topsis法的SAS程序在应用于不同数据时,需要做较多修改,并且不能进行加权Topsis法的运算。本研究就Topsis法综合分析的SAS程序做了进一步的改进,使之更简单实用,以满足实际工作的需要。 % w1 ^' ?+ I( p- y * s+ k5 \# w# Z+ \1 q+ x4 V& {% o 1 原理与方法 4 W8 U0 z3 A* r* g" r ( ~, s8 m5 O8 c4 N1 C 基于归一化后的原始数据矩阵,找出有限方案中的最优方案和最劣方案构成一个空间:待评价的某方案可视为该空间上的一个点,据此可获得该点与最优方案和最劣方案问的距离(常用欧氏距离(Euclidean distance)),从而得出该方案与最优方案的相对接近程度,借此可进行方案优劣的评价[1]。其原理和方法如下: 6 f* w; O( {" k& S2 x' y + W. b6 o' C" O
① 同趋势化:通常采用低优指标转换为高优指标的方式,可采用倒数法和差值法。+ f3 ~9 D N# u, |: j: O" K
3 ^. S" W1 i7 v' X6 l, W) | ② 无量纲化:为了消除计量单位的影响,需要做归一化处理。设(xij)n×m为同趋化后的指标矩阵,aij=xij/ ?ni=1 x2ij,j=1,2,…,m,建立则归一化矩阵(aij)n×m。 & C/ B/ w3 }0 p. b& \ ! ]6 z. S/ c9 L ③ 求有限方案中的最优方案A+和最劣方案A- 。最优方案为:A+=(ai1+ ,ai2+ ,… ,aim+),最劣方案为:A-=(ai1- ,ai2- ,… ,aim-)。 ; l' ?* @2 Z5 Q9 q 6 F2 W7 j" T3 F0 R/ d) z( J. n# s$ K
④ 分别计算诸评价对象各指标值与最优方案及最劣方案的距离,通常采用欧氏距离。7 O% l |" o: Q( |
# m5 d1 k) G+ [. O0 r5 {
D+i=?mj=1(aij-a+ij)2, D-i=?mj=1(aij-a-ij)2 1 x8 ]5 B6 F% C! i" t2 c9 Z: Q % q$ U2 u2 p" a. f
⑤ 计算诸评价对象与最优方案的相对接近程度Ci。 & l$ M" w; j8 o" n% l' \ 0 t2 p" c4 z! N6 h$ B+ B+ ?$ z
Ci=D-i / (D-i+D+i) / U. k. P2 n' r6 J9 B' a8 o8 M$ U: V
2 实例分析与SAS宏程序4 Y- Z. u, f* B4 H
. O; P: G H- q4 D: r" S* s, w0 x
以中文版SF-36为健康调查问卷,于2004年7月~2004年12月间对≥60岁老年人(602人)进行老年人生存质量(QOL)的研究,问卷包含8个领域的指标,分别为x1(生理机能)、x2(生理职能)、x3(躯体疼痛)、x4(一般健康状况)、x5(精力)、x6(社会功能)、x7(情感职能)、x8(精神健康)[2]。得到数据如下: 0 i7 @* [8 D. z% S " h" n( ?+ u5 z) z 表1 7个地区老年人QOL各领域平均分(略)' M$ c3 }3 |2 |/ V, P Q* v1 Y. O
0 r* E) {, O: N$ |& M
以下是宏程序: ! ]/ `+ x; y. E2 F2 f/ H; w: u: O2 u/ @$ h' ]/ E6 q
%macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); 9 J: X- b* V7 a8 d) s- t) f
7 W8 i5 f6 i1 t' C( m8 ^ b# q
%let i=1; 7 S; T x% W& b( E+ R+ y) `: A. u 0 m* N; |8 N( D
%let var&i=%scan(&var_name,&i,' '); x" l6 h. J5 q) d+ j " H ?6 W+ }( A1 R %do %until (&&var&i=); 0 Z1 {7 B o g5 f1 m # ]0 K" ~. p6 M- Z' d1 Z %let i=%eval(&i+1);6 d& C+ _* F1 A6 Q1 ^+ b& X" l) g
5 A, b# Q2 [, X) e6 f# N' ]# e %let var&i=%scan(&var_name,&i,' ');. @: k5 B0 E& J: ?
5 o$ \0 ^0 g& Y
%end; ! `# ?# c' P! x. b9 @# {% y 9 @# B7 b' i, Q( e, m9 g' W# W5 S
%let var_num=%eval(&i-1); *自变量个数;7 v) E6 H+ e* Y8 {1 a7 \
# `' O; g: d; V$ P+ z
*top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行; . C7 [; a2 h/ U# h1 q% ]- \- m+ ] - H( v5 U4 X0 T2 Y- [! p( U
%if &weight=1 %then %do;8 d! v7 m! B) L0 B* X7 f
0 L0 \5 }5 U9 ? c: V* X data top_1 top_2; ! h: E( J' V7 e9 y u! m: r: n ; Y! q. X: r% }
set &data_name end=last;) P$ g# T6 q9 O0 e( g2 s2 O0 d
6 s% i* o5 q: P* y; s
if last then output top_2; # ~3 r- w6 v. ] o) g8 M1 {- V1 g& H7 ], n S! l) z else output top_1; : l; o/ k, l( F- E6 p2 ^$ F ( _! E- d) w7 x; E- d run;%end;# G$ _$ x# Z$ ~- L; g
, |7 @* F1 n U3 l$ O; V$ b %else %do; 2 H# A0 r- E' q2 ~5 U9 p; P/ V5 i 7 g2 ~3 J- d$ h8 b6 Z data top_1;% Y8 U: J5 h# R; ~, U4 y* g
6 P8 S4 x& Y7 a' w! `5 B6 L! u! p# G
set &data_name; 7 i2 C* j) t0 N2 B# n! q1 v # n% ]9 p7 z+ Z7 v6 f, F: c data top_2;$ b9 o. V* [. k/ U+ t. T/ @2 o, ?" a
6 @* F" {0 |; X6 X3 E9 [5 U
%do i=1 %to &var_num; . Z8 @# D- X3 x$ a* u" _7 Y' x$ x # o0 ?$ @0 Y- T &&var&i=1;; V4 `' n2 j% m% ~3 M b, D
/ y; A1 w. K5 D, O0 y
%end;& E" A4 M/ T5 b6 s0 ~: f# O# M
% K" ~' F J8 w5 `$ ]4 v
run;%end; 6 ?: p* Q' V* R k1 x; p / m W: u$ } K6 J6 ?7 \* D6 J- T data _null_;*样本个数; ' I9 d* ~. A' i! D- i2 h $ Q: E+ w z5 q6 O
set top_1 end=last; ; k u6 M2 }( i1 W3 }: y; H 3 K) U. S8 L0 [# `4 [1 X2 I if last then call symput('obj_num',compress(_n_)); 3 G, T9 f: k# ^9 A/ F9 e4 _$ `; c 6 u) g8 S9 J; c# A. P+ s$ _( Z
%let sqr_str=;) @* y& d/ i" H/ @3 d. _
1 A2 b( q0 x: ~1 V
data top_a; *求各指标值的平方; 9 n) n" H7 i- G7 W / j5 A+ H0 t) c! W* ~ set top_1 end=last; 6 W" a; ]) S" m/ K ! c$ Q. a; A% c$ F
%do i=1 %to &var_num;. f! f8 o1 Y$ \1 s/ C
" g% C' `# x+ o& J: m# _+ b8 u &&var&i.._2=&&var&i ** 2;" ?7 O% H P$ {
0 K8 C& ?; C* o; ^: [( o
%let sqr_str=&sqr_str &&var&i.._2;%end; " ~# y& W. t! J- V" a ( w! H& v1 {* q _3 o
proc transpose data=top_a(keep=&sqr_str)prefix=top_m out=top_b; *对平方值矩阵转置; / z8 W9 `& @# Z! {+ j* P& `, Q( H9 r ' R; d& ^* H& I; J' }* P! {
proc transpose data=top_a(keep=&var_name)prefix=top_n out=top_C; *对原始数据矩阵转置; 6 w6 W4 ^$ `* f" g9 Z5 `) Y ! v& t$ Z2 Z' A7 W: f7 y proc transpose data=top_2(keep=&var_name)prefix=top_w out=top_w; *对权重数据矩阵转置; 7 M! }8 e! Q* L5 V6 W 5 _7 h! _( p1 O2 [ d0 a
data top_d; *求各指标值的平方和;) |- R3 c" I. i( [* T1 g5 ~
q. t4 b w( L# @& { q( l4 z { set top_b; 1 n5 `+ G0 m* _ * p" M+ Z9 q$ a3 ]( O: Q z=sum(of top_m1-top_m&obj_num); ( J- ^6 Q$ n Q$ x& z, [ ) x- _7 @5 m B6 \! [- U% m
%let min_str=;%let max_str=; 1 J6 @! \" M# A) l9 \- w1 T $ y7 s/ t, ^3 {5 Q2 S
data top_e; P) @6 B6 a7 j- K6 t+ J% }( E/ B9 L
{1 n5 D i$ F% b m4 R
merge top_c top_d top_w; 6 q5 s& M0 f; l n
) D X/ V* D$ ]
%do i=1 %to &obj_num; *求归一化矩阵的转置矩阵; - j% E2 K9 Z2 V" v3 X: t7 B # J A0 {! |" [# c; p3 d z&i=top_n&i/sqrt(z);%end; & x9 S" K+ K5 q3 [8 O2 m 7 X: \+ Z) Y% Z7 V1 u" R max=max(of z1-z&obj_num); *求最优方案和最劣方案;, e3 h3 E7 E$ S; D
: y6 |" u9 X$ D: K9 O( R: ?3 z5 M
min=min(of z1-z&obj_num);7 {( P3 i7 a% Q. U H
8 R1 \5 E7 {$ p( `4 p* k
%do i=1 %to &obj_num; / Q: L- c1 L/ G0 x1 G6 P $ P3 c) j' Y: e0 @. M$ E( |$ c d_max&i=top_w1*(z&i-max)**2;: o; m1 |$ V# H0 E- k$ Y9 N" A
0 A2 A" C4 j( x. |2 A2 N8 I d_min&i=top_w1*(z&i-min)**2; 9 ` Z4 T2 J# P& G4 s& U / y' L: M, N* P5 D %let max_str=&max_str d_max&i;" _; W3 _/ g' C2 p
5 }/ `% U! v4 R$ ~
%let min_str=&min_str d_min&i;%end; 3 F# ~! O+ r3 y, N5 x 2 i9 f- K( y% `* _& K proc transpose data=top_e(keep=&max_str) prefix=max out=top_f; 6 j7 C( T( X% [: r ) ]4 {4 Z4 w" O; \$ \ proc transpose data=top_e(keep=&min_str) prefix=min out=top_g;*求各评价对象与最优方案的相对接近程度C,并排序; 2 H3 g E6 U! X9 D ^ & x3 R6 B7 _ k data top_h(keep=&var_keep d_max d_min c);& Y ]$ n" [# [- w& Y/ W7 B5 M
& N+ F/ ^3 } _( p: G# H5 z merge top_1 top_f top_g ; % V2 `- v5 r% x* i : v2 y$ G8 K4 L* K3 y max_sum=sum(of max1-max&var_num);% \" I, `1 k* ]
' t6 F% @' R- f' R! g+ l- y
min_sum=sum(of min1-min&var_num);- n3 B% `7 o" _+ k, O! g
. t) L' Q3 n o7 O; e3 t' S
d_max=sqrt(max_sum); 4 o) R) y2 G" o1 a& S" Q. K7 r* y9 ?
; j7 |/ t1 Z( d4 T d_min=sqrt(min_sum); 9 _- r7 E7 B' p* O! _ ; Y% S7 c4 w% Y$ |( ~ C=d_min/(d_max+d_min);8 c9 h8 }7 _7 l6 @- u1 F# z( m) S
- B7 o9 |2 k( d2 _% p
proc rank data=top_h descending out=topsis_result;5 N/ p: @5 C1 B% f: E: ?* @1 r
L8 F: K# K8 l2 {% I7 K ranks order; . p! D0 ?' q2 i3 Q& O3 w , }% S3 n3 L# U
var c; + h# ?$ |1 }2 O; x D- ~ 2 F* r4 k& k7 o2 s/ Y8 ] proc print;run ; & q d% N# S7 \6 d, S* Z$ H) r6 r3 s# G
%mend topsis; 3 O8 H' n: ]% |- w: V" w& o - n, r- \' z+ J! [# i9 U. D
设数据集名为topsis,地区变量名为city,var_keep为需要打印出的变量,weight为是否进行加权Topsis法运算,默认为0(否)。运行宏程序如下: & `, `! E7 V" S3 L- x1 y! m0 ]; Y: J. _- a" e7 X3 n% e
%topsis(data_name=topsis,var_name=x1 x2 x3 x4 x5 x6 x7 x8,var_keep=city,weight=0);6 X) r/ |. S' K2 n% @
2 p0 d- \& u4 N" M3 o% i- u$ J. u; ^
运行结果如下:+ r# I6 s/ }* s! j9 S
3 o5 k" y9 E5 y: g5 c! A$ P
Obs CITY d_maxd_minCorder1长沙0.186680.161690.4641442苏州0.178900.115590.3925173沈阳0.195440.142200.4211564广州 $ ^ ^9 j( T9 k! u 0.128570.175710.5774625成都0.093750.238970.7182316天津0.205630.164550.4445157上海0.144700.194060.5728637 G' J3 _2 f" |% h8 k
, g1 k6 `( h& e Topsis法对原始数据进行同趋势和归一化处理,从同一指标与最优指标的距离之比计算中体现出同一指标间的接近度,这在一定程度上反映了散程度,排序结果充分利用原始数据信息,能定量反映不同评价单元的优劣程度,直观、可靠。3 {! @9 P$ F$ E( b) ~" S1 o d
5 z3 f% Z, W( a q5 u# N
相对于之前已发表的Topsis法的SAS程序[3,4],本程序的特点是对不同的数据,只需做最少的修改(数据集名称和变量名)即可完成Topsis法的运算。另外,本程序还能进行加权Topsis法的运算。确定权重的常用方法有专家评价法、因子分析法、模糊综合评价的逆估计法、统计计算法等。只需将确定的权重加入到数据集的最后一行,并将参数weight=1即可完成加权Topsis法的评价。( p* T7 J. b( P/ D2 T: G