全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2767 4
2010-06-04
%macro mll(n,a0,a1,a2,a3,a4,a5,sigs);
data yca0 ;
x1=0;x2=0;x3=0;x4=0;x5=0;
do i=1 to &n;
u=&sigs*normal(0);
jqy=&a0+&a1*x1**(1/3)+&a2*x2**(1/3)+&a3*x3**(1/3)+
&a4*x4**(1/3)+&a5*x5**(1/3);
y=jqy+u;
output;
x5=x4;
x4=x3;
x3=x2;
x2=x1;
x1=y;end;
keep x1-x5  y jqy;
run;
%mend mll(n,a0,a1,a2,a3,a4,a5,sigs);
%mll(200,0.8,0.1,0.4,0.2,0.7,0.8,1);
proc print;run;
该程序只要当y为负值时,后面的观测都是缺省值,同时log窗口显示:
Invalid argument(s) to the exponential operator "**" at line 1 column 89.
x1=. x2=. x3=. x4=. x5=. i=201 u=-0.107342764 jqy=. y=. _ERROR_=1 _N_=1
但又不是红字表示。如果y是正的,就不会有问题,按道理说,即使y是负的,到下一个观测x1为负也能开3次方根的,但为什么就不能运行,请高手赐教
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2010-6-4 10:10:35
%macro mll(n,a0,a1,a2,a3,a4,a5,sigs);

data yca0 ;
    x1=0;x2=0;x3=0;x4=0;x5=0;
       
    do i=1 to &n;
                u=&sigs*normal(0);

                jqy=&a0+&a1*sign(x1)*abs(x1)**(1/3)+&a2*sign(x2)*abs(x2)**(1/3)
               +&a3*sign(x3)*abs(x3)**(1/3)+&a4*sign(x4)*abs(x4)**(1/3)
               +&a5*sign(x5)*abs(x5)**(1/3);
                y=jqy+u;
                output;
                x5=x4;
                x4=x3;
                x3=x2;
                x2=x1;
                x1=y;
    end;
        keep x1-x5  y jqy;
run;
%mend mll;

options mprint;
%mll(200,0.8,0.1,0.4,0.2,0.7,0.8,1);
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-6-4 10:13:26
如果把符号和绝对值分开就不会报错,可能是**的原因。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-6-4 10:52:23
对于1/3次方可以这样解决

多问一句对于形如
(负数)**(小数)的表达式有什么办法,貌似SAS对于负数的小数次方一律报
NOTE:指数运算符**的参数无效。

我的想法
1 对于(任何实数)**(表达式),由于SAS从右至左执行,表达式计算结果为一个小数
2 (任何实数)**(分数)的表达式可以通过判别分数的分母的奇偶性来判别根式的有效性,负数的偶次根在实数内没有意义。但是SAS的**函数或许不具备对一个数进行"最简分式"计算的能力,故而无法判断根式的有效性,所以为了避免错误,对于所有负数的小数次方,全部报如上NOTE,并且不予以计算。纯属猜测。
3 通过代码补足这个功能......当然大多数指数为分数显式的时候,2楼的办法足矣
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-6-4 12:39:15
感谢二楼的高手,三楼给出了问题的解释,想不到SAS还是有些问题不能用常规思路来解决。再次对两位的帮助表示感谢。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群