公卫人

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4267|回复: 4

[分享] 自动生成标准的统计表格(配合ODS)的macro

[复制链接]
job 发表于 2008-12-26 12:37:14 | 显示全部楼层 |阅读模式

注册后推荐绑定QQ,之后方才可以使用下方的“用QQ帐号登录”。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
wmqy2004@acrp
" P0 k$ B5 b  A4 T
5 o, j3 k$ ?9 {$ s& H/ Q; b- C+ Q& o程序在sas9.13中运行通过。0 \" J$ F6 P- D& v/ ]

3 `7 |% T& h1 h/ E$ u%macro comdts(j,k,dataname);
# n+ }9 o+ ?& K" m: y %do i=&j %to &k; : P: s) C/ q( B6 C  n+ O3 F
&dataname&i
' @, t: e* q" K! c8 y# s# B %end; / J( X5 G: V+ N* a' {9 o7 k* k/ y
%mend comdts;
$ N6 t- y( ^  }* l) d# L3 ~: q, S( Q! P# o6 n
%macro comparison(data=,vars=,vg1=,vg2=,vg3=,vg4=,class=,par=1,format=6.1,total=1,where=);+ ~0 f7 o( q' L8 x: l5 g- G4 u$ {
/*扫描宏参数中包含的应变量名称,并将其赋值给一系列宏变量*/
9 V2 H, M' R1 O3 g/ Q% ^4 L/ i" fods select none;6 j4 y/ [* [( ~& e+ b
%let i=1;$ V, t7 I3 I! R. X' H' l% j0 X
%do %while(%scan(&vars,&i) ne );%let var&i=%scan(&vars,&i);%let i=%eval(&i+1);%end;
+ }( ]" ?( d5 P7 |2 m2 q/*获取应变量个数*/2 B) k% C7 {; W9 n
%let vnum=%eval(&i-1);% |: ~; [8 c/ ^/ C/ K
/*获取指定分组变量的水平数*/6 w5 j0 v# Q4 }1 }) @& r5 v
proc freq data=&data;tables &class/out=freout;run;* x/ M* l" B* `' q9 z
data _null_;set freout end=last;if last then call symput('lvnum',compress(_n_));# @% v& c% A5 }9 s0 [3 ?7 I
run;
0 @+ x% B: w/ k/*分组变量水平数小于2时给出警告信息,并跳出宏运行进程*/) k( O8 G4 H* E" t) q
%if &lvnum<2 %then %do;1 ]1 ?; B$ n1 J8 I# Y% t
%put Warning: Level number of class variable is less than 2.;" G4 y' Y$ U+ `# i5 n
%goto exitmacro;% V, S9 Q/ |3 {
%end;
8 M* g( A( ^# T8 j' _
1 d& e) A) y/ w% T6 W, i" w/*数据描述*/
* W; k$ [9 t2 H: \  q%do i=1 %to &vnum;
! s5 i# ^* }6 |; O        proc means data=&data n nmiss mean std min max lclm uclm median maxdec=2;
0 g% }' O+ x6 k" G4 X7 p: q# {            output out=tmpmean&i n=n nmiss=nmiss mean=mean std=std min=min max=max lclm=lclm uclm=uclm median=median;class &class;%if &where ne %then %do;where &where;%end;
5 _2 M3 s% ?3 A. J$ O% [# K* K            var &&var&i;7 T' V- w4 O  m
        run;* X5 }" s4 M! I. f

% \  M9 p4 T( C        data tmpmean&i;set tmpmean&i;
# K- \' n& f6 c( F, g            nnmiss=compress(put(n,6.0)||"("||left(put(nmiss,6.0))||")");$ p# v; D3 n( ^2 F
            ms=put(mean,&format)||"+"||left(put(std,&format));
& T. B8 P3 s! M, [            minax=put(min,&format)||"~"||left(put(max,&format));6 ?9 J/ [- w5 ?& l* z6 G
            luclm=put(lclm,&format)||"~"||left(put(uclm,&format));( K$ {' n; ?0 T4 x; K
            med=put(median,&format);  z# B- L$ Z/ x( Y- U
        run;
* ?% M' a/ u1 }4 ^3 S) l( _4 |5 B( F$ k
    %if &lvnum=2 %then %do;
( e0 v2 b) a8 T7 X. k$ }8 `/ o$ c# I9 {0 K. O7 i) b  x  R+ [
    /* t-test */;
6 l; Q5 _. n0 [( Z/ p; c* X9 ^, D( N        %if &par=1 %then %do;4 M0 D8 L: t& r7 |! _; Q, c* n
            ods output ttests=ttests equality=equality;
' x. o- `, i' r            proc ttest data=&data;var &&var&i;class &class;: |; j: p4 _; {
                %if &where ne %then %do;where &where;%end;
- M& C; H' F4 x: J, t9 j) j            data test2;merge ttests equality;by variable;% D$ E0 C2 n3 U. J/ l
            data test21;set test2;where probf>0.05 and variances=&#39;Equal&#39;;length stat $ 5; stat="";; [8 X# K( @' J/ m; S
            data test22;set test2;where probf<0.05 and variances=&#39;Unequal&#39;;length stat $ 5;stat="*";
2 }/ p8 A  _+ i4 C4 `            data test(keep=variable pvalue);merge test21 test22;) L0 C) [( d* R" l# N0 l! i" o
            length variable $10.;variable="&&var&i.";
3 p3 z% G, H7 [, ]' i/ O                pvalue=left(put(probt,6.3))||stat;, A1 w2 j7 I) u- X3 p6 J6 u. `) F
            run;6 G: j* F  i+ ?
        %end;
! Y. ?- o" [* ~" i( W  n    /*秩和检验*/;
+ m  P  H8 ^# ~        %if &par^=1 %then %do;& D. |1 n! z4 J" d  @. [/ Z
            proc npar1way wilcoxon data=&data;3 P" Q; S( c: D5 ]9 p9 Q
            %if &where ne %then %do;where &where;%end;
. Z& x) i; l& v+ ~+ n            ods output kruskalwallistest=tmp1;var &&var&i;class &class;run;" f% {. d; F+ o  J
            data test(keep=variable pvalue);set tmp1(rename=nvalue1=p);
; C1 c% ^: a' _3 b+ K" n6 U* |            where label1=&#39;Pr > Chi-Square&#39;;methods=&#39;**&#39;;
& L' m9 _9 n3 P            pvalue=left(put(p,6.3))||methods;length variable $10.;variable="&&var&i.";run;
: w8 z& E! @  C0 W        %end;+ M5 M# q. I( u3 T! h3 r
/*描述数据*/;" o7 U! G; d* B& s# m/ Z
/*给出两组之合计值*/;1 p4 R+ J/ Z1 G" y; W6 S6 d
        %if &total=1 %then %do;
0 C; G  e  C2 ^# ?) L" l  p            proc iml;reset noname linesize=100;
6 ~6 @- e; z0 e* C: a. A- w            use tmpmean&i;setin tmpmean&i;! `+ P( @5 }# K; {; T2 b
            read all var {nnmiss ms minax luclm med} where(&class=&vg1) into nn1;* @( g6 {9 v: {2 s5 O6 E
            read all var {nnmiss ms minax luclm med} where(&class=&vg2) into nn2;" s* x: F8 V+ C; b# j
            read all var {nnmiss ms minax luclm med} where(&class=.) into nn;0 H9 K5 D: D( Y# ~- r
            nn11=nn1`;nn12=nn2`;nnt=nn`;0 c9 u2 o- w8 r* ~3 D* t
            aaa=nn11||nn12||nnt;bbb={"N(miss)","Mean+SD","Min~Max","95% CI(L~U)","Median"};2 P+ r: C+ c+ V  P5 I' F
            ab=bbb||aaa;create mydata&i from ab;append from ab;quit;0 i4 n, \- j  ~% U: u$ B
        %end;
; N& G9 S+ F" Q$ |8 i    data mydata1&i;merge test mydata&i;run;) N; ?" }$ B( N
    data mydata1&i;retain variable col1 col2 col3 col4 pvalue;set mydata1&i;" g# E- C0 K9 m7 f9 J9 w
    run;
# N- k7 v  H' M6 b/*不给出两组之合计值*/;
1 E2 N# b1 h1 x8 Y
! P2 e  f  @0 m$ j# h- i        %if &total^=1 %then %do;8 \9 U% C. E. a2 o1 x, Y+ q6 s
            proc iml;reset noname linesize=100;
- O1 p& T! R. N0 e            use tmpmean&i;setin tmpmean&i;* q) X/ z# p4 q8 z. p
            read all var {nnmiss ms minax luclm med} where(&class=&vg1) into nn1;. r6 ]/ R+ j1 q  v# s
            read all var {nnmiss ms minax luclm med} where(&class=&vg2) into nn2;% ]* p  @8 s' M
            nn11=nn1`;nn12=nn2`;
