PROC IML中的梯形规则

  • 本文关键字:规则 IML PROC sas
  • 更新时间 :
  • 英文 :


构建一个使用梯形规则计算积分("曲线下面积")的IML模块tr。模块应接受矢量xy作为输入参数,并返回auc的值。通过如下方式显示你的模块可以工作:

x = do(-2,5,0.01);         
print "Integral of a over x is" ( tr(x,0#x+1) );         
print "Integral of b over x is" ( tr(x,1#x) );         
print "Integral of c over x is" ( tr(x,x##2) );        
print "Integral of d over x is" ( tr(x,abs(x)) );         
print "Integral of y over x is" ( tr(x,sin(x##2)) );         
print "Integral of z over x is" ( tr(x,log(2+exp(x))) ); 
下面是我的代码:
proc iml;
start tr(x, y);
    do i=1 to 2000;
    auc = (sum(x[i]-(x[i-1]))#(y[i]+(y[i-1])))/2;
    return (auc);
    end;
finish;

当我尝试运行提供的验证码时,我得到下标无效或过期的错误消息。这意味着什么,我如何修复我的代码,使其工作?

x只有一行,通过添加'。

这里有几个问题。首先,如果参数作为矢量传递,则不需要在模块中进行循环。其次,您从1索引i,但您使用i-1,当i =1时,其值为0。这会导致一个下标错误,因为IML向量是从1开始索引的,而不是像c中的0。当xy的长度大于2000时,你也会得到一个下标错误,因为你引用的向量的元素不存在。

这是一种获取所需信息的简洁方式:

proc iml;
    start tr(x, y);
        i = 2:ncol(x);
        return( (x[i] - x[i-1])` * (y[i] + y[i-1]) / 2 );
    finish;
    <verification code goes here>
quit;

这是这个问题的重复,但是在这个帖子中没有对这个问题的支持或接受的答案,所以我无法将其标记为重复。甚至是在同一天发布的

还有,这闻起来像家庭作业。如果是家庭作业,请在帖子中注明。

最新更新