楼主: dahufa123
5915 11

《直接输出科研论文统计表格的SAS宏》中sas宏的疑问 [推广有奖]

  • 0关注
  • 2粉丝

本科生

36%

还不是VIP/贵宾

-

威望
0
论坛币
35 个
通用积分
0.2605
学术水平
23 点
热心指数
25 点
信用等级
22 点
经验
3723 点
帖子
66
精华
0
在线时间
62 小时
注册时间
2009-3-16
最后登录
2024-4-8

楼主
dahufa123 发表于 2011-6-27 06:31:03 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
北大刘建蒙教授2010年在《中国卫生统计》上发表的文章《直接输出科研论文统计表格的SAS宏》文后附录了一个较完整的sas宏(省略了数值变量的统计),我将其抄下来在sas中运行发现有错误,能告诉我我哪错了还是程序有错误?

  1. /* 调用宏前的准备*/
  2. /* 定义分类变量的类别*/
  3. /* 定义数值变量的缺失值*/
  4. /* 定义基线特征变量标签*/
  5. /* 定义宏变量*/
  6. /* 说明:
  7. Dataset指拟分析的数据集;
  8. Group指分组变量;
  9. Cat_var指分类变量名;
  10. Cat_index 指基线表中该分类变量的顺次;
  11. Cat_n分类变量的总数;
  12. Num_var指数值变量名;
  13. Num_index指基线表中该数值变量的顺次;
  14. Num_n数值变量的总数;
  15. */
  16. %LET Dataset=ss;
  17. %LET Group=s;
  18. %LET Cat_var=%str(AA);
  19. %LET Cat_index=%str(1);
  20. %LET Cat_n=1;
  21. %LET Num_var=%str(Age height weight fee);
  22. %LET Num_index=%str(2 3 4 5);
  23. %LET Num_n=4;
  24. /* 宏主体及解释*/
  25. /* 宏名称为Baseline, 由4步生成*/
  26. %MACRO Baseline;
  27.   
  28.   /* 步骤1. 生成分类变量的输出要素*/
  29.   /* 生成频数数据集*/  
  30.   
  31.   %MACRO Stepa;
  32.     DATA Freq_a;
  33.      SET &Dataset;
  34.       Treat=(&Group=1)*1+(&Group=2)*0;
  35.        Control=(&Group=1)*0+(&Group=2)*1;
  36.     RUN;
  37.    
  38.     PROC MEANS DATA=Freq_a NOPRINT;
  39.      CLASS &Cat_var;
  40.       VAR Treat Control; OUTPUT OUT=Freq_b SUM=/AUTONAME;
  41.        WAYS 1;
  42.     RUN;
  43.    
  44.     %GLOBAL Total_treat Total_control;
  45.    
  46.     PROC SQL NOPRINT;
  47.      SELECT COUNT(*) INTO:Total_treat FROM &Dataset WHERE &Group=1;
  48.       SELECT COUNT(*) INTO:Total_control FROM &Dataset WHERE &Group=2;
  49.     QUIT;
  50.    
  51.     DATA Freq_c;
  52.      SET Freq_b;
  53.       LENGTH Variable Level $200.;
  54.        Treat=CATS(Treat_sum,"(", PUT((Treat_sum/&Total_treat)*100, 8.1),")");
  55.         Control=CATS(Control_sum,"(",PUT((Control_sum/&Total_control)*100, 8.1),")");
  56.          %DO i=1 %TO &CAT_n;
  57.            IF %SCAN(&Cat_var,&i) THEN DO;
  58.              Variable="%SCAN(&Cat_var,&i)";
  59.               Index=%SCAN(&Cat_var,&i);
  60.                Level=PUT(%SCAN(&Cat_var,&i),%SCAN(&Cat_var,&i).);
  61. /*
  62. 此处sas会提示错误,

  63. NOTE: 由宏函数“SCAN”生成行。
  64. 1     AA
  65.       --
  66.       48
  67. ERROR 48-59: 输出格式 AA 没有找到或无法加载。

  68. */
  69.            END;
  70.          %END;
  71.     RUN;
  72.    
  73.     /* 输出卡方值*/
  74.     ODS LISTING CLOSE;
  75.      ODS OUTPUT ChiSq=Freq_d;
  76.      
  77.     PROC FREQ DATA=&Dataset;
  78.      TABLE &Group*(&Cat_var)/Chisq;
  79.     RUN;
  80.    
  81.     ODS LISTING;
  82.    
  83.     DATA Freq_e(KEEP=Variable Prob);
  84.      SET Freq_d;
  85.       Variable=SCAN(Table,-1,"");
  86.        WHERE Statistic="Chi-Square" or Statistic="卡方";
  87.     RUN;
  88.    
  89.     /* 合并卡方与频数数据集*/
  90.     PROC SORT DATA=Freq_c;
  91.      BY Variable;
  92.      
  93.     PROC SORT DATA=Freq_e;
  94.      BY Variable;
  95.     RUN;
  96.    
  97.     DATA Freq_f;
  98.      MERGE Freq_c Freq_e;
  99.       BY Variable;
  100.        KEEP Variable Level Treat Control Index Prob;
  101.     RUN;
  102.    
  103.   %mend;
  104.   
  105.   %Stepa;
  106.   
  107.   /*步骤2. 生成数值变量的输出要素*/
  108.   
  109.   %MACRO Stepb;
  110.    DATA Mean_f;RUN;/*此处建一空数据集代替*/
  111.     /* 参考步骤1, 首先将T 检验的结果以均数(标准差) 、方差齐性检验和t检验3个数据集存储备用, 进而生成数值变量的输出要素*/
  112.   %mend;
  113.   
  114.   %Stepb;
  115.   
  116.   /* 步骤3. 合并分类变量与数值变量输出要素, 并按顺序变量排序*/
  117.   
  118.   %MACRO Stepc;
  119.     DATA Final;
  120.      SET Freq_f Mean_f;
  121.     RUN;
  122.    
  123.     PROC SORT DATA=Final;
  124.      BY Index;
  125.     RUN;
  126.   %mend;
  127.   
  128.   %Stepc;
  129.   
  130.   /* 步骤4: 将输出元素以RTF类型输出并存至C盘根目录下的Example.rtf文件*/
  131.   %MACRO Stepd;
  132.     Options Nodate Nonumber Orientation=Portrait;
  133.      ODS LISTING CLOSE;
  134.       ODS RTF FILE="C:\Example.rtf" bodytitle;
  135.        TITLE FONT="宋体" HEIGHT=10pt "表1 干预和对照组基线特征分布";
  136.    
  137.     PROC REPORT DATA=Final NOWD STYLE(REPORT)={BACKGROUND=WHITE RULES=GROUP FRAME=HSIDES CELLWIDTH=60%}
  138.       STYLE(HEADER)={FONT_WEIGHT=LIGHT BACKGROUND=WHITE FONT_SIZE=10pt};
  139.      COLUMN Variable Level Treat Control Prob;
  140.       DEFINE Variable/GROUP ORDER=DATA "基线特征" STYLE(COLUMN)={JUST=LEFT} STYLE(HEADER)={JUST=LEFT};
  141.        DEFINE Level/DISPLAY " " STYLE(COLUMN)={JUST=LEFT};
  142.         DEFINE Treat/DISPLAY "治疗(n=%left(&total_treat))" STYLE(COLUMN)={JUST=RIGHT} STYLE(HEADER)={JUST=RIGHT};
  143.        DEFINE Control/DISPLAY "对照(n=%left(&total_control))" STYLE(COLUMN)={JUST=RIGHT} STYLE(HEADER)={JUST=RIGHT};
  144.           DEFINE Prob/GROUP "P" STYLE(COLUMN)={JUST=CENTER} STYLE(HEADER)={FONT_STYLE=ITALIC};
  145.            COMPUTE BEFORE Variable/STYLE(LINES)={FONT_SIZE=2pt};
  146.              LINE " ";
  147.            ENDCOMP;
  148.             FORMAT Variable $Variable.;
  149. /*
  150. 此处sas会提示错误,

  151. ERROR: 输出格式 $VARIABLE 没有找到或无法加载。


  152. */

  153.     RUN;
  154.    
  155.      ODS RTF CLOSE;
  156.     ODS LISTING;
  157.   %mend;
  158.   
  159.   %Stepd;
  160. %mend Baseline;
  161. %Baseline;
