楼主: charlesqian
8230 4

SAS宏问题 [推广有奖]

  • 1关注
  • 0粉丝

大专生

5%

还不是VIP/贵宾

-

威望
0
论坛币
28 个
通用积分
1.0600
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
581 点
帖子
25
精华
0
在线时间
39 小时
注册时间
2014-9-18
最后登录
2020-2-14

5论坛币
小弱需要编一段程序,大概是要把已经分好的25组数据(先按size再按BM)分别计算超额收益率,但程序涉及到宏本人实在无法驾驭,不知道论坛上有没有大神可以帮忙?
程序如下:
%macro _group;
%do np1=0 %to 4;
  %do np2=0 %to 4;
  data _G&np1.&np2.;
  set work.result00;
  where(r_cvalue=&np1. r_bm=&np2.);
  run;
  Proc univariate data=_G&np1.&np2.;
  var return;
  weight cvalue;
  output out=nRe&np1.&np2. mean=nReturn&np1.&np2.;
  run;
  %macro minter;
  data _null&np1.&np2.;
  set nRe&np1.&np2.;
  call symput('nRetern&np1.&np2.',nReturn&np1.&np2.);
  run;
  %mend minter;
  %minter
  data work._1G&np1.&np2.;
  set work._G&np1.&np2.;
  return=return-%sysevalf(&nReturnn&np1.&np2.);
  run;
  %end;
%End;
%mend _group;
%_group


返回的日志如下:
22: 无法确定 LINE 和 COLUMN。
NOTE 242-205: NOSPOOL 已打开。用 OPTION SPOOL 重新运行可恢复出错的 LINE 和 COLUMN。
ERROR 22-322: 语法错误,期望下列之一: !, !!, &, *, **, +, -, /, <, <=, <>, =, >, >=, AND, EQ, GE, GT, LE, LT, NE, OR, ^=, |, ||,
              ~=.
76: 无法确定 LINE 和 COLUMN。
NOTE: NOSPOOL 已打开。用 OPTION SPOOL 重新运行可恢复出错的 LINE 和 COLUMN。
ERROR 76-322: 语法错误,语句将被忽略。
ERROR: 解析 WHERE 子句时出现语法错误。

NOTE: SAS 系统由于错误而停止了该步的处理。
WARNING: 数据集 WORK._G00 可能不完整。该步停止时,共有 0 个观测和 10 个变量。
WARNING: 数据集 WORK._G00 由于该步已停止,而没有被替换。




WARNING: 没有解析符号引用 NRETURNN。
22: 无法确定 LINE 和 COLUMN。
NOTE 242-205: NOSPOOL 已打开。用 OPTION SPOOL 重新运行可恢复出错的 LINE 和 COLUMN。
ERROR 22-322: 语法错误,期望下列之一: 名称, 带引号的字符串, 数值常数, 日期时间常数, 缺失值, INPUT, PUT.
WARNING: 没有解析符号引用 NRETURNN00。
ERROR: 在需要数值操作数的 %EVAL 函数或 %IF 条件中发现字符操作数。条件是: &nReturnn00

NOTE: SAS 系统由于错误而停止了该步的处理。
WARNING: 数据集 WORK._1G00 可能不完整。该步停止时,共有 0 个观测和 10 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.00 秒


ERROR: 宏 _GROUP 将终止执行。


以上,提前谢过各位!
关键词:SAS宏 Univariate warning Variate RETURN return 收益率 where 程序
沙发
mingfeng07 学生认证  发表于 2014-10-19 15:20:14 |只看作者 |坛友微信交流群
  1. /**作了一下语法的修改,至于能不能达到你的目的就不知道了,因为我也不知道超额收益率的计算公式***/
  2. %macro _group;
  3. %do np1=0 %to 4;
  4.   %do np2=0 %to 4;
  5.   data _G&np1.&np2.;
  6.   set work.result00;
  7.   where r_cvalue=&np1. and  r_bm=&np2.;
  8.   run;
  9.   Proc univariate data=_G&np1.&np2.;
  10.   var return;
  11.   weight cvalue;
  12.   output out=nRe&np1.&np2. mean=nReturn&np1.&np2.;
  13.   run;
  14.   data _null&np1.&np2.;
  15.   set nRe&np1.&np2.;
  16.   call symputx("nReturn&np1.&np2.",nReturn&np1.&np2.);
  17.   run;
  18.   data work._1G&np1.&np2.;
  19.   set work._G&np1.&np2.;
  20.   return1=return-&&&nReturn&np1.&np2.;
  21.   drop return;
  22.   rename return1=return;
  23.   run;
  24.   %end;
  25. %End;
  26. %mend _group;
  27. %_group
复制代码

使用道具

藤椅
charlesqian 发表于 2014-10-19 15:22:11 |只看作者 |坛友微信交流群
附一个正在处理的数据文件,需要的可以用这个数据 2011分组数据.xls (454 KB)

使用道具

板凳
charlesqian 发表于 2014-10-21 16:50:24 |只看作者 |坛友微信交流群
mingfeng07 发表于 2014-10-19 18:03
我之前的逻辑什么的没问题,就是基础语言不过关,用你改过的程序一下就ok了,谢谢你!
看了你的程序,我想请教一下。我看到你把我之前用的第二个宏(%minter)删掉了,两个宏不可以这样使用吗?
另外,symput和symputx有什么区别呢?直接用return=return-sysevalif(...)不可以吗?

使用道具

报纸
mingfeng07 学生认证  发表于 2014-10-22 10:48:44 |只看作者 |坛友微信交流群
charlesqian 发表于 2014-10-21 16:50
我之前的逻辑什么的没问题,就是基础语言不过关,用你改过的程序一下就ok了,谢谢你!
看了你的程序,我 ...
第一个问题:两个宏可以这样使用,但是在一个宏里,既然是正常顺序下使用的话,就没有必要再增加宏了。
第二个问题:symputx在创建宏变量的前提下,会自动消除前后多余的空格,相当于加了一个compress()函数的功能。
第三个问题:sysevalf()这个函数是用于进行逻辑运算的,而此题中是解析宏变量,所以没有必要。

使用道具

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

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

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

GMT+8, 2024-5-7 04:14