楼主: 幸福微积分
2749 10

[原创博文] 变量在不同的程序段间的调用 [推广有奖]

  • 4关注
  • 2粉丝

大专生

60%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
3 点
热心指数
3 点
信用等级
2 点
经验
870 点
帖子
52
精华
0
在线时间
42 小时
注册时间
2010-11-7
最后登录
2016-3-9

楼主
幸福微积分 发表于 2012-8-25 17:39:19 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
proc sql;
select avg(d2)as looser from pq1(firstobs=1 obs=10);
select avg(d2) as winner from pq1(firstobs=87 obs=96);
run;
data score ;
array ACR(96) acr1-acr96;
acr(1)=winner-looser;
%put acr(1);
run;

我想要把proc里得出的winner和looser做一个减法,结果放在数组ACR(*)里面,可是好像不能调用到
proc过程里的这两个变量,提示错误
“NOTE: Variable looser is uninitialized.
NOTE: Variable winner is uninitialized.

大侠们给看看  要怎么改呢?
二维码

扫码加我 拉你入群

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

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

关键词:Variable proc sql Initial Winner Select 程序

回帖推荐

chenys625 发表于8楼  查看完整内容

你那红色的部分,第一句应该没问题。第二句,改成: do t=1 to 96; acr(t)=%sysevalf(&winner-&looser); end; 这样试试? 我是感觉你整体程序的实现有点麻烦

本帖被以下文库推荐

沙发
haku_x300 发表于 2012-9-5 09:55:05
proc sql;
select avg(d2) into :looser from pq1(firstobs=1 obs=10);
select avg(d2) into :winner from pq1(firstobs=87 obs=96);
run;
data score ;
acr1=symget('winner')-symget('looser');
put acr1;
run;

藤椅
幸福微积分 发表于 2012-9-5 21:51:43
haku_x300 发表于 2012-9-5 09:55
proc sql;
select avg(d2) into :looser from pq1(firstobs=1 obs=10);
select avg(d2) into :winner fro ...
啊,谢谢,那如果,我在score数据集里面要不断的放入新数据,很多次循环,每次有一个结果数据存到score里呢?我之前用数组,因为每次循环都是新定义数组,所以之前的结果就都被冲掉了
像你这样改的程序是不是可以直接用  acr&t呢?(t是取值1-95的宏定义的全局变量)

板凳
chenys625 发表于 2012-9-5 22:41:56
能不能把你要的结果完整说一下? 感觉你的方法麻烦了

报纸
haku_x300 发表于 2012-9-6 07:24:04
幸福微积分 发表于 2012-9-5 21:51
啊,谢谢,那如果,我在score数据集里面要不断的放入新数据,很多次循环,每次有一个结果数据存到score里 ...
题目要求再描述一下吧,最好给出源数据集和想要的结果数据集的例子.

地板
幸福微积分 发表于 2012-9-6 18:35:27
haku_x300 发表于 2012-9-6 07:24
题目要求再描述一下吧,最好给出源数据集和想要的结果数据集的例子.
PROC IMPORT OUT= WORK.short2
            DATAFILE= "E:\SAS 9.1.3Data\080401.xls"/*数据表里是96支股票,四年的日收益率数据,列变量是X1-X96,96支股票*/
            DBMS=EXCEL REPLACE;
                        sheet="CR";
     GETNAMES=YES;
     MIXED=YES;
     SCANTEXT=YES;
     USEDATE=YES;
     SCANTIME=YES;
         run;

/*%global  p=1,q=1;*/

%macro returnc();

%do t=1 %to 96;
%let t1=%eval(&t+1);
/*选取的观测值随t滚动——形成期(t,t+P-1)持有期(t+p,t+p+q-1),t++*/
proc sql;
       create table pq&t as
      select * from short2(firstobs=&t obs=&t1);/*调用不出来。??!!!!*/
                 /*  select * from short2(firstobs=1 obs=2);*/
quit;       
run;

/*转置*/
proc transpose data=pq&t  out=pqtr&t  name=var prefix=d;
run;

/*排序期,持有期求和  */
%macro read();
  %do i= 1 %to 96;       
  proc sql;
  create table pq12&t as
     select sum(d1,0)as d1,sum(d2,0)as d2 from pqtr&t  where(&i);/*sum随PQ变,手工操作~*/       
  quit;
  run;
  %end;
  %mend read;
  %read;

/*形成期升序排序*/
proc sort data=pq12&t;
by d1;
run;

/*创建赢者组合和输者组合 */
proc sql  ;/* 存储looser和winner看是否可行(原先用的是into:loser做成宏)*/