! N6 `# F# D9 Q0 b            aaa=nn11||nn12;bbb={"N(miss)","Mean+SD","Min~Max","95% CI(L~U)","Median"};; h3 W0 U9 w* }' j3 G
            ab=bbb||aaa;create mydata&i from ab;append from ab;quit;- q1 N9 ~7 h$ u3 ^+ y5 j) T, A8 Z
        %end;
9 r9 B4 E7 _7 s6 I1 K+ Y    data mydata1&i;merge test mydata&i;run;" l! S6 s# J& C! F
    data mydata1&i;retain variable col1 col2 col3 pvalue;set mydata1&i;# J$ ~/ R, y2 q1 z; B8 \$ |
    run;
- V3 S4 q2 G; C- q! P1 J* `    %end;7 e; n# q+ M" D5 q! k% O$ P& `

" Z% Y( u" z" V. Q3 U% c    %if &lvnum>2 %then %do;/ H$ L) o0 L/ ]5 }

5 l/ D( h& a2 R/* ANOVA test */;2 y" @/ }; k, W" s% E/ |
        %if &par=1 %then %do;
. z- e) q7 X  R% b# ?8 P& E            proc glm data=&data;class &class;model &&var&i=&class;) `# ]& K; t0 j+ j- c4 Y
                ods output overallanova=tmpanova diff=tmpf(rename=(_1=t12 _2=t13 _3=t23 p1=p12 p2=p13 p3=p23));% t* F4 F! ?, ^* I- U+ Q2 d
                lsmeans &class/tdiff pdiff;%if &where ne %then %do;where &where;%end;1 N' }) B9 C3 v# v( F
            run;8 x, }' [. I! J0 Q