复制代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:SAS宏 论文统计 科研论文 统计表 orientation 论文 SAS SAS 科研 表格

沙发
chunxiarr 发表于 2011-6-27 06:35:58
also want to know!!

藤椅
ntsean 发表于 2011-6-27 09:47:47
看起来是你少了 $variable 格式的定义
你需要一个proc format来定义 $variable
已有 1 人评分热心指数 收起 理由
crackman + 2 鼓励积极发帖讨论

总评分: 热心指数 + 2   查看全部评分

板凳
userzht 发表于 2014-7-24 09:58:04
ntsean 发表于 2011-6-27 09:47
看起来是你少了 $variable 格式的定义
你需要一个proc format来定义 $variable
是的,应该定义aa的格式。在数据步后,proc format;value aa 1='one' 2='two';run;

报纸
yezi1107 在职认证  发表于 2015-2-27 10:39:52
userzht 发表于 2014-7-24 09:58
是的,应该定义aa的格式。在数据步后,proc format;value aa 1='one' 2='two';run;
请问是在哪里添加?第几行呢?

地板
wangqi485528 发表于 2015-2-27 10:44:36
没看懂

7
yezi1107 在职认证  发表于 2015-2-27 11:02:46
ntsean 发表于 2011-6-27 09:47
看起来是你少了 $variable 格式的定义
你需要一个proc format来定义 $variable
您好,请问在哪加?

8
天穹下 发表于 2015-3-3 13:29:01
yezi1107 发表于 2015-2-27 11:02
您好,请问在哪加?
proc format;
value aa 1='one' 2='two';
run;/*level变量所在的data步之上就行*/

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).);

9
yezi1107 在职认证  发表于 2015-3-5 09:23:05
天穹下 发表于 2015-3-3 13:29
proc format;
value aa 1='one' 2='two';
run;/*level变量所在的data步之上就行*/
非常感谢您,我去试试~

10
yezi1107 在职认证  发表于 2015-3-5 15:58:46
您好!最近也在研究这篇文章的SAS代码,请问代码中的步骤2(/*步骤2. 生成数值变量的输出要素*/),您有扩展代码吗?

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 07:00