楼主: liuyueying
2933 6

SAS救助纠错!! [推广有奖]

  • 0关注
  • 0粉丝

学前班

70%

还不是VIP/贵宾

-

威望
0
论坛币
17 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
75 点
帖子
4
精华
0
在线时间
0 小时
注册时间
2009-3-30
最后登录
2010-3-21

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

用SAS在做灰色预测模型GM(1,1)的时候遇到了如下问题:

33   DATA a5;
34   MERGE a1 a3 a4; BY index;
35   IF _N_ = 1 THEN xp = xt;                        /* x(0)(1) = x(0)(1) */
36   ELSE DO
37     yt1=(xt0-u/a)*EXP(-a*(t-1))+u/a;                /* 计算^x(1)(k) =[x(0)(k)-u/a]e-a(k-1)+u/a */
ERROR: 名称   yt1 不是有效的 SAS 名称。
38     yt0=(xt0-u/a)*EXP(-a*(t-2))+u/a;                /* 计算^x(1)(k-1) = [x(0)(k)-u/a]e-a(k-2)+u/a */
ERROR: 名称   yt0 不是有效的 SAS 名称。
39     xp=yt1-yt0;                                 /* 计算预测值^x(0)(k) = [x(1)(k)]-x(1)(k-1)*/
ERROR: 名称   xp 不是有效的 SAS 名称。
40   END;

但是我尝试修改名字以后仍然不行,请问是什么问题?如何修改?谢谢!!

完整程序代码如下:

data a1;                     /* 建立原始数据集a1 */
input t year xt;                  /* 读入原始数据序 */
yt+xt;                             /* 生成一阶累加序列 */
index=1; zt=-(yt+lag(yt))/2;     /* 为数据矩阵B准备数据 */
datalines;
1 1990 24395  
2 1991 25286
3 1992 26901  
4 1993 27339
5 1994 27871  
6 1995 28721
7 1996 29728  
8 1997 30067
9 1998 30791  
10 1999 31284
11 2000 33716  
12 2001 34558
;
PROC IML;          /* 调用IML 模块 */
USE a1;           /* 打开已有的SAS数据集a1 */
READ ALL VAR{zt index} INTO B WHERE(zt^=.);  /* 将a1中变量zt和index值(不含第读入矩阵B */
READ ALL VAR{xt} INTO Yn WHERE(zt^=.);   /* 将a1中变量xt矩阵Yn */
ahat = INV(B`* B)* B`*Yn;      /* 计算参数矩阵^a=[a,u]T=[BTB]-1BTYn */
ahatt = ahat`;na = {a u};      /* 将参数矩阵转置 */
CREATE a2 FROM ahatt[COLNAME=na];    /* 用转置后的参数矩阵数据建立SAS数据集a2 */
APPEND FROM ahatt;        /* 将数据读入到数据集 */
QUIT;           /* 退出IML模块 */
DATA a3;
SET a2;index = 1;
DATA a4;
SET a1; IF _N_ = 1;xt0 = xt ;
KEEP xt0 index;
DATA a5;
MERGE a1 a3 a4; BY index;
IF _N_ = 1 THEN xp = xt;      /* x(0)(1) = x(0)(1) */
ELSE DO
  yt1=(xt0-u/a)*EXP(-a*(t-1))+u/a;    /* 计算^x(1)(k) =[x(0)(k)-u/a]e-a(k-1)+u/a */
  yt0=(xt0-u/a)*EXP(-a*(t-2))+u/a;    /* 计算^x(1)(k-1) = [x(0)(k)-u/a]e-a(k-2)+u/a */
  xp=yt1-yt0;         /* 计算预测值^x(0)(k) = [x(1)(k)]-x(1)(k-1)*/
END;
error = xp - xt;        /* 计算绝对误差 */
rerror = error/xt*100;       /*计算相对误差*/
DROP yt index zt yt1 yt0 xt0;
PROC PRINT DATA = a5;       /* 输出计算结果 */
RUN;           /* 运行上述程序* /

二维码

扫码加我 拉你入群

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

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

关键词:sas数据集 Create append Index Error SAS 救助 纠错

沙发
yongyitian 发表于 2009-4-25 23:07:00 |只看作者 |坛友微信交流群
可能是 else do 后少一个 ;
改成 else do; 试试看。

使用道具

藤椅
liuyueying 发表于 2009-4-25 23:44:00 |只看作者 |坛友微信交流群

SAS救助纠错!!

加了;也不行啊。。。

使用道具

板凳
yongyitian 发表于 2009-4-26 00:45:00 |只看作者 |坛友微信交流群

再试试看。我的机子上运行没问提。这里是log 文件

1    data a1;                                                         
2    input t year xt;                                                
3    yt+xt;                                                            
4    index=1; zt=-(yt+lag(yt))/2;                            
5    datalines;

NOTE: Missing values were generated as a result of performing an operation on missing values.
      Each place is given by: (Number of times) at (Line):(Column).
      1 at 4:17
NOTE: The data set WORK.A1 has 12 observations and 6 variables.
NOTE: DATA statement used (Total process time):
      real time           0.64 seconds
      cpu time            0.03 seconds

18   ;

19   proc print data=a1; run;

NOTE: There were 12 observations read from the data set WORK.A1.
NOTE: PROCEDURE PRINT used (Total process time):
      real time           0.29 seconds
      cpu time            0.00 seconds

20   PROC IML;                                                       
NOTE: IML Ready
21   USE a1;
21 !                                                                   
22   READ ALL VAR{zt index} INTO B WHERE(zt^=.);
22 !                                              
23   READ ALL VAR{xt} INTO Yn WHERE(zt^=.);
23 !                                              
24   ahat = INV(B`* B)* B`*Yn;
24 !                                                         
25   ahatt = ahat`;
25 !               na = {a u};
25 !                                                           
26   CREATE a2 FROM ahatt[COLNAME=na];
26 !                                               
27   APPEND FROM ahatt;
27 !                                                          
28   QUIT;
NOTE: Exiting IML.
NOTE: The data set WORK.A2 has 1 observations and 2 variables.
NOTE: PROCEDURE IML used (Total process time):
      real time           0.29 seconds
      cpu time            0.03 seconds


