PROC IML中的梯形规则

时间:2014-05-09 12:58:39

标签: 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;

当我尝试运行提供的验证码时,我收到下标无效或过期的错误消息。这是什么意思,我如何修复我的代码以使其有效?

2 个答案:

答案 0 :(得分:0)

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

转置你的x

答案 1 :(得分:0)

这里有几个问题。首先,如果参数作为向量传递,则不需要在模块的旁边进行循环。其次,您将i从1编入索引,但使用i-1i = 1时评估为0。这会导致下标错误,因为IML向量从1开始索引,而不是像C一样索引。当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;

这是this question的副本,但在此帖子中没有对该问题的投票或接受答案,因此我无法将其标记为重复。它甚至在同一天发布。

此外,这闻起来像家庭作业。如果是家庭作业,请在帖子中提及。