在SAS中如何计算曲线下的面积

时间:2016-11-02 09:19:31

标签: sas

我想使用以下数据计算SAS曲线下面积:

MeasNo  X   Y    ASN
1   10  20        1
2   12  22        1
3   13  21        1
4   14  25        1
5   11  18        1
6   15  21        1
7   13  19        1
8   12  22        1
9   11  18        1
10  10  22        1
1   11  21        2
2   13  24        2
3   12  22        2
4   15  24        2
5   12  19        2
6   14  20        2
7   111 18        2
8   14  25        2
9   13  20        2
10  10  21        2

我试过这种方式..

data work.forArea; 
 set WORK.myData; 

 Lag_X=lag(X);
 Lag_Y=lag(Y);

 xDiff = X - Lag_X;  /* width of rectangle */
 areaRect = xDiff * (Y + Lag_Y)/2; /* multiply width by mean of height of two consecutive measurement (rectangles)*/ 

if first.MeasNo /*consecutive measurements */
    then do; /* There is no rectangle for a subject’s first... */ 
        Lag_X = .; /* ...data point alone. Be sure not to use the... */ 
        Lag_Y = .; /* ...last data point from the previous rect. */ 
        xDiff = .; 
        areaRect = .; 
    end; 
 run; 

我没有按预期得到结果。当MeasNo = 1时,X和Y的滞后应该重置,而不是在MeasNo = 10时保持对X和Y的先前值的影响。

有人可以帮忙吗?

我也试过以下,这有效......

 data work.forArea3; 
 set WORK.forArea4; 
 if ( _N_ = 1) then do;
   variable=0;
   Lag_Y=0;
   Lag_X=0;
   xDiff=0;  
   areaRect=0; 
 end;
 run;

但是下面的代码不起作用......

 data work.forArea5; 
  set WORK.forArea3; 
 if (ASN NE lag1(ASN) and MeasNo=1) then do;
     Lag_Y=0;
     Lag_X=0;
     xDiff = 0; 
     areaRect = 0; 
   end; else do;
 if (ASN = lag1(ASN) and MeasNo>=2) then do;
    Lag_Y=lag1(Y);
     Lag_X=lag1(X);
     xDiff = X - Lag_X; 
     areaRect = xDiff * (Y + Lag_Y)/2;
  end; else do;
 end;
 end;
 run; 

1 个答案:

答案 0 :(得分:1)

我不确定我理解你的逻辑,但如果你想要的是每个ASN组的第一条记录缺少区域,我想下面会这样做。

我通常计算条件块之外的滞后,然后有条件地使用它们。

请注意,存在负面区域,因为x有时会减少。也许你想添加ABS()函数来计算xDiff的计算中的绝对值。

如果这不是您想要的输出,请将其添加到您的问题中。

92   data work.forArea;
93    set WORK.myData;
94    by ASN;
95
96    Lag_X=lag(X);
97    Lag_Y=lag(Y);
98
99    if first.ASN=0
100      then do;
101        xDiff = X - Lag_X;
102        areaRect = xDiff * (Y + Lag_Y)/2;
103      end;
104   put (ASN X Y areaRect)(=);
105  run;

ASN=1 X=10 Y=20 areaRect=.
ASN=1 X=12 Y=22 areaRect=42
ASN=1 X=13 Y=21 areaRect=21.5
ASN=1 X=14 Y=25 areaRect=23
ASN=1 X=11 Y=18 areaRect=-64.5
ASN=1 X=15 Y=21 areaRect=78
ASN=1 X=13 Y=19 areaRect=-40
ASN=1 X=12 Y=22 areaRect=-20.5
ASN=1 X=11 Y=18 areaRect=-20
ASN=1 X=10 Y=22 areaRect=-20
ASN=2 X=11 Y=21 areaRect=.
ASN=2 X=13 Y=24 areaRect=45
ASN=2 X=12 Y=22 areaRect=-23
ASN=2 X=15 Y=24 areaRect=69
ASN=2 X=12 Y=19 areaRect=-64.5
ASN=2 X=14 Y=20 areaRect=39
ASN=2 X=111 Y=18 areaRect=1843
ASN=2 X=14 Y=25 areaRect=-2085.5
ASN=2 X=13 Y=20 areaRect=-22.5
ASN=2 X=10 Y=21 areaRect=-61.5