select avg(d2) into: loser from pq12&t(firstobs=1 obs=10) ;
select avg(d2) into: winner from pq12&t(firstobs=87 obs=96);

%put &loser&t &winner;

quit;

data score ;
array ACR(96) acr1-acr96 ;
/*可以设一个数组记录每一期的return */
acr(&t)=&winner-&looser;/*????总是覆盖 */
run;

%end;
%mend returnc;
%returnc;


这是我大体的程序思路,里面红色的部分是还有问题的,一直不会解决,绿色的是不知道怎么改,才能让这个数组来存储我要的一系列结果。。。不知这样说,您能看明白吗,因为是初学,所以程序系的可能没什么章法。。。希望你能有耐心给帮忙看看

7
幸福微积分 发表于 2012-9-6 18:40:32
chenys625 发表于 2012-9-5 22:41
能不能把你要的结果完整说一下? 感觉你的方法麻烦了
恩恩,我把完整程序贴出来,帮我看看吧。。。还有好多问题都没想通。。
PROC IMPORT OUT= WORK.short2
            DATAFILE= "E:\SAS 9.1.3Data\080401.xls"/*数据表里是96支股票,四年的日收益率数据,列变       量是X1-X96,96支股票*/
            DBMS=EXCEL REPLACE;
                        sheet="CR";
            GETNAMES=YES;
             MIXED=YES;
             SCANTEXT=YES;
             USEDATE=YES;
             SCANTIME=YES;
         run;

/*%global  p=1,q=1;*/

    %macro returnc();
    %do t=1 %to 96;
     %let t1=%eval(&t+1);
/*选取的观测值随t滚动——形成期(t,t+P-1)持有期(t+p,t+p+q-1),t++*/
proc sql;
       create table pq&t as
       select * from short2(firstobs=&t obs=&t1);/*调用不出来。??!!!!*/
                 /*  select * from short2(firstobs=1 obs=2);*/
quit;        
run;

/*转置*/
proc transpose data=pq&t  out=pqtr&t  name=var prefix=d;
run;

/*排序期,持有期求和  */
%macro read();
   %do i= 1 %to 96;        
   proc sql;
     create table pq12&t as
     select sum(d1,0)as d1,sum(d2,0)as d2 from pqtr&t  where(&i);/*sum随PQ变,手工操作~*/        
  quit;
  run;
  %end;
  %mend read;
  %read;

/*形成期升序排序*/
proc sort data=pq12&t;
by d1;
run;

/*创建赢者组合和输者组合 */
proc sql  ;/* 存储looser和winner看是否可行(原先用的是into:loser做成宏)*/

select avg(d2) into: loser from pq12&t(firstobs=1 obs=10) ;
select avg(d2) into: winner from pq12&t(firstobs=87 obs=96);

%put &loser&t &winner;

quit;

data score ;
array ACR(96) acr1-acr96 ;/*可以设一个数组记录每一期的return */
acr(&t)=&winner-&loose
r;/*????总是覆盖 */
run;

%end;
%mend returnc;
%returnc;

红色这部分程序我不会改,想要每次t循环的数据结果都存里面,但是每次之前的都会冲掉。。。

8
chenys625 发表于 2012-9-10 23:30:08
幸福微积分 发表于 2012-9-6 18:40
恩恩,我把完整程序贴出来,帮我看看吧。。。还有好多问题都没想通。。
PROC IMPORT OUT= WORK.sh ...
你那红色的部分,第一句应该没问题。第二句,改成:
do t=1 to 96;
acr(t)=%sysevalf(&winner-&looser);
end;
这样试试? 我是感觉你整体程序的实现有点麻烦
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

9
幸福微积分 发表于 2012-9-11 16:56:03
chenys625 发表于 2012-9-10 23:30
你那红色的部分,第一句应该没问题。第二句,改成:
do t=1 to 96;
acr(t)=%sysevalf(&winner-&looser) ...
恩  弄出来以后我也觉得好像有些麻烦,开始只是按照自己的想法弄了,刚开始学,所以总是不能得心应手。。。
这两句改的话,出来的ACR数组应该是96个一样的数吧?  这种循环是不是得这个小程序段内循环96次才会出来在进行下一步大循环

10
chenys625 发表于 2012-9-12 22:06:05
幸福微积分 发表于 2012-9-11 16:56
恩  弄出来以后我也觉得好像有些麻烦,开始只是按照自己的想法弄了,刚开始学,所以总是不能得心应手。。 ...
都是这样的 刚开始自己乱弄一气然后还觉得很有成就 过一段水平提高了回来看以前的跟shi一样~ 呵呵 你现在都能用宏这些已经很厉害了 加油!有兴趣加下这个群  144839730 我们老在里面聊sas 共勉!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-27 15:06