SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1848|回复: 1
打印 上一主题 下一主题

《直接输出科研论文统计表格的SAS宏》中sas宏的疑问

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-6-27 06:39:21 | 只看该作者

《直接输出科研论文统计表格的SAS宏》中sas宏的疑问

《直接输出科研论文统计表格的SAS宏》中sas宏的疑问
北大刘建蒙教授2010年在《中国卫生统计》上发表的文章《直接输出科研论文统计表格的SAS宏》文后附录了一个较完整的sas宏(省略了数值变量的统计),我将其抄下来在sas中运行发现有错误,能告诉我我哪错了还是程序有错误?
                                                                                                                                                                                                            
[code:23jfjdst]                                                                                                                                                                                                      
                                                                                                                                                                                                            
/* 调用宏前的准备*/                                                                                                                                                                                          
/* 定义分类变量的类别*/                                                                                                                                                                                      
/* 定义数值变量的缺失值*/                                                                                                                                                                                    
/* 定义基线特征变量标签*/                                                                                                                                                                                    
/* 定义宏变量*/                                                                                                                                                                                             
/* 说明:                                                                                                                                                                                                     
Dataset指拟分析的数据集;                                                                                                                                                                                    
Group指分组变量;                                                                                                                                                                                             
Cat_var指分类变量名;                                                                                                                                                                                         
Cat_index 指基线表中该分类变量的顺次;                                                                                                                                                                        
Cat_n分类变量的总数;                                                                                                                                                                                         
Num_var指数值变量名;                                                                                                                                                                                         
Num_index指基线表中该数值变量的顺次;                                                                                                                                                                        
Num_n数值变量的总数;                                                                                                                                                                                         
*/                                                                                                                                                                                                           
%LET Dataset=ss;                                                                                                                                                                                             
%LET Group=s;                                                                                                                                                                                                
%LET Cat_var=%str(AA);                                                                                                                                                                                       
%LET Cat_index=%str(1);                                                                                                                                                                                      
%LET Cat_n=1;                                                                                                                                                                                                
%LET Num_var=%str(Age height weight fee);                                                                                                                                                                    
%LET Num_index=%str(2 3 4 5);                                                                                                                                                                                
%LET Num_n=4;                                                                                                                                                                                                
                                                                                                                                                                                                            
/* 宏主体及解释*/                                                                                                                                                                                            
/* 宏名称为Baseline, 由4步生成*/                                                                                                                                                                             
                                                                                                                                                                                                            
%MACRO Baseline;                                                                                                                                                                                             
                                                                                                                                                                                                            
  /* 步骤1. 生成分类变量的输出要素*/                                                                                                                                                                        
  /* 生成频数数据集*/                                                                                                                                                                                       
                                                                                                                                                                                                            
  %MACRO Stepa;                                                                                                                                                                                             
    DATA Freq_a;                                                                                                                                                                                             
     SET &Dataset;                                                                                                                                                                                          
      Treat=(&Group=1)*1+(&Group=2)*0;                                                                                                                                                                       
       Control=(&Group=1)*0+(&Group=2)*1;                                                                                                                                                                    
    RUN;                                                                                                                                                                                                     
                                                                                                                                                                                                            
    PROC MEANS DATA=Freq_a NOPRINT;                                                                                                                                                                          
     CLASS &Cat_var;                                                                                                                                                                                         
      VAR Treat Control; OUTPUT OUT=Freq_b SUM=/AUTONAME;                                                                                                                                                   
       WAYS 1;                                                                                                                                                                                               
    RUN;                                                                                                                                                                                                     
                                                                                                                                                                                                            
    %GLOBAL Total_treat Total_control;                                                                                                                                                                       
                                                                                                                                                                                                            
    PROC SQL NOPRINT;                                                                                                                                                                                       
     SELECT COUNT(*) INTO:Total_treat FROM &Dataset WHERE &Group=1;                                                                                                                                          
      SELECT COUNT(*) INTO:Total_control FROM &Dataset WHERE &Group=2;                                                                                                                                       
    QUIT;                                                                                                                                                                                                   
                                                                                                                                                                                                            
    DATA Freq_c;                                                                                                                                                                                             
     SET Freq_b;                                                                                                                                                                                             
      LENGTH Variable Level $200.;                                                                                                                                                                           
       Treat=CATS(Treat_sum,"(", PUT((Treat_sum/&Total_treat)*100, 8.1),")");                                                                                                                                
        Control=CATS(Control_sum,"(",PUT((Control_sum/&Total_control)*100, 8.1),")");                                                                                                                        
         %DO i=1 %TO &CAT_n;                                                                                                                                                                                 
           IF %SCAN(&Cat_var,&i) THEN DO;                                                                                                                                                                    
             Variable="%SCAN(&Cat_var,&i)";                                                                                                                                                                  
              Index=%SCAN(&Cat_var,&i);                                                                                                                                                                     
               Level=PUT(%SCAN(&Cat_var,&i),%SCAN(&Cat_var,&i).);                                                                                                                                            
                                                                                                                                                                                                            
