每个研究对象都有一个基线。一旦该值与基准之间的差值超过5,该值将成为所有未来比较的基准,直到另一个值超过此新基线5为止。
这就是我希望输出数据看起来的样子:

这就是我要得到的

这是我目前的代码,它让我和我尝试过的任何东西一样接近。我尝试了不同的组合保留,滞后()和干扰素(suggested in this post)
Data Have;
Input Visit usubjid Baseline Value;
datalines;
1 1 112.2 112.2
2 1 112.2 113.7
3 1 112.2 112
3 1 112.2 108
4 1 112.2 109
5 1 112.2 107
7 1 112.2 106
8 1 112.2 107
;
run;
proc sort;by usubjid;run;
data want;
Length chg $71;
retain chg;
set Have;
length prevchg $71;
by usubjid;
prevchg=chg;
if first.usubjid then do; prevchg=''; end;
baseline=ifn(prevchg in ('Increase >= 5mm New', "Decrease >= 5mm"),lag(value),lag(baseline));
diff = value-baseline;
if visit > 1 then do;
if diff > 5 then do; chg='Increase >= 5mm New'; order = 3; end;
else if diff < -5 then do; chg = 'Decrease >= 5mm'; order = 6; end;
else if -5 <= diff <= 5 then do;
if prevchg in('Increase >= 5mm New', 'Increase > 5mm Persistent') then do; chg ='Increase > 5mm Persistent'; order = 4; end;
else do; chg = 'No Change (change >= -5 and <= 5mm)'; order = 5; end;
end;
end;
run;现在,代码将正确地将基线更新为下一次访问的前一个值,然后直接回到原来的基线。我确信这与延迟()的方式有关,并且与if/然后保持工作有关,但我无法找到解决方案。下面是这个问题的一个例子:
发布于 2022-04-20 02:42:51
你应该能轻松地做到这一点。如果要保留基线变量的值,则不能在输入中。
data want ;
set have ;
by usubjid;
retain baseline;
if first.usubjid then baseline=value;
difference = baseline - value;
output;
if difference > 5 then baseline=value;
run;https://stackoverflow.com/questions/71932654
复制相似问题