SAS中文论坛

标题: 请求高人指点一段简单的代码的隐藏很深的错误 [打印本页]

作者: shiyiming    时间: 2009-8-8 14:00
标题: 请求高人指点一段简单的代码的隐藏很深的错误
%macro ema(n1=);

data t.index_m;

do readit=2 to totobs ;
set t.index_m2 point=readit nobs=totobs;
leam1=lag(ema1_&n1);

ema1_&n1=(2*point+%eval(&n1-1)*leam1)/%eval(&n1+1);

output;
drop leam1 ;
end;


stop;
run;
%mend;

%ema(n1=12)

请求达人帮我看看这段代码的问题。
计算说明:

t.index_m2 数据集中已有变量date,ema1_12,point ,已按时间顺序排好序,要求从该数据集的第二个观测起重新计算ema12
计算规则:
今日ema12=前一日ema12*(12-1)/(12+1) +2/(12+1)*point
我写了上面的代码却发现计算结果不对,请求高人指点,不胜感激!!
作者: shiyiming    时间: 2009-8-8 17:14
标题: Re: 请求高人指点一段简单的代码的隐藏很深的错误
我觉得好象没必要使用DO循环来控制读取的观测,看看数对不?
[code:2swv4c8y]%macro ema(n1=);
        data final;
                set original;
                leam1=lag(ema1_&n1);
                if _n_>1 then do;
                        ema1_&n1=(2*point+%eval(&n1-1)*leam1)/%eval(&n1+1);
                        /*output; */
                end;
                drop leam1 ;
        run;
%mend;

%ema(n1=12)
[/code:2swv4c8y]
作者: shiyiming    时间: 2009-8-8 18:57
标题: Re: 请求高人指点一段简单的代码的隐藏很深的错误
谢谢回复,但还是不对
作者: shiyiming    时间: 2009-8-8 19:33
标题: Re: 请求高人指点一段简单的代码的隐藏很深的错误
哪不对,能贴2行数据吗?
作者: shiyiming    时间: 2009-8-8 20:14
标题: Re: 请求高人指点一段简单的代码的隐藏很深的错误
DATA A;
DO I=1 TO 20;

D=INTNX('MONTH','01JAN1975'D,I-1);
EM_12=I;P=2*I;FORMAT D DATE9.;
OUTPUT;
END;
RUN;

PROC PRINT;RUN;
PROC SORT;
BY  D;
RUN;

%macro ema(n1=);
data A ;
if _n_ >1 then do;
set A   ;
leam1=lag(em_&n1);
ema1_&n1=(2*p+%eval(&n1-1)*leam1)/%eval(&n1+1);

drop leam1 ;
end;

%mend;

%ema(n1=12)

proc print data=a;run;


你运行下这段代码,然后把结果导到excel里面验证一下
作者: shiyiming    时间: 2009-8-8 20:16
标题: Re: 请求高人指点一段简单的代码的隐藏很深的错误
DATA A;
DO I=1 TO 20;

D=INTNX('MONTH','01JAN1975'D,I-1);
EM_12=I;P=2*I;FORMAT D DATE9.;
OUTPUT;
END;
RUN;

PROC PRINT;RUN;
PROC SORT;
BY  D;
RUN;

%macro ema(n1=);
这一段吧



data A ;
set A   ;
if _n_ >1 then do;

leam1=lag(em_&n1);
ema1_&n1=(2*p+%eval(&n1-1)*leam1)/%eval(&n1+1);

drop leam1 ;
end;

%mend;

%ema(n1=12)

proc print data=a;run;
作者: shiyiming    时间: 2009-8-8 20:34
标题: Re: 请求高人指点一段简单的代码的隐藏很深的错误
你运行的语句好象跟我写的不太一样,下面的MACRO用你给的数据验算过了.
[code:25tirp0a]%macro ema(n1=);
        data A ;
                set A ;
                leam1=lag(em_&n1);
                if _n_ >1 then do;
                        ema1_&n1=(2*p+%eval(&n1-1)*leam1)/%eval(&n1+1);
                        /* output; */ /* 如果不想在结果数据集中显示第一条记录的话就解除注释 */
                end;
                drop leam1 ;
        run;
%mend;

%ema(n1=12)[/code:25tirp0a]
作者: shiyiming    时间: 2009-8-8 20:59
标题: Re: 请求高人指点一段简单的代码的隐藏很深的错误
谢了兄弟。
作者: shiyiming    时间: 2009-8-8 21:05
标题: Re: 请求高人指点一段简单的代码的隐藏很深的错误
<!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> 客气,SET语句的point选项我很少用,你要不提我都不记得了.
作者: shiyiming    时间: 2009-8-8 21:37
标题: Re: 请求高人指点一段简单的代码的隐藏很深的错误
Hopewell 兄弟,还是不行啊。你刚才验证的时候可能用错列了。再运行下这个段代码,这个问题愁了我两天了。一定要帮忙啊


[code:a2eo3i87]
DATA A;
DO I=1 TO 20;

D=INTNX('MONTH','01JAN1975'D,I-1);
EMa1_12=I;P=2*I;FORMAT D DATE9&#46;;
OUTPUT;
END;
RUN;

PROC PRINT;RUN;
PROC SORT;
BY D;
RUN;





%macro ema(n1=);
   data A ;
      set A ;
      leam1=lag(ema1_&amp;n1);
      if _n_ &gt;1 then do;
         ema1_&amp;n1=(2*p+%eval(&amp;n1-1)*leam1)/%eval(&amp;n1+1);
         /* output; */ /* 如果不想在结果数据集中显示第一条记录的话就解除注释 */
      end;
      drop leam1 ;
   run;
%mend;

%ema(n1=12)[/code:a2eo3i87]
作者: shiyiming    时间: 2009-8-9 18:14
标题: Re: 请求高人指点一段简单的代码的隐藏很深的错误
<!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2