29   proc print data=a2; run;

NOTE: There were 1 observations read from the data set WORK.A2.
NOTE: PROCEDURE PRINT used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds

30   DATA a3;
31   SET a2;index = 1;

NOTE: There were 1 observations read from the data set WORK.A2.
NOTE: The data set WORK.A3 has 1 observations and 3 variables.
NOTE: DATA statement used (Total process time):
      real time           6.21 seconds
      cpu time            0.12 seconds


32   DATA a4;
33   SET a1; IF _N_ = 1;xt0 = xt ;
34   KEEP xt0 index;

NOTE: There were 12 observations read from the data set WORK.A1.
NOTE: The data set WORK.A4 has 1 observations and 2 variables.
NOTE: DATA statement used (Total process time):
      real time           21.15 seconds
      cpu time            0.53 seconds


35   DATA a5;
36   MERGE a1 a3 a4; BY index;
37   IF _N_ = 1 THEN xp = xt;                              
38   ELSE DO;
39    yt1=(xt0-u/a)*EXP(-a*(t-1))+u/a;               
40    yt0=(xt0-u/a)*EXP(-a*(t-2))+u/a;               
40 ! */
41     xp=yt1-yt0;                                           
42   END;
43   error = xp - xt;                                             
44   rerror = error/xt*100;                                   
45   DROP yt index zt yt1 yt0 xt0;

NOTE: There were 12 observations read from the data set WORK.A1.
NOTE: There were 1 observations read from the data set WORK.A3.
NOTE: There were 1 observations read from the data set WORK.A4.
NOTE: The data set WORK.A5 has 12 observations and 8 variables.
NOTE: DATA statement used (Total process time):
      real time           5.18 seconds
      cpu time            0.17 seconds


46   PROC PRINT DATA = a5;                               
47   RUN;

NOTE: There were 12 observations read from the data set WORK.A5.
NOTE: PROCEDURE PRINT used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


46   PROC PRINT DATA = a5;                               
47   RUN;

NOTE: There were 12 observations read from the data set WORK.A5.
NOTE: PROCEDURE PRINT used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds

使用道具

报纸
liuyueying 发表于 2009-4-26 10:35:00 |只看作者 |坛友微信交流群

SAS救助纠错!!

我试过几次,在别人电脑上也试过,为什么还是不行呢?

使用道具

地板
yongyitian 发表于 2009-4-26 11:02:00 |只看作者 |坛友微信交流群

看不出哪里还有问题。 这里是运行结果(proc print; data=a5; run;),看看对不对。
  Obs     t    year      xt         A            U          xp          error     rerror

       1     1    1990    24395    -0.028569    24543.39    24395.00       0.000     0.00000
       2     2    1991    25286    -0.028569    24543.39    25604.33     318.331     1.25892
       3     3    1992    26901    -0.028569    24543.39    26346.36    -554.635    -2.06176
       4     4    1993    27339    -0.028569    24543.39    27109.90    -229.097    -0.83798
       5     5    1994    27871    -0.028569    24543.39    27895.57      24.570     0.08816
       6     6    1995    28721    -0.028569    24543.39    28704.01     -16.994    -0.05917
       7     7    1996    29728    -0.028569    24543.39    29535.87    -192.129    -0.64629
       8     8    1997    30067    -0.028569    24543.39    30391.84     324.843     1.08040
       9     9    1998    30791    -0.028569    24543.39    31272.62     481.623     1.56417
      10    10    1999    31284    -0.028569    24543.39    32178.93     894.929     2.86066
      11    11    2000    33716    -0.028569    24543.39    33111.50    -604.501    -1.79292
      12    12    2001    34558    -0.028569    24543.39    34071.10    -486.903    -1.40894

使用道具

7
532884770 发表于 2013-1-11 14:02:35 |只看作者 |坛友微信交流群
ELSE DO
  yt1=(xt0-u/a)*EXP(-a*(t-1))+u/a;    /* 计算^x(1)(k) =[x(0)(k)-u/a]e-a(k-1)+u/a */
  yt0=(xt0-u/a)*EXP(-a*(t-2))+u/a;    /* 计算^x(1)(k-1) = [x(0)(k)-u/a]e-a(k-2)+u/a */
  xp=yt1-yt0;         /* 计算预测值^x(0)(k) = [x(1)(k)]-x(1)(k-1)*/
END;
改成
ELSE DO;
yt1=(xt0-u/a)*EXP(-a*(t-1))+u/a;    /* 计算^x(1)(k) =[x(0)(k)-u/a]e-a(k-1)+u/a */
yt0=(xt0-u/a)*EXP(-a*(t-2))+u/a;    /* 计算^x(1)(k-1) = [x(0)(k)-u/a]e-a(k-2)+u/a */
xp=yt1-yt0;         /* 计算预测值^x(0)(k) = [x(1)(k)]-x(1)(k-1)*/
END;
OK了

使用道具

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

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

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

GMT+8, 2024-4-28 12:37