楼主: augustin4
4442 14

求助,关于sas连续执行过程步 [推广有奖]

  • 0关注
  • 0粉丝

已卖:12份资源

博士生

12%

还不是VIP/贵宾

-

威望
0
论坛币
416 个
通用积分
5.9234
学术水平
6 点
热心指数
6 点
信用等级
6 点
经验
7704 点
帖子
92
精华
0
在线时间
329 小时
注册时间
2014-1-14
最后登录
2022-12-20

楼主
augustin4 发表于 2014-10-23 17:17:01 |AI写论文
200论坛币
有很多个类似的数据集,我想把它们依次在一个过程步中调用。之前尝试用%macro定义数据集名,再在过程步中用data=%调用,但失败了。

最佳答案

sniperhgy 查看完整内容

很不错的思路,恭喜楼主自己解决了
关键词:Macro Data 数据集 acr CRO

沙发
sniperhgy 发表于 2014-10-23 17:17:02
augustin4 发表于 2014-10-25 09:48
第二个代码终于解决了。我发现直接在调用随机数的数据步里用set 多次串接随机数的数据集就可以了。
于是 ...
很不错的思路,恭喜楼主自己解决了

藤椅
sniperhgy 发表于 2014-10-23 17:27:20
楼主你好,对于你描述的问题,感觉不是很清晰,什么叫依次调用?是要把那些数据集里面的数据都先弄到一起然后做一些处理吗?如果是的话,请使用set命令,可以一次合并多个数据集,也可以多个set命令。如果楼主想要单独处理每个数据集,那可以用macro写一个%do循环,依次data部每个数据集,这样得到的结果就是每个数据集里面的内容都得到了处理,但是又不会搞到一起。如果楼主没有明白的话,请给出数据集的文件以及想要得到什么结果,我直接给出相应的代码。

板凳
augustin4 发表于 2014-10-23 17:40:55
sniperhgy 发表于 2014-10-23 17:27
楼主你好,对于你描述的问题,感觉不是很清晰,什么叫依次调用?是要把那些数据集里面的数据都先弄到一起然 ...
好像是没说清楚。
其实遇到了两个问题,但搞混了。
第一个是要用50支股票的数据分别做50次回归
第二个问题是有一组随机数,但我需要调用多次,在一个data步中计算套期保值(随机数的线性方程)的一个概率。

第一个问题好像能放在一个数据集中通过分类变量分别回归。但我觉得应该也能通过宏来实现
第二个问题调用的数据集是同一个,但没法通过循环和set使数据集读入多次(set在循环后会接着读)。我
想用一个%marco循环使用那个数据集。

不知道能不能实现。宏编程只简单得看过点教程

报纸
sniperhgy 发表于 2014-10-23 20:43:25
augustin4 发表于 2014-10-23 17:40
好像是没说清楚。
其实遇到了两个问题,但搞混了。
第一个是要用50支股票的数据分别做50次回归
问题一:
50只股票的数据,是一只股票一个数据集吗?如果是的话,不用放到一起,写个循环就行了:
  1. data para_list;
  2.   input DTNAME $32.;
  3.   cards;
  4. datasetname1
  5. .
  6. .
  7. .
  8. datasetname50
  9. ;
  10. run;

  11. %macro LoopReg;
  12.   proc sql noprint;
  13.     select count(*) into :para_count
  14.     from para_list
  15.     ;
  16.   quit;

  17.   %do i = 1 %to &para_count.;
  18.     data _null_;
  19.       set para_list(firstobs = &i. obs = &i.);
  20.       call symput("DT", strip(DTNAME));
  21.     run;

  22.     proc reg
  23.       data = &DT.
  24.       ...;
  25.     run;
  26.   %end;
  27. %mend;
复制代码
问题二的话,用上述代码可以自行指定要读取的obs啊,然后将需要用到的数据都保存到宏变量里面,这样用的话,就不怕set会自动下移指针了。
已有 2 人评分论坛币 学术水平 信用等级 收起 理由
admin_kefu + 80 根据规定进行奖励
augustin4 + 1 + 1 热心帮助其他会员

总评分: 论坛币 + 80  学术水平 + 1  信用等级 + 1   查看全部评分

地板
augustin4 发表于 2014-10-23 23:03:35
sniperhgy 发表于 2014-10-23 20:43
问题一:
50只股票的数据,是一只股票一个数据集吗?如果是的话,不用放到一起,写个循环就行了:问题二 ...
  1. data a;
  2. input x y;
  3. datalines;
  4. 2 6
  5. 3 3
  6. 1 3
  7. 2 8
  8. ;
  9. data b;
  10. input x y;
  11. datalines;
  12. 5 6
  13. 3 4
  14. 7 8
  15. 1 3
  16. ;
  17. run;

  18. data para_list;
  19. input DTNAME $32.;
  20. datalines;
  21. a
  22. b
  23. ;
  24. run;
  25. %macro LoopReg;
  26.    proc sql noprint;
  27.     select count(*) into :para_count
  28.         from para_list
  29.         ;
  30.         quit;
  31.         %do i=1 %to &para_count;
  32.          data _null_;
  33.          set para_list(firstobs=&i obs=&i);
  34.          call symput("DT",strip(DTNAME));
  35.          run;
  36.          proc reg data=&DT;
  37.          model y=x;
  38.          run;
  39.          %end;
  40.         %mend;
  41.         %loopreg
复制代码
很棒!第一个问题我解决了。但21行和26行的句号"."不知道干什么用的,我没有输

