用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; /* 运行上述程序* /