楼主: priss111
2604 4

[实际应用] 请问如何用宏参数实用多个分类变量的proc freq过程?谢谢! [推广有奖]

  • 0关注
  • 5粉丝

副教授

15%

还不是VIP/贵宾

-

威望
0
论坛币
153 个
通用积分
47.5396
学术水平
11 点
热心指数
14 点
信用等级
10 点
经验
14938 点
帖子
473
精华
0
在线时间
805 小时
注册时间
2008-3-30
最后登录
2024-4-12

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请问如何用宏参数实用多个分类变量的proc freq过程?
谢谢!

目的:要进行多次chi-square test,
如何只改变数据集变量的取值及数据集名?

log中错误提示如下:
  1. 116  %macro mfreq(n11=,n12=,n21=,n22=,name=);
  2. 117  data &name.;
  3. 118      do group = 1 to 2;
  4. 119       do r = 1 to 2;
  5. 120       input f @@;
  6. 121       output;
  7. 122       end;
  8. 123      end;
  9. 124  cards;
  10. 125  %eval(&n11.+0)
  11. 126  %eval(&n12.+0)
  12. 127  %eval(&n21.+0)
  13. 128  %eval(&n22.+0)
  14. 129  ;
  15. 130  run;
  16. 131  proc print data=&name.;
  17. 132  run;
  18. 133  proc freq data=&name.;
  19. 134      weight f;
  20. 135      tables group*r/expected chisq exact;
  21. 136  run;
  22. 137  %mend mfreq;
  23. 138
  24. 139  %mfreq(n11=15,n12=35,n21=33,n22=27,name=fail)

  25. NOTE: 由于出错,SAS 系统停止处理该步。
  26. NOTE: “PROCEDURE FREQ”所用时间(总处理时间):
  27.       实际时间          37.80 秒
  28.       CPU 时间          1.91 秒




  29. ERROR: 宏 MFREQ 生成了 DATA 步的 CARDS(数据行),可能导致不正确的结果。DATA 步和宏将停止执行。
  30. NOTE: 数据集 WORK.FAIL 有 0 个观测和 3 个变量。
  31. NOTE: “DATA 语句”所用时间(总处理时间):
  32.       实际时间          0.01 秒
  33.       CPU 时间          0.01 秒


  34. NOTE: 由宏函数 N11 生成行。
  35. 1     15
  36.       --
  37.       180

  38. ERROR 180-322: 语句无效或未按正确顺序使用。


  39. NOTE: 数据集 WORK.FAIL 中没有观测。
复制代码

code1:
  1. %macro mfreq(n11=,n12=,n21=,n22=,name=);
  2. data &name.;
  3.         do group = 1 to 2;
  4.          do r = 1 to 2;
  5.          input f @@;
  6.          output;
  7.          end;
  8.         end;
  9. cards;
  10. %eval(&n11.+0)
  11. %eval(&n12.+0)
  12. %eval(&n21.+0)
  13. %eval(&n22.+0)
  14. ;
  15. run;
  16. proc print data=&name.;
  17. run;
  18. proc freq data=&name.;
  19.         weight f;
  20.         tables group*r/expected chisq exact;
  21. run;
  22. %mend mfreq;

  23. %mfreq(n11=15,n12=35,n21=33,n22=27,name=fail)
复制代码
macro参数里的数字都是字符,
可能cards识别不了,
用%eval()转换也不行.

code2:
%macro mfreq(n11=,n12=,n21=,n22=,name=);
data &name.;
    do group = 1 to 2;
     do r = 1 to 2;
     input f @@;
     output;
     end;
    end;
cards;
&n11.
&n12.
&n21.
&n22.
;
run;
proc print data=&name.;
run;
proc freq data=&name.;
    weight f;
    tables group*r/expected chisq exact;
run;
%mend mfreq;

%mfreq(n11=15,n12=35,n21=33,n22=27,name=fail)






二维码

扫码加我 拉你入群

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

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

关键词:freq 分类变量 如何用 REQ Fre

沙发
mathkkk 学生认证  发表于 2017-12-27 17:50:27 |只看作者 |坛友微信交流群
宏里面不能用cards

使用道具

藤椅
priss111 发表于 2017-12-28 08:39:56 |只看作者 |坛友微信交流群
mathkkk 发表于 2017-12-27 17:50
宏里面不能用cards
好,谢谢!

那这个简单粗暴的思路行不通了.

使用道具

板凳
mathkkk 学生认证  发表于 2017-12-28 09:14:01 |只看作者 |坛友微信交流群
还有,我觉得就算你这写的宏可以用,也没省多少力。

使用道具

报纸
priss111 发表于 2017-12-28 09:31:20 |只看作者 |坛友微信交流群
mathkkk 发表于 2017-12-28 09:14
还有,我觉得就算你这写的宏可以用,也没省多少力。
对,
就是看着整齐了.

下面这段代码可以实现上述macro的目的.
  1. data worry;
  2.         n+1;
  3.         do group = 1 to 2;
  4.          do r = 1 to 2;
  5.          input f @@;
  6.          output;
  7.          end;
  8.         end;
  9. cards;
  10. 15 35 33 27
  11. 7 43 19 41
  12. ;
  13. /*7 73 21 39
  14. 15 35 39 21
  15. 6 44 15 45
  16. 2 48 10 50
  17. 0 50 7 43
  18. 4 46 16 44
  19. 2 48 11 49
  20. 0 50 2 58*/

  21. run;
  22. proc print data=worry;
  23. run;
  24. proc freq data=worry;
  25.         by n;
  26.         weight f;
  27.         tables group*r/expected chisq exact;
  28. run;
复制代码

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 17:31