楼主: nkunku
545 2

[SAS软件相关] 请教一个SAS宏问题 [推广有奖]

  • 7关注
  • 74粉丝

已卖:1874份资源

院士

37%

还不是VIP/贵宾

-

威望
1
论坛币
192448 个
通用积分
225.2698
学术水平
212 点
热心指数
240 点
信用等级
161 点
经验
12019 点
帖子
3323
精华
0
在线时间
3447 小时
注册时间
2010-4-23
最后登录
2026-1-8

楼主
nkunku 发表于 2024-5-26 23:12:29 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
各位好。“高级医学统计学_万崇华2014”一书中,在关于平衡不完全区组设计的SAS程序里,有一小段宏命令,我仿照着输入,却无法得到结果。在此请教大家,麻烦帮我看一看,不胜感激!
%let block = 5;
%let treat = 5;
%let subject = 3;
%macro aa( treat);;
data a; %do i = 1 %to & treat;
treatment = compress('疗法 '||& i);;
output; %end;
run;
%mend aa;
%aa( &treat);;
proc optex data = a seed = 10000 coding = orth;
class treatment; model treatment; blocks structure = ( &block)&subject;
output out = b;
run;
data c;
set b; number = _n_;
run;
ods html style analysis;
proc tabulate format = 2.0;
class block treatment; var number;
table block = ", number = '受试对象编号 '*treatment = "* sum = " /box = [label = '区组'];
run;
ods html close;

二维码

扫码加我 拉你入群

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

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

关键词:SAS宏 treatment Structure Tabulate compress

IMG_20240525_150207.jpg (2.15 MB)

IMG_20240525_150207.jpg

回帖推荐

如风飘扬 发表于2楼  查看完整内容

一个月过去了,应该是自己找到原因了,但还是自作多情说一下。 1跟2是一样的问题,宏变量是&+变量名,中间没空格的; 3跟书对比少了个等号; 4是两个单引号,不是一个双引号。

沙发
如风飘扬 发表于 2024-6-29 22:15:57
一个月过去了,应该是自己找到原因了,但还是自作多情说一下。
1跟2是一样的问题,宏变量是&+变量名,中间没空格的;
3跟书对比少了个等号;
4是两个单引号,不是一个双引号。

捕获.PNG (48.64 KB)

捕获.PNG

已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
nkunku + 5 + 5 + 5 + 5 热心帮助其他会员

总评分: 论坛币 + 5  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

藤椅
赵安豆 发表于 2024-7-1 05:46:51
你提供的SAS宏代码中存在一些问题,我将一一指出并给出修改建议:

1. **压缩字符串时不需要使用分号**:在`compress('疗法 '||&i);`这行,实际上SAS中的`compress()`函数用于移除字符串两端的空白或指定字符,并不接受分号。因此应该去掉分号。

2. **宏调用参数问题**:`%aa( &treat);;` 这里使用了额外的分号并且直接将变量名放在括号内,应当修改为 `%aa(&treat);`。

3. **PROC OPTEX 数据集来源问题**:你定义的数据集`a`在宏中创建,但宏调用后并没有自动将数据集`a`留在当前工作库中供后续步骤使用。你需要确保在调用宏之前或之后可以访问这个数据集。

修正后的代码如下:

```sas
%let block = 5;
%let treat = 5;
%let subject = 3;

%macro aa( treat);
data a;
    %do i = 1 %to &treat;
        treatment = compress('疗法 '||&i); /* 去掉了不必要的分号 */
        output;
    %end;
run;
%mend aa;

%aa(&treat) /* 修改宏调用格式 */;

proc optex data=a seed=10000 coding=orth;
class treatment;
model treatment;
blocks structure = (&block)*&subject;
output out=b;
run;

data c;
    set b; number = _n_;
run;

ods html style=analysis;
proc tabulate format=2.0;
...
run;
```

在使用SAS宏时,一定要注意参数的正确传递以及变量和数据集的作用范围。希望上述修改能帮助你解决问题!如果还有其他疑问或者代码运行中遇到新的问题,请随时提问。

另外,`PROC TABULATE`部分需要具体指定要报告哪些统计数据以及如何分组、排序等详细信息才能正常工作,这部分根据你的实际需求进行调整即可。

此文本由CAIE学术大模型生成,添加下方二维码,优先体验功能试用



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

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2026-1-9 04:39