Topsis法是technique for order preference by similarity to ideal solution的缩写,意为与理想方案相似性的顺序选优技术,是系统工程中有限方案多目标决策分析的一种常用方法,可用于效益评价、卫生决策和卫生事业管理等多个领域[1]。此方法对样本量、指标多少及数据的分布无特殊要求和限制,灵活、方便、实用。但目前几种常用的统计软件包并没有提供现成的计算机程序,而现有已发表的关于Topsis法的SAS程序在应用于不同数据时,需要做较多修改,并且不能进行加权Topsis法的运算。本研究就Topsis法综合分析的SAS程序做了进一步的改进,使之更简单实用,以满足实际工作的需要。 % h$ ]9 w" K f" o) Q. A5 r) O: F5 ^- b
1 原理与方法 : m) |! Q: N% R7 O% f0 G8 [; o% P ! N: }* R- @- n) K! p& O* K 基于归一化后的原始数据矩阵,找出有限方案中的最优方案和最劣方案构成一个空间:待评价的某方案可视为该空间上的一个点,据此可获得该点与最优方案和最劣方案问的距离(常用欧氏距离(Euclidean distance)),从而得出该方案与最优方案的相对接近程度,借此可进行方案优劣的评价[1]。其原理和方法如下:1 J7 j. P2 H% y/ N( P0 _
- D# H- F/ I# w/ M ① 同趋势化:通常采用低优指标转换为高优指标的方式,可采用倒数法和差值法。( n6 S8 S8 R: g* S' ]0 U
7 O ^& e- X# r ② 无量纲化:为了消除计量单位的影响,需要做归一化处理。设(xij)n×m为同趋化后的指标矩阵,aij=xij/ ?ni=1 x2ij,j=1,2,…,m,建立则归一化矩阵(aij)n×m。) c* r" K- f( F8 q5 j3 L( _5 t
, N' O8 f6 @4 A
③ 求有限方案中的最优方案A+和最劣方案A- 。最优方案为:A+=(ai1+ ,ai2+ ,… ,aim+),最劣方案为:A-=(ai1- ,ai2- ,… ,aim-)。 8 C0 G: {" p( b6 Q# Z& P : Z$ T/ Z( e |5 M X6 \ ④ 分别计算诸评价对象各指标值与最优方案及最劣方案的距离,通常采用欧氏距离。4 R7 Y8 [5 h0 j; |. E
2 L A: c( I: p D+i=?mj=1(aij-a+ij)2, D-i=?mj=1(aij-a-ij)2 & g2 T+ I7 l; L8 R" ]' i# P 6 ^* f; c3 Z% b ⑤ 计算诸评价对象与最优方案的相对接近程度Ci。9 \, M8 }' b. f$ B
: G8 W$ m6 I( m, L. y( E
Ci=D-i / (D-i+D+i) 5 F3 }3 K: s/ i w1 G 5 a% l& b. a V8 Y- |6 w) t# v 2 实例分析与SAS宏程序' J1 O! e- k! f: p+ }
9 Q9 t- b% {. H3 y4 \9 W
以中文版SF-36为健康调查问卷,于2004年7月~2004年12月间对≥60岁老年人(602人)进行老年人生存质量(QOL)的研究,问卷包含8个领域的指标,分别为x1(生理机能)、x2(生理职能)、x3(躯体疼痛)、x4(一般健康状况)、x5(精力)、x6(社会功能)、x7(情感职能)、x8(精神健康)[2]。得到数据如下: ; M% h6 I% [' B( E! J 7 x3 z: c, k0 e F 表1 7个地区老年人QOL各领域平均分(略) $ I0 {; g; A. |# m) P. t J, N' X1 M+ F7 J+ t, o. n 以下是宏程序:) k1 I! a$ n9 ^6 x7 s: I. N# R
+ Q( w7 z9 F) Q, S* J% E
%macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); & u, ]: y8 a5 Z( l) @! a
+ C% e& d5 x, j' B& M! D %let i=1; + F! T4 s9 [; i* G( a/ M W4 Q' l9 s( K$ q# B4 F
%let var&i=%scan(&var_name,&i,' '); : ~2 x! G5 \8 G' Y 5 `% e4 I7 H# `6 l, s. S0 ] %do %until (&&var&i=); ) ]8 L2 {; y* x: n$ x# K - X- q, b/ f0 b
%let i=%eval(&i+1);8 R7 l. }1 b8 z% C# W3 D" d$ d0 A
5 E/ a) E, ^; i, M1 @1 y3 Q
%let var&i=%scan(&var_name,&i,' ');2 [' t$ R0 P6 V$ p! ~
2 |- Q8 C3 h- s9 c" j+ b/ ~" \( U
%end; x: ~, L8 U0 H1 P
* r" F/ [6 C1 E$ G Q4 Q, v %let var_num=%eval(&i-1); *自变量个数;. D7 \9 x2 D- o" F, E F7 U. G
: J4 q+ W* ?/ R9 O" t
*top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行; # t8 C$ Z2 V$ b 7 U) F: R3 p2 C7 }' \7 e0 `7 R; f
%if &weight=1 %then %do;' s# X8 i( y% R9 d
4 u5 M- G" z |$ G" q* | data top_1 top_2;! Y6 _5 [" }9 k# [" K$ q
% V- V2 ]# M9 H0 R
set &data_name end=last;, H/ w9 I/ ~# e8 A% B
7 G+ x. x8 F) c$ ? d& L! c if last then output top_2; - [7 c0 P( n# ~; G) U0 \7 x : q. j* p2 H( G2 \9 @ else output top_1; & C' }1 M- h9 u$ X8 h ( N/ n7 Q' o% B+ E6 n
run;%end; # J- c, g2 x7 @. s 8 x) d% ~. `) z. w7 F8 u8 T %else %do; 3 ~* z4 o2 }! X0 Q 6 p# u- e0 k: B& B" K( b data top_1; % i N/ Y" m2 r; k& S( k * y& ?, b- j0 w) n7 b( i+ ? set &data_name;' d; f1 P0 s! r& A0 ?' A& d+ @
# D( w+ f: U7 `0 S2 P
data top_2; & }+ j o9 O, B' ` 8 Q$ G* M) F' i! V5 B %do i=1 %to &var_num;4 d, X' }& R7 A: w/ C4 ?
. p* `6 o! ], b/ X8 t- V &&var&i=1; & O1 Y U* H; X% r$ V. P( @) f# L- t& C 8 |; P* L# T' O+ d6 P %end;9 f5 l! u# U* j9 M- @1 }# A
& c( c! z( ^( h5 F- ^9 R' V run;%end; ; z& K7 d3 W/ }% l% W) F ; `" ]6 H' L* C- Y/ a! N' \( v
data _null_;*样本个数;5 [4 ]! m! o) W! R+ z% u
1 k- d4 q2 M1 y. h' L5 @
set top_1 end=last;1 q4 ? A* i- a5 p; H
7 @+ c% v' l6 H6 E if last then call symput('obj_num',compress(_n_));+ f( ]5 \, f+ `4 p
2 J- r1 {* L. S4 n %let sqr_str=;# H3 T( Z1 @, R" e) R1 M u
$ q. e. z& X- Z, y- H) r9 _ data top_a; *求各指标值的平方;+ L' P* X5 J8 ^
& J, G# t2 ?2 Y$ G' N% I set top_1 end=last;3 O6 K" p; Z9 z/ f0 C* |. T
@" F8 \& h, p
%do i=1 %to &var_num; 8 ^: z2 Y& C4 S! Q $ |2 G) _5 j! g2 r, y &&var&i.._2=&&var&i ** 2; 3 y- b, D# ?% P9 l) L: _ : G9 Y3 t, M5 f %let sqr_str=&sqr_str &&var&i.._2;%end; ! F7 n; w. A+ t& I2 w * o& l+ I1 P" f. v/ K, m4 W, J proc transpose data=top_a(keep=&sqr_str)prefix=top_m out=top_b; *对平方值矩阵转置; & i+ u' l0 d) m1 g# k' \4 M: x 0 j2 i2 n% q: d+ g# U( ~3 } i' o
proc transpose data=top_a(keep=&var_name)prefix=top_n out=top_C; *对原始数据矩阵转置;1 Q, h J l- v
* r& |- T' o0 h% B: S d proc transpose data=top_2(keep=&var_name)prefix=top_w out=top_w; *对权重数据矩阵转置; 7 o1 t! Q7 Z* O4 m( ^9 Z, l N: { / ~1 `! n( A! Q7 T" R& [ data top_d; *求各指标值的平方和;/ c. n. P% A( W7 Q* w! a9 l' B
; Z/ I$ B t) B* K$ K set top_b;) ?" O/ u+ K. c: C9 f
0 H, U* Q# d% E- { z=sum(of top_m1-top_m&obj_num); / F* z+ d/ Q3 L9 G. ^$ l* ]: M ' u G5 Y1 j' Z- p, _! v1 u
%let min_str=;%let max_str=;) u# O; j m# A) J" y6 M( z
8 W( [3 k) w1 e" @0 ^1 z, D
data top_e; 2 G0 k) e4 j# O' _ O $ @8 K" F2 u0 ^3 p" I# Z7 Y merge top_c top_d top_w; + u: y3 X4 i9 f3 q, l
~( z T4 }0 ]7 f; Q' p
%do i=1 %to &obj_num; *求归一化矩阵的转置矩阵;) R! [- J# X# [2 B3 K. A
5 Q7 \5 U( A, j" g
z&i=top_n&i/sqrt(z);%end; 0 k. {2 D! W4 g, v, _+ T - w! P# L& i; W4 Y$ b max=max(of z1-z&obj_num); *求最优方案和最劣方案;6 K/ r- C X Y. y1 L
6 |: e2 t3 R2 O( _' v min=min(of z1-z&obj_num); . \; h! d7 A) E' @0 B6 { 2 \' t3 g1 p1 ^
%do i=1 %to &obj_num; 2 f' W4 ]) v4 ]0 ] 1 H9 n7 v4 B. J d_max&i=top_w1*(z&i-max)**2;# ?2 k4 t7 ]2 Y0 _6 L
7 s3 d0 i7 n: D5 Y4 l. x d_min&i=top_w1*(z&i-min)**2;( S( E7 ?9 i9 X: r5 m" ]
# u4 v/ J# N9 I* N7 N/ _2 I
%let max_str=&max_str d_max&i; 9 N% G& B' ^ g+ r( X" W ( o( m) b# J& c& J) } %let min_str=&min_str d_min&i;%end;" q" T0 F: a2 C) A% _1 z
4 i: f1 B: f& B' T5 u/ h proc transpose data=top_e(keep=&max_str) prefix=max out=top_f; 8 ]4 d+ ]" [$ t' W 0 i' Y9 ~: @: S
proc transpose data=top_e(keep=&min_str) prefix=min out=top_g;*求各评价对象与最优方案的相对接近程度C,并排序; 9 y, y! N% q9 e! X 3 G. ~, e& E8 ~3 D3 q' Z% O data top_h(keep=&var_keep d_max d_min c);2 D; Z5 K4 z& e% z8 n
. }! H4 y1 r u% `* M# q merge top_1 top_f top_g ; * B1 D. Q, K( l: W A+ q- D' N / p8 e% S6 l# B
max_sum=sum(of max1-max&var_num); + I! I1 _ F$ G- `! I m |% k2 n' g$ r6 | 1 M0 c+ Y2 v" V8 G; f4 Y- k1 F# Q
min_sum=sum(of min1-min&var_num); + M' e! @6 m( @/ {! \6 s8 g 6 N# \; d6 S0 p9 b& Q. R4 \ d_max=sqrt(max_sum); , V$ e5 ]% j6 L' f2 X 6 i+ O: u, N( h' \0 e d_min=sqrt(min_sum); F3 C( p0 r. }7 c, V. H
' ^7 ]! _" M, E) p" J
C=d_min/(d_max+d_min);* o* ?/ O- z$ ~1 I. J* H8 Q1 `/ A8 i
$ f$ D e6 {/ ^7 }3 v
proc rank data=top_h descending out=topsis_result; 6 Y( }# I5 p% r r5 t% U $ i" n" u t6 @, t( v& \
ranks order; 9 X1 y" J7 u( g1 t* K7 E( r/ ` 7 j8 \2 t4 Q7 _9 F' n8 {& ?5 t
var c;7 g' e1 s" s5 e
: o, T) t( c8 s1 D& O
proc print;run ;' `& ^/ p/ B, Q' n
8 I# @8 x1 o8 _2 F4 L; M7 B %mend topsis;. b# V d; z0 F( q f2 ?/ K