- ^$ y% r/ i3 ~ set top_1 end=last; ) d! f7 q% v$ a9 ? * p" H$ J) C V: G' B8 o6 y %do i=1 %to &var_num;7 I: x# ]5 W* i3 b4 p6 V }6 I
- m4 V4 {% P8 f# G0 M
&&var&i.._2=&&var&i ** 2; ! M4 @# R+ S% O/ ? ; f5 m8 i ]) p; L
%let sqr_str=&sqr_str &&var&i.._2;%end;' S0 m ^; X& `5 i6 w9 w+ }
% u' w, \/ W6 q8 F+ ]) D
proc transpose data=top_a(keep=&sqr_str)prefix=top_m out=top_b; *对平方值矩阵转置;* X; l5 m3 d- h- M2 }* ^/ H
7 g. x: g' N. V) R( [/ F) y proc transpose data=top_a(keep=&var_name)prefix=top_n out=top_C; *对原始数据矩阵转置;7 h5 X; s- X( y3 q/ X7 F
k6 K0 J4 h0 [- b6 Q, L proc transpose data=top_2(keep=&var_name)prefix=top_w out=top_w; *对权重数据矩阵转置;- i* i4 D* `) M" t7 u( D1 V3 A
9 v3 Q* a5 ^# J, p
data top_d; *求各指标值的平方和;7 ]7 e7 l* K' o6 y7 Q
8 Q/ y5 l# P) w2 ^1 c Z
set top_b; ( N% D6 S" d9 o j7 A: c) w ; v# }! F' g7 w- q z=sum(of top_m1-top_m&obj_num);0 m0 C' w& G2 v) U2 ]1 n
8 i. k6 }- V8 U8 P; A8 m. ^ %let min_str=;%let max_str=;+ W# P5 S b; l
/ x& F% s) E4 P" n/ {( [ data top_e; ' @0 ], p. r" d% V: c ' B) S( U6 Z' }
merge top_c top_d top_w; ' {! D& `# Q( h+ f + p" |; l) k: M- w
%do i=1 %to &obj_num; *求归一化矩阵的转置矩阵; ) ]& @8 s% w' X2 G: V+ F% z 6 c( u% Z& x1 Q3 S" l0 E
z&i=top_n&i/sqrt(z);%end; 8 v* z; V" T2 W7 h$ L5 [( M- L: ? ) T0 g, w4 z& E$ X. b6 _ max=max(of z1-z&obj_num); *求最优方案和最劣方案; & S( j. {, ?* F$ l % _" \! O& B+ u min=min(of z1-z&obj_num);+ Q9 d O4 C. x
4 f+ U6 Q+ ~ Q3 U %do i=1 %to &obj_num; ; Z+ @8 M5 I8 g3 `: }* s. W . Z5 M% O) u0 @7 [" q% O d_max&i=top_w1*(z&i-max)**2;( t' J! n1 E. N$ k& C% s" O" W
9 ~% c# O7 w) K0 ?/ Y: | d_min&i=top_w1*(z&i-min)**2;5 j( t3 s; e2 \! j% P
8 a& D1 b2 _$ O; v4 J6 u %let max_str=&max_str d_max&i;) Y: y8 Y) ]& N+ w0 v
+ P( v8 U' H2 g. E- ?4 e; v
%let min_str=&min_str d_min&i;%end;7 g- X v7 p6 f9 l3 h& g5 `' Z, }
6 b! i8 {% Y2 Z8 D% e; r, L
proc transpose data=top_e(keep=&max_str) prefix=max out=top_f; 1 i+ f) m. V$ f* Q% @ ! n1 K/ O* u/ o9 C proc transpose data=top_e(keep=&min_str) prefix=min out=top_g;*求各评价对象与最优方案的相对接近程度C,并排序; 4 K# k e2 Q; a8 A0 V3 B7 j$ X * z/ a* e- _& O8 H data top_h(keep=&var_keep d_max d_min c); ) d3 \+ X4 r) c& F/ N ; P& D& u. u: U1 E
merge top_1 top_f top_g ;( ?- E0 Q1 L' Z. o& f
" Q* ~% v% j( o2 h, O% }+ e" g
max_sum=sum(of max1-max&var_num); ( _( {9 [8 q# L9 b# Q. A / e1 I I* S/ U7 W2 J
min_sum=sum(of min1-min&var_num); . C8 K, f& R3 O5 J3 v0 L$ O ' F" W! _% Q) R% K d_max=sqrt(max_sum); * `8 E8 n, `( j+ E
) M6 ?+ E- f( m E
d_min=sqrt(min_sum); ( X, m {& A9 I6 M% l1 p+ ? - E A* ?9 Y$ }! w C=d_min/(d_max+d_min);2 n- p1 W3 S" x1 U7 M9 z# S6 r
4 L5 t+ ]( r2 l% |5 w/ S8 o! T. d. J: |9 X
proc rank data=top_h descending out=topsis_result; " O5 j& t" d3 ?6 D: Z8 A+ O* R p+ [) a3 _4 y# K
ranks order;+ l5 b/ @5 {: d) j8 j9 x
* ~4 @$ F, Q1 q- o0 Y
var c; + ~! d. i% R" h* E4 } & o F( N9 X6 ?( F+ y5 j
proc print;run ; " D5 Z5 H0 Y$ I* [% Q/ ` % \/ d6 [/ ^1 ?5 F/ H %mend topsis;8 K0 U, i) {1 W/ @" Q1 d7 O1 ?
7 M* p) m" R* S: G6 v$ p; L
设数据集名为topsis,地区变量名为city,var_keep为需要打印出的变量,weight为是否进行加权Topsis法运算,默认为0(否)。运行宏程序如下:! O& { g0 }& u7 _
7 t" N% T( `, C" u0 Q \7 f 3 讨论 # A- c% F# a, P w: f" t# ^( G) k @7 p h" F4 U2 p2 q% i Topsis法对原始数据进行同趋势和归一化处理,从同一指标与最优指标的距离之比计算中体现出同一指标间的接近度,这在一定程度上反映了散程度,排序结果充分利用原始数据信息,能定量反映不同评价单元的优劣程度,直观、可靠。6 y7 A8 R4 u: x4 u7 x* o* U
6 [0 q N0 ~1 r m
相对于之前已发表的Topsis法的SAS程序[3,4],本程序的特点是对不同的数据,只需做最少的修改(数据集名称和变量名)即可完成Topsis法的运算。另外,本程序还能进行加权Topsis法的运算。确定权重的常用方法有专家评价法、因子分析法、模糊综合评价的逆估计法、统计计算法等。只需将确定的权重加入到数据集的最后一行,并将参数weight=1即可完成加权Topsis法的评价。- F. _$ R. O3 F2 c2 c) p0 h