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

  155. ”
  156. */

  157.     RUN;
  158.    
  159.      ODS RTF CLOSE;
  160.     ODS LISTING;
  161.   %mend;
  162.   
  163.   %Stepd;
  164. %mend Baseline;
  165. %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, 2026-11-2 12:44