【问题标题】:SAS Proc IML rolling window (loop)SAS Proc IML 滚动窗口(循环)
【发布时间】:2025-12-31 06:45:11
【问题描述】:

我想将下面给出的这个工作模块修改为上面的那个,目的是代替使用从 1 到 m 的整个 p 样本,该模块将仅使用时间点 x 周围的前 18 个值和下一个 18 个值。所以 p(x-18...x+18)。但我最终遇到了错误,无法真正理解问题出在哪里。帖子末尾带有整个命令行的错误消息。

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

【问题讨论】:

    标签: sas sas-iml


    【解决方案1】:

    看起来像这样一行:

    t5[x]=(sum(ue)-ue[x])/(sum(le)-le[x]);
    

    错误地引用了 ue 和 le 成员。如果你想减去“当前迭代”部分,那么你想要

    t5[x]=(sum(ue)-ue[19])/(sum(le)-le[19]);
    

    因为这是范围的“中间”(对应于当前的x 值)。

    【讨论】:

      最近更新 更多