SAS Proc IML滚动窗口(循环)
我想将下面给出的这个工作模块修改为上面的模块,目的是,该模块不使用从1到m的整个p样本,而只使用时间点x附近的前18个和后18个值。所以p(x-18…x+18)。但我最终犯了错误,无法真正理解问题出在哪里。在post末尾显示整个命令行的错误消息SAS Proc IML滚动窗口(循环),sas,sas-iml,Sas,Sas Iml,我想将下面给出的这个工作模块修改为上面的模块,目的是,该模块不使用从1到m的整个p样本,而只使用时间点x附近的前18个和后18个值。所以p(x-18…x+18)。但我最终犯了错误,无法真正理解问题出在哪里。在post末尾显示整个命令行的错误消息 start mhatx2(m,p,h,pi,e); t5=j(m,1); /*mhatx omit x=t*/ upb=m-18; do x=19 to upb; lo=x-18; up=x+18; i=T(lo:up
start mhatx2(m,p,h,pi,e);
t5=j(m,1); /*mhatx omit x=t*/
upb=m-18;
do x=19 to upb;
lo=x-18;
up=x+18;
i=T(lo:up);
temp1=x-i;
ue=Kmod(temp1,h,pi,e)#p[i];
le=Kmod(temp1,h,pi,e);
t5[x]=(sum(ue)-ue[x])/(sum(le)-le[x]);
end;
return (t5);
finish;
start mhatx2(m,p,h,pi,e);
t5=j(m,1); /*mhatx omit x=t*/
do x=1 to nrow(p);
i=T(1:m);
temp1=x-i;
ue=Kmod(temp1,h,pi,e)#p[i];
le=Kmod(temp1,h,pi,e);
t5[x]=(sum(ue)-ue[x])/(sum(le)-le[x]);
end;
return (t5);
finish;
错误消息:
430 proc iml;
NOTE: IML Ready
431
432
433 EDIT kirjasto.basfraaka var "open";
434
435 read all var "open" into p;
436
437
438 m=nrow(p);
439 x=T(1:m);
440 pi=constant("pi");
441 e=constant("e");
442
443 h=0.75;
444
445 start Kmod(x,h,pi,e);
446 k=1/(h#(2#pi)##(1/2))#e##(-x##2/(2#h##2));
447 return (k);
448 finish;
NOTE: Module KMOD defined.
449 start mhatx2(m,p,h,pi,e);
450 t5=j(m,1);
450! /*mhatx omit x=t*/
451 upb=m-18;
452 do x=19 to upb;
453 lo=x-18;
454 up=x+18;
455 i=T(lo:up);
456 temp1=x-i;
457 ue=Kmod(temp1,h,pi,e)#p[i];
458 le=Kmod(temp1,h,pi,e);
459 t5[x]=(sum(ue)-ue[x])/(sum(le)-le[x]);
460 end;
461 return (t5);
462 finish;
NOTE: Module MHATX2 defined.
463
464 ptz=j(m,1);
465 ptz=mhatx2(m,p,h,pi,e);
ERROR: (execution) Invalid subscript or subscript out of range.
operation : [ at line 459 column 18
operands : ue, x
ue 37 rows 1 col (numeric)
x 1 row 1 col (numeric)
38
statement : ASSIGN at line 459 column 1
traceback : module MHATX2 at line 459 column 1
NOTE: Paused in module MHATX2.
466 print ptz;
ERROR: Matrix ptz has not been set to a value.
statement : PRINT at line 466 column 1
看起来是这样的:
t5[x]=(sum(ue)-ue[x])/(sum(le)-le[x]);
未正确引用ue和le成员。如果您试图减去“当前迭代”部分,那么您需要
t5[x]=(sum(ue)-ue[19])/(sum(le)-le[19]);
因为这是范围的“中间”(对应于当前的x
值)