/*                                                                                                                                                                                                           
                                                                                                                                                                                                            
此处sas会提示错误,                                                                                                                                                                                          
                                                                                                                                                                                                            
“                                                                                                                                                                                                           
                                                                                                                                                                                                            
NOTE: 由宏函数“SCAN”生成行。                                                                                                                                                                              
1     AA                                                                                                                                                                                                     
      --                                                                                                                                                                                                     
      48                                                                                                                                                                                                     
                                                                                                                                                                                                            
ERROR 48-59: 输出格式 AA 没有找到或无法加载。                                                                                                                                                               
”                                                                                                                                                                                                           
                                                                                                                                                                                                            
*/                                                                                                                                                                                                           
           END;                                                                                                                                                                                             
         %END;                                                                                                                                                                                               
    RUN;                                                                                                                                                                                                     
                                                                                                                                                                                                            
    /* 输出卡方值*/                                                                                                                                                                                          
    ODS LISTING CLOSE;                                                                                                                                                                                       
     ODS OUTPUT ChiSq=Freq_d;                                                                                                                                                                                
                                                                                                                                                                                                            
    PROC FREQ DATA=&Dataset;                                                                                                                                                                                 
     TABLE &Group*(&Cat_var)/Chisq;                                                                                                                                                                          
    RUN;                                                                                                                                                                                                     
                                                                                                                                                                                                            
    ODS LISTING;                                                                                                                                                                                             
                                                                                                                                                                                                            
    DATA Freq_e(KEEP=Variable Prob);                                                                                                                                                                        
     SET Freq_d;                                                                                                                                                                                             
      Variable=SCAN(Table,-1,"");                                                                                                                                                                           
       WHERE Statistic="Chi-Square" or Statistic="卡方";                                                                                                                                                     
    RUN;                                                                                                                                                                                                     
                                                                                                                                                                                                            
    /* 合并卡方与频数数据集*/                                                                                                                                                                                
    PROC SORT DATA=Freq_c;                                                                                                                                                                                   
     BY Variable;                                                                                                                                                                                            
                                                                                                                                                                                                            
    PROC SORT DATA=Freq_e;                                                                                                                                                                                   
     BY Variable;                                                                                                                                                                                            
    RUN;                                                                                                                                                                                                     
                                                                                                                                                                                                            
    DATA Freq_f;                                                                                                                                                                                             
     MERGE Freq_c Freq_e;                                                                                                                                                                                    
      BY Variable;                                                                                                                                                                                          
       KEEP Variable Level Treat Control Index Prob;                                                                                                                                                         
    RUN;                                                                                                                                                                                                     
                                                                                                                                                                                                            
  %mend;                                                                                                                                                                                                     
                                                                                                                                                                                                            
  %Stepa;                                                                                                                                                                                                   
                                                                                                                                                                                                            
  /*步骤2. 生成数值变量的输出要素*/                                                                                                                                                                          
                                                                                                                                                                                                            
  %MACRO Stepb;                                                                                                                                                                                             
   DATA Mean_f;RUN;/*此处建一空数据集代替*/                                                                                                                                                                  
    /* 参考步骤1, 首先将T 检验的结果以均数(标准差) 、方差齐性检验和t检验3个数据集存储备用, 进而生成数值变量的输出要素*/                                                                                      
  %mend;                                                                                                                                                                                                     
                                                                                                                                                                                                            
  %Stepb;                                                                                                                                                                                                   
                                                                                                                                                                                                            
  /* 步骤3. 合并分类变量与数值变量输出要素, 并按顺序变量排序*/                                                                                                                                               
                                                                                                                                                                                                            
  %MACRO Stepc;                                                                                                                                                                                             
    DATA Final;                                                                                                                                                                                             
     SET Freq_f Mean_f;                                                                                                                                                                                      
    RUN;                                                                                                                                                                                                     
                                                                                                                                                                                                            
    PROC SORT DATA=Final;                                                                                                                                                                                    
     BY Index;                                                                                                                                                                                               
    RUN;                                                                                                                                                                                                     
  %mend;                                                                                                                                                                                                     
                                                                                                                                                                                                            
  %Stepc;                                                                                                                                                                                                   
                                                                                                                                                                                                            
  /* 步骤4: 将输出元素以RTF类型输出并存至C盘根目录下的Example.rtf文件*/                                                                                                                                      
  %MACRO Stepd;                                                                                                                                                                                             
    Options Nodate Nonumber Orientation=Portrait;                                                                                                                                                            
     ODS LISTING CLOSE;                                                                                                                                                                                      
      ODS RTF FILE="C:\Example.rtf" bodytitle;                                                                                                                                                               
       TITLE FONT="宋体" HEIGHT=10pt "表1 干预和对照组基线特征分布";                                                                                                                                         
                                                                                                                                                                                                            
    PROC REPORT DATA=Final NOWD STYLE(REPORT)={BACKGROUND=WHITE RULES=GROUP FRAME=HSIDES CELLWIDTH=60%}                                                                                                      
      STYLE(HEADER)={FONT_WEIGHT=LIGHT BACKGROUND=WHITE FONT_SIZE=10pt};                                                                                                                                    
     COLUMN Variable Level Treat Control Prob;                                                                                                                                                               
      DEFINE Variable/GROUP ORDER=DATA "基线特征" STYLE(COLUMN)={JUST=LEFT} STYLE(HEADER)={JUST=LEFT};                                                                                                      
       DEFINE Level/DISPLAY " " STYLE(COLUMN)={JUST=LEFT};                                                                                                                                                   
        DEFINE Treat/DISPLAY "治疗(n=%left(&total_treat))" STYLE(COLUMN)={JUST=RIGHT} STYLE(HEADER)={JUST=RIGHT};                                                                                            
       DEFINE Control/DISPLAY "对照(n=%left(&total_control))" STYLE(COLUMN)={JUST=RIGHT} STYLE(HEADER)={JUST=RIGHT};                                                                                         
          DEFINE Prob/GROUP "P" STYLE(COLUMN)={JUST=CENTER} STYLE(HEADER)={FONT_STYLE=ITALIC};                                                                                                               
           COMPUTE BEFORE Variable/STYLE(LINES)={FONT_SIZE=2pt};                                                                                                                                             
             LINE " ";                                                                                                                                                                                       
           ENDCOMP;                                                                                                                                                                                          
            FORMAT Variable $Variable.;                                                                                                                                                                     
                                                                                                                                                                                                            