7
augustin4 发表于 2014-10-23 23:31:27
sniperhgy 发表于 2014-10-23 20:43
问题一:
50只股票的数据,是一只股票一个数据集吗?如果是的话,不用放到一起,写个循环就行了:问题二 ...
第二个问题还是没有明白,麻烦你讲的清楚一点。是一个
关于套期保值的问题。先生成随机数,再带入估计概率。
  1. *-------simulated是生成的两个随机数------*;
  2. data simulated;
  3. input dm bp;
  4. datalines;
  5. 0.57303 1.12506
  6. 0.70363 1.25487
  7. 0.64928 1.20948
  8. 0.69713 1.33010
  9. 0.66509 1.01796
  10. ;
  11. run;
  12. *--------数出随机数的个数-------*;
  13. proc sql;
  14. select count(*) into :countran from simulated;
  15. quit;
  16. *--------输入两种可能方案的系数-------*;
  17. data costprice;
  18. input dmcost bpcost;
  19. datalines;
  20. 1 2
  21. 3 1
  22. ;
  23. *-------先输入系数,再输入所有随机数,计算盈利大于10的个数,记为qualified,再用频率估计概率,输出--------*;
  24. data count(keep=prob);
  25. set costprice;
  26.   do i=1 to &countran;
  27.           set simulated end=last;
  28.      hedgerevenue=dmcost*dm+bpcost*bp;
  29.          if hedgerevenue>10 then qualified+1;
  30.          prob=qualified/&countran;
  31.          if last then output;
  32.         end;
  33. run;
复制代码

8
augustin4 发表于 2014-10-23 23:49:32
sniperhgy 发表于 2014-10-23 17:27
楼主你好,对于你描述的问题,感觉不是很清晰,什么叫依次调用?是要把那些数据集里面的数据都先弄到一起然 ...
谢谢你帮我回答问题!
但关于宏我还是有一点问题想请教你:
1,%do 循环可不可以不加%to, 像数据步那样do i=a,b,c?我想直接
  1. data a;
  2. input x y;
  3. datalines;
  4. 2 6
  5. 3 3
  6. 1 3
  7. 2 8
  8. ;
  9. data b;
  10. input x y;
  11. datalines;
  12. 5 6
  13. 3 4
  14. 7 8
  15. 1 3
  16. ;
  17. run;
  18. %macro test;
  19. %do i=a,b;
  20. proc reg data=&i;
  21. model y=x;
  22. run;
  23. %end;
  24. %mend test;
  25. %test
复制代码
这样调用数据集,但总是提示没有%to

2.我看到教材上可以这样命名一组数据集:
  1. %macro names(name, number);
  2. %do n=1 %to &number;
  3. &name&n
  4. %end;
  5. %mend names;
复制代码
然后作为数据步的名称使用:
  1. data %names(dsn, 5);
  2. run;
复制代码
那这种形式能不能在过程步中用呢?如:
  1. proc reg data=%names(dsn,5);
  2. model y=x;
  3. run;
复制代码
(悬赏已加)

9
sniperhgy 发表于 2014-10-24 10:10:38
augustin4 发表于 2014-10-23 23:31
第二个问题还是没有明白,麻烦你讲的清楚一点。是一个
关于套期保值的问题。先生成随机数,再带入估计概 ...
第二个问题楼主的貌似已经自己解决了啊?还是楼主有其他的要求,我看楼主那个代码是可以应用的啊……

10
sniperhgy 发表于 2014-10-24 10:21:41
augustin4 发表于 2014-10-23 23:49
谢谢你帮我回答问题!
但关于宏我还是有一点问题想请教你:
1,%do 循环可不可以不加%to, 像数据步那样 ...
两个问题,咱们一一解释一下:

1.%do是否可以像do那样直接使用 :
这个问题的答案会让楼主失望:不能。%do必须和%to搭配

但是也有一些变通的方式,比如 :
  1. %let mvar1 = A;
  2. %let mvar2 = B;
  3. %let mvar3 = C;

  4. %macro example;
  5.     %do i = 1 %to 3;
  6.         %put mvar&i = &&mvar&i;
  7.     %end;
  8. %mend example;

  9. %example;
复制代码
或者
  1. %let list_of_values = A B C;

  2. %macro example2;
  3.     %do i = 1 %to 3;
  4.         %let mvar = %scan(&list_of_values, &i, %str( ));
  5.         %put mvar = &mvar;
  6.     %end;
  7. %mend example2;

  8. %example2;
复制代码
2.关于一组数据集的调用
请楼主运行想像一下代码运行的效果:
  1. %macro names(name, number);
  2.   %do n=1 %to &number;
  3.     &name&n
  4.   %end;
  5. %mend names;

  6. data %names(dsn, 5);
  7. run;
复制代码
这段代码可以自动生成dsn1 - dsn5一共五个数据集,对不对,语法上data后面是可以写入多个数据集的。

楼主想要将这个宏应用于proc部,当然是可以的,但是前提是,用的地方必须支持多个数据集作为参数,比如:
  1. proc datasets;
  2.   delete
  3.     %names(dsn, 5)
  4.   ;
  5. run;
  6. quit;
复制代码
这样就会将DSN1 - DSN5删除掉。

但是楼主要用的那个地方是proc reg后面的data =, 据我所知,这个后面只需放一个数据集的名字吧?所以楼主的那个用法,不可以的。
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
augustin4 + 5 + 1 + 1 热心帮助其他会员

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

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

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