SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 775|回复: 0
打印 上一主题 下一主题

救助关于灰色模型的代码问题!

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-4-25 20:30:01 | 只看该作者

救助关于灰色模型的代码问题!

是关于灰色预测模型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 */
[color=#FF0000:18t9obf5]ERROR: 名称   yt1 不是有效的 SAS 名称[/color:18t9obf5]。
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 */
[color=#FF0000:18t9obf5]ERROR: 名称   yt0 不是有效的 SAS 名称。[/color:18t9obf5]
39     xp=yt1-yt0;                                 /* 计算预测值^x(0)(k) = [x(1)(k)]-x(1)(k-1)*/
[color=#FF0000:18t9obf5]ERROR: 名称   xp 不是有效的 SAS 名称。[/color:18t9obf5]
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=[B'B]**-1B'Yn */
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;                                                /* 运行上述程序* /
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 15:49 , Processed in 0.079315 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表