data auc;
input time conc;
obs=_n_;
datalines;
0 0
0.5 0.12
1 1.85
1.5 2.92
2 1.85
3 0.99
4 0.73
6 0.42
8 0.19
run;
proc sql;
create table cmax as
select obs, conc as cmax
from auc
having conc=max(conc)
;quit;
proc sql;
select a1.time, a1.conc, a0.conc, cmax.cmax,
(a1.time-a0.time)*(a1.conc+a0.conc)/2 as linear,
case when a1.conc*a0.conc then (a1.time-a0.time)*(a1.conc-a0.conc)/log(a1.conc/a0.conc)
else calculated linear end as log,
sum(calculated linear) as auc_linear,
sum(calculated log) as auc_log,
sum((a1.obs<=cmax.obs)*calculated linear+(a1.obs>cmax.obs)*calculated log) as auc,
sum((a1.conc>=a0.conc)*calculated linear+(a1.conc<a0.conc)*calculated log) as auc_up_down
from auc as a0
left join auc as a1 on a0.obs+1=a1.obs
left join (select obs, cmax from cmax having obs=min(obs)) as cmax on a0.conc<=cmax.cmax
where a1.time is not missing
;quit;