/*                                                                                                                                                                                                           
                                                                                                                                                                                                            
此处sas会提示错误,                                                                                                                                                                                          
                                                                                                                                                                                                            
“                                                                                                                                                                                                           
                                                                                                                                                                                                            
[color=#FF0000]ERROR: 输出格式 $VARIABLE 没有找到或无法加载。                                                                                                                                        [/color]                       
                                                                                                                                                                                                            
                                                                                                                                                                                                            
”                                                                                                                                                                                                           
                                                                                                                                                                                                            
*/                                                                                                                                                                                                           
                                                                                                                                                                                                            
    RUN;                                                                                                                                                                                                     
                                                                                                                                                                                                            
     ODS RTF CLOSE;                                                                                                                                                                                          
    ODS LISTING;                                                                                                                                                                                             
  %mend;                                                                                                                                                                                                     
                                                                                                                                                                                                            
  %Stepd;                                                                                                                                                                                                   
%mend Baseline;                                                                                                                                                                                             
                                                                                                                                                                                                            
%Baseline;                                                                                                                                                                                                   
[/code:23jfjdst]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-6-28 22:40:24 | 只看该作者

Re: 《直接输出科研论文统计表格的SAS宏》中sas宏的疑问

定义你的$VARIABLE  format。
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-10 05:22 , Processed in 0.069884 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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