我有一个数据集的参与者,谁是治疗A或治疗B,并在不同的时间间隔随访。例如,参与者1可能在第0个月(基线),然后在第2、6和12个月进行访问,但参与者2可能只是在基线和第6个月进行访问,我想知道如何计算在任何后续访问中从一种治疗转向另一种治疗的人数。我知道这应该很简单,但由于后续访问对每个人来说都不一样,我似乎不知道如何处理一些参与者丢失的数据。
下面是我的数据和我一直在努力做的事情的一个例子。您可以从数据中看到,只有参与者1和5在跟踪期间切换了治疗,但是我创建的变量“计数”(如果参与者不切换,则值0)和值1(如果他们确实切换)在任何地方都会得到值1。
DATA example;
input PATID TRT$ VISNO WEIGHT;
datalines;
1 A 0 95
1 A 2 96
1 B 6 96
1 B 12 99
2 A 0 80
2 A 6 81
3 A 0 98
3 A 4 120
4 B 0 100
5 A 0 102
5 B 6 95
5 A 12 98
run;
proc print data=example; run;
proc transpose data=example out=wide1 prefix=TRT;
by patid;
id visno;
var trt;
run;
proc print data = wide1; title "Transposed data";
run;
data switchcount;
set wide1;
if TRT0=TRT2=TRT6=TRT12=TRT4 then count=0;
else count=1;
run;
proc print data=switchcount;
run;
如有任何帮助/建议,将不胜感激。
谢谢!
发布于 2020-04-06 10:08:54
没有一个PATID
具有每个VISNO
,因此每个转置行至少有一个缺少值的列(对应于BY
组中不存在的VISNO
s )。缺少的值不等于组中存在的任何VISNO
TRT
,因此行中的TRT相等值永远不会断言为true,从而导致每行都包含count=1
。
假设您想要一个具有多个处理方法的PATID
计数,那么一个SQL查询就可以提供这个功能。
示例:
proc sql;
select
count(distinct patid) as result label="Number of patients with multiple treatments"
from
( select patid from example
group by patid
having count(distinct trt) > 1
)
;
quit;
同样,对于预先设定的数据,一个带有陶氏处理的DATA
步骤可以计算相同的计数。
示例:
data want(keep=result);
do until (last.patid);
set example end=done;
by patid;
if trt ne lag(trt) then switch_count = sum(switch_count, 1-first.patid);
end;
result + switch_count>0;
if done then output;
run;
发布于 2020-04-07 23:56:12
我们可以使用滞后函数来查找前一次访问的处理,然后检查所有行,如果处理不等于前一次处理。为此,让我们按照以下方式创建示例数据集:
DATA example;
input PATID TRT$ VISNO WEIGHT;
datalines;
1 A 0 95
1 A 2 96
1 B 6 96
1 B 12 99
2 A 0 80
2 A 6 81
3 A 0 98
3 A 4 120
4 B 0 100
5 A 0 102
5 B 6 95
5 A 12 98
run;
然后,我们可能需要确保示例数据集按PATID和visno排序。这是为了确保以前的治疗是为相同的PATID从领先的访问:
proc sort data=example;
by PATID visno;
run;
现在,让我们在最后一次访问中找到每个PATID的治疗方法。这里使用lag1,它查找前面的处理,并将值存储到一个新的字段PREV_TRT中。语句以确保每个PATID的第一行没有PREV_TRT值。
data lagged_example;
set example;
by PATID;
PREV_TRT=lag1(TRT);
if first.PATID then
PREV_TRT='';
run;
最后,我们使用proc创建一个表followup_trt_change,该表具有所有的行,与每次PATID的前一次访问相比,这些行的处理方式都发生了变化。请注意,此步骤是可选的。
proc sql;
create table followup_trt_change as select * from lagged_example where
TRT <> PREV_TRT and not missing(PREV_TRT);
quit;
以下是所有至少一次改变治疗方式的PATID。
proc sql;
select distinct PATID from lagged_example where TRT <> PREV_TRT and not
missing(PREV_TRT);
quit;
发布于 2020-04-08 00:01:06
如果您只想在访问过程中的任何时候找到改变治疗的PATID(不一定是上次访问的时候),这意味着在访问期间至少有两次治疗的PATID,您可以简单地使用以下方法:
proc sql;
select PATID
from example
group by PATID
having count(distinct TRT) >=2
;
quit;
https://stackoverflow.com/questions/61050838
复制相似问题