( w' L: U: X) t# C  R* h# \  b            data t12(keep=pvalue);set tmpf;if _n_=1;rename t13=t1;1 {. o3 v. y0 g+ `* Z1 p
                p1=left(put(p13,6.3));pvalue=p1||&#39;*&#39;;*Group1:group2;
4 d. m8 R2 a& @0 C8 m8 r! e' U            run;  o5 g. m  O/ J1 d
            data t13(keep=pvalue);set tmpf;if _n_=1;rename t23=t2;8 W( z% W; |% J) y$ G
                p2=left(put(p23,6.3));pvalue=p2||&#39;**&#39;;*Group1:Group3;( K$ U2 c+ r; v/ [. J& _
            run;- M9 {  L& {; ]7 ~+ b5 n4 ?  T
            data t23(keep=pvalue);set tmpf;if _n_=2;rename t23=t3;
8 j+ B0 B* s+ Q/ ~                p3=left(put(p23,6.3));pvalue=p3||&#39;***&#39;;*Group2:Group3;( E. C; u5 M: G8 p5 q$ n4 V
            run;$ g3 j3 e3 y/ y+ l& m5 Z3 V
            data tmpanova(keep=variable pvalue);set tmpanova;if _n_=1;3 V2 i% ]  K# Y
            length variable $10.;variable="&&var&i.";length pvalue $10.;
6 A/ `7 e5 x& I" o$ S                pvalue=left(put(probf,6.3));run;
5 N0 Z- z9 b( \+ Y2 L            data test;set tmpanova t12 t13 t23;run;
& |4 e" A3 b. w  p+ E7 P8 i        %end;$ ]: `4 s- }, w* I* F8 m
7 L' A. u7 W' g; _
/*秩和检验*/;" M( A1 a$ F. f
        %if &par^=1 %then %do;
