标题: [算法] Topsis综合分析方法(SAS) [打印本页] 作者: 挚爱/Sunsgne° 时间: 2013-8-16 16:56 标题: [算法] Topsis综合分析方法(SAS) Topsis法是technique for order preference by similarity to ideal solution的缩写,意为与理想方案相似性的顺序选优技术,是系统工程中有限方案多目标决策分析的一种常用方法,可用于效益评价、卫生决策和卫生事业管理等多个领域[1]。此方法对样本量、指标多少及数据的分布无特殊要求和限制,灵活、方便、实用。但目前几种常用的统计软件包并没有提供现成的计算机程序,而现有已发表的关于Topsis法的SAS程序在应用于不同数据时,需要做较多修改,并且不能进行加权Topsis法的运算。本研究就Topsis法综合分析的SAS程序做了进一步的改进,使之更简单实用,以满足实际工作的需要。' x8 ]- r$ A, Z; u7 D
0 t* a+ F5 Z" ~) S" [ 1 原理与方法; j9 L( u5 w1 s* v* A* r
4 h& M7 [5 G/ I, E( E
基于归一化后的原始数据矩阵,找出有限方案中的最优方案和最劣方案构成一个空间:待评价的某方案可视为该空间上的一个点,据此可获得该点与最优方案和最劣方案问的距离(常用欧氏距离(Euclidean distance)),从而得出该方案与最优方案的相对接近程度,借此可进行方案优劣的评价[1]。其原理和方法如下:6 @9 k' E8 }) i3 l: @) e# L$ Q
2 }% R- L4 K& [- K$ V6 i
① 同趋势化:通常采用低优指标转换为高优指标的方式,可采用倒数法和差值法。 - |7 }( a0 l f4 W 2 @$ q' M; t# V% S, t3 `
② 无量纲化:为了消除计量单位的影响,需要做归一化处理。设(xij)n×m为同趋化后的指标矩阵,aij=xij/ ?ni=1 x2ij,j=1,2,…,m,建立则归一化矩阵(aij)n×m。2 [" g. A, I# _5 c) f' q# ?
# E( {! G- W2 q2 N$ T- J, U3 ^/ x! O ③ 求有限方案中的最优方案A+和最劣方案A- 。最优方案为:A+=(ai1+ ,ai2+ ,… ,aim+),最劣方案为:A-=(ai1- ,ai2- ,… ,aim-)。2 {# l, K; i( ]5 r* ^
: F4 _8 b2 v4 J+ d* m! M
④ 分别计算诸评价对象各指标值与最优方案及最劣方案的距离,通常采用欧氏距离。 0 l* n' p. r3 r" v1 z' u5 _. I 7 C8 E' r0 j, g; m8 W- D
D+i=?mj=1(aij-a+ij)2, D-i=?mj=1(aij-a-ij)2 5 i, X6 q5 F. F3 O' Y % L: _- b& `& C4 E7 X, z7 f Z( M4 C$ @ ⑤ 计算诸评价对象与最优方案的相对接近程度Ci。 0 S9 F: m* c- x6 v$ S % h' n' \$ p9 M7 V* _ Ci=D-i / (D-i+D+i) 0 V8 h3 K; W: x- {) [# v: p2 s 2 a" U: m. a# @' x% [ 2 实例分析与SAS宏程序. ?) B: ]4 j, |7 S- A o
( h& Y7 v" h% @4 @# X' f D
以中文版SF-36为健康调查问卷,于2004年7月~2004年12月间对≥60岁老年人(602人)进行老年人生存质量(QOL)的研究,问卷包含8个领域的指标,分别为x1(生理机能)、x2(生理职能)、x3(躯体疼痛)、x4(一般健康状况)、x5(精力)、x6(社会功能)、x7(情感职能)、x8(精神健康)[2]。得到数据如下: * {: p" I3 b; u, } 5 |0 k6 ~) {5 m% D5 z. d 表1 7个地区老年人QOL各领域平均分(略) . Z+ V+ y3 \" Q: {, {) X% h; V1 P5 Q' _0 V: @, f
以下是宏程序: ) \' `- A$ n& Z0 r0 Z( ?6 R& [) Q }- C, r" }* f
%macro topsis(data_name=,var_name=,var_keep=&var_name,weight=0); 0 M1 m2 D4 S: A 9 L' Z5 h, n- M* T4 k" c9 U %let i=1; , ~7 T+ q8 i6 a% h M
+ e* c" @0 o& O5 J' W0 |& Q %let var&i=%scan(&var_name,&i,' '); o( {2 @1 {! ?# _1 p : w/ ] c' o& g' D$ P( b7 G
%do %until (&&var&i=); . |" ]0 k! f/ }4 s ; W' @/ @9 G. A% y) v; S! U6 `6 D
%let i=%eval(&i+1);8 l, ]" Z" N2 x& [
8 \! t- M6 G; q2 m" Y9 d %let var&i=%scan(&var_name,&i,' ');; c; o! o* c) `7 }" \+ O
3 x# @- ^6 @1 Q0 F+ e, A3 r
%end;9 N5 n7 }4 ?- w7 A/ n7 |
' A) d9 d' `# n7 t5 t2 e %let var_num=%eval(&i-1); *自变量个数;9 {- a! C. t% f+ b7 i
& f$ E+ X& Z2 [" J4 A% @; F *top_1为原始数据,top_2为权重数据。必须把权重数据放在最后一行; 1 g; {; }1 i/ p- F8 @6 P 9 K5 d( L* q4 J3 k
%if &weight=1 %then %do;* Y/ q/ o' w5 ?1 Z% R1 g
, I/ p* N* N5 h- J, _, v" x5 W
data top_1 top_2;# X C- R3 s6 J; w, q' B' ]1 o
0 o! E, S$ O+ J set &data_name end=last;" {1 }' T& z, G
" N& a1 C1 L0 @7 M6 B( _* Q if last then output top_2;( @& k3 b" G9 J- N$ F3 K- Y
% Q, Z5 `# J( v0 _& g else output top_1; m2 U+ w, j3 M8 E( q/ x
" R6 G3 |2 J+ Y5 d3 V run;%end; 9 ~+ m$ w$ w. V" C% X G - E$ |# t4 ?) O# D8 ~' e- k' v: [ %else %do; 7 ^6 x; a' }6 c' r; J- \' [ : T2 Y* y- @6 ^) Q
data top_1;5 p* f! z* \; _9 c0 N/ k' G* c
' m. }) D5 }5 K# t) s set &data_name; ) P; R. s* y1 G . d: S# u& e% ^
data top_2; ! T1 ?) [5 D H% D! b& C* q % W* F6 G3 w+ s0 _/ T# ^+ b
%do i=1 %to &var_num;* n: |7 t) b2 |, q6 u4 y
6 O, q0 _( y! T9 s
&&var&i=1; + n7 E2 P& N" G [ ; F$ H" n. I" U, \5 c/ O
%end;, z$ [. S( ?' Z6 p: c
. Z8 V i" U+ O
run;%end;+ ~) f' b- l D1 m& c
! [3 K$ q8 d0 x7 ^; f3 I
data _null_;*样本个数; 4 n6 q x$ Z$ L / G Q4 N% i m3 `/ G- S( S
set top_1 end=last; ; l" {7 q& R/ }9 O3 O4 U 6 g' U; f% C# U3 C0 c
if last then call symput('obj_num',compress(_n_));% ~" M; B' n Y' V' ^1 W4 I
! q2 k$ T; o, n %let sqr_str=; : K8 [$ L6 C: r! o+ b ) ^4 g6 H8 e' k3 ]# f
data top_a; *求各指标值的平方; - l7 c \. {+ _$ n3 r $ l, {2 [$ W8 @! J
set top_1 end=last;) j0 E5 @3 |" B- M4 o+ Q
: t' t2 C( x! \; B! k, k
%do i=1 %to &var_num;9 Q+ x4 c; a5 q