2016-11-02 6 views
0

Я хочу вычисленной площади под кривой в 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 должна быть сброшена, вместо того, чтобы оставаться в соответствии с предыдущим значением X и Y при MeasNo = 10.

Не могли бы вы помочь?

Я также попытался ниже, который работал ...

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

Попробуйте '_N_ = 1' вместо' first.MeasNo'. –

+1

Попробуйте 'if MeasNo = 1' вместо' first.MeasNo'. Но также изучите использование proc логистики для вычисления AUC. – Quentin

+0

Спасибо, Роберт и @Quentin .. Нет, я не хочу использовать proc логистики, мои требования немного разные, мне жаль, что я не могу писать здесь. – ZeekDSA

ответ

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 
Смежные вопросы