1 U- m6 h, h$ `1 k0 Q! M            proc npar1way wilcoxon data=&data;%if &where ne %then %do;where &where;%end;
1 S! c: l2 C0 u7 X9 a; k            ods output kruskalwallistest=tmp1;var &&var&i;class &class;run;, w9 B) {! m' ?4 h( ]! R; X
0 M5 u8 I( E" Q4 J
            data test(keep=variable pvalue);set tmp1(rename=nvalue1=p);1 r" _2 f) Q' w& W7 Q
            where label1=&#39;Pr > Chi-Square&#39;;methods=&#39;**&#39;;
7 y6 c* f6 T0 O$ `6 I0 D            pvalue=left(put(p,6.3))||methods;length variable $10.;variable="&&var&i.";run;: T0 w( T8 X! m* c* B$ E
        %end;6 `- m+ f1 c& |( x8 h; B
' Z% C- Z2 q" ?) W# |- f7 O
/*描述数据*/;( _+ W8 N$ H& s# d* ~& ~! A4 W" f& [
/*给出三组的合计值*/;& U8 T! D! s* e; f2 Q
        %if &total=1 %then %do;
1 z# l: [. L/ f/ q            proc iml;reset noname linesize=100;* h' Z; K8 e1 w/ b; A$ ^6 }9 o5 N3 v; V
            use tmpmean&i;setin tmpmean&i;/ u8 G1 _9 w+ z8 O
            read all var {nnmiss ms minax luclm med} where(&class=&vg1) into nn1;5 S3 V# }( T6 d3 n9 k, D
            read all var {nnmiss ms minax luclm med} where(&class=&vg2) into nn2;. e& t( b5 M3 ?
            read all var {nnmiss ms minax luclm med} where(&class=&vg3) into nn3;
3 M0 X3 c2 _, |5 e# r- y5 X) m            read all var {nnmiss ms minax luclm med} where(&class=.) into nn;+ T  f3 }$ W5 }6 I" c0 ?
            nn11=nn1`;nn12=nn2`;nn13=nn3`;nnt=nn`;
" b6 f/ ^! p1 {5 \, R! [            aaa=nn11||nn12||nn13||nnt;bbb={"N(miss)","Mean+SD","Min~Max","95% CI(L~U)","Median"};
4 E0 T2 {6 F" T% V) A; i            ab=bbb||aaa;create mydata&i from ab;append from ab;quit;
9 Q5 q2 e6 A% w        %end;
; k" @" t! D' I- @8 E' y    data mydata1&i;merge test mydata&i;run;- v( _: O# M7 v* X7 Z: E* U1 P
    data mydata1&i;retain variable col1 col2 col3 col4 col5 pvalue;set mydata1&i;; z8 w8 H2 j2 _8 X: L7 z7 N% g" J
    run;" r0 O( H3 T& a* b* ]3 C8 ^
8 S, K1 P; [1 }* ]$ R3 r
/*不给三组的合计值*/;
  D2 _3 q+ g+ @& `        %if &total^=1 %then %do;6 N$ A3 i9 |" k% t  ?6 E6 R
            proc iml;reset noname linesize=100;* \8 F+ \6 T. L. C% K( p! g- M
            use tmpmean&i;setin tmpmean&i;
$ |- H/ J0 O3 K7 H  S            read all var {nnmiss ms minax luclm med} where(&class=&vg1) into nn1;  D- J  h1 N3 S7 K9 a8 n
            read all var {nnmiss ms minax luclm med} where(&class=&vg2) into nn2;
1 Z$ a  u7 k! J- ]            read all var {nnmiss ms minax luclm med} where(&class=&vg3) into nn3;
9 p0 G1 O1 j; g" M/ Q+ j            nn11=nn1`;nn12=nn2`;nn13=nn3`;$ e3 F8 D- b+ i5 T# }- ]
            aaa=nn11||nn12||nn13;bbb={"N(miss)","Mean+SD","Min~Max","95% CI(L~U)","Median"};0 z5 I, f- Z0 d
            ab=bbb||aaa;create mydata&i from ab;append from ab;quit;
5 Z! f9 o5 ?& _: ~3 [* z        %end;9 }* ^6 P' ^4 ~2 R( q) E
. d. b/ v$ t. S$ ~' R2 b
    data mydata1&i;merge test mydata&i;run;
: z  R& e/ z0 ^) J& y# j& g    data mydata1&i;retain variable col1 col2 col3 col4 pvalue;set mydata1&i;& D2 l9 }/ a" S: N( B
    run;    2 E/ u7 {" u8 Q' ^; u
%end;%end;6 I) _" i+ ^( L$ _
data mydata;set %comdts(1,&vnum,mydata1);
* r1 s  A; x1 Y' t4 I3 @2 Sods select all;
1 }+ b5 R' t! h5 k4 O/ yproc print data=mydata noobs;run;
( t" G* i7 m- L) ]) m%exitmacro:( i5 |  d6 s/ b  v# G% S% J
%mend comparison;
5 L+ {) a$ g$ v! Z7 e*应用举例:%comparison(data=aaa,vars=height weight age hcy1 sbp1 dbp1 sbp2 dbp2 sbp4 dbp4
- \9 G3 Y6 j1 w1 Q,vg1=1,vg2=2,class=sex,par=1,format=6.1,total=1);
* k, g5 E; c% F" i+ q( M*%comparison(data=aaa,vars=age hcy1 hcy4 hcy8 sbp1 dbp1 sbp2 dbp2 weight height,vg1=1,vg2=2,
+ h% A' I5 L. i/ vvg3=3(分组变量的值),class=group,par=1(参数检验),format=6.1,total=1(有合计值));
lhenghui 发表于 2008-12-31 18:00:17 | 显示全部楼层
学习了,谢过lz!
回复

使用道具 举报

shanshan1002 发表于 2009-2-13 21:53:05 | 显示全部楼层
先保存了,慢慢研究。谢谢了!
回复

使用道具 举报

wmqy2004 发表于 2009-2-16 22:58:27 | 显示全部楼层
版主,这应该是我此前编写的宏程序啊,曾发表在其它的论坛上
回复

使用道具 举报

xinwq 发表于 2009-7-20 10:28:49 | 显示全部楼层
鲜见clinical trial 中使用proc iml的,楼主大概搞学术太久了吧?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|会员|至尊|接种|公卫人 ( 沪ICP备06060850号-3 )

GMT+8, 2024-5-13 07:19 , Processed in 0.060909 second(s), 6 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表