如何计算随时间改变治疗的人数 SAS
how to count number of people who switch treatments over time SAS
我有一个数据集,其中包含接受治疗 A 或治疗 B 的参与者,并在不同的时间间隔进行随访。例如,参与者 1 可能在第 0 个月(基线)和第 2、6 和 12 个月进行访问,但参与者 2 可能仅在基线和第 6 个月等进行访问。我想知道如何计算人数谁在任何后续访问期间从一种治疗转换为另一种治疗。我知道这应该很简单,但是因为每个人的后续访问都不一样,我似乎无法弄清楚如何处理某些参与者的缺失数据。
这是我的数据示例以及我一直在尝试做的事情。正如您从数据中看到的那样,只有参与者 1 和 5 在他们的随访期间切换了治疗,但我创建的变量 "count" 如果参与者不切换则取值 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;
任何 help/suggestions 将不胜感激。
谢谢!
没有 PATID
包含每个 VISNO
,因此每个转置行至少有一个列有缺失值(对应于不存在的 VISNO
BY
组)。缺失值不等于组中存在的任何 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;
类似地,对于预排序的数据,使用 DOW 处理的 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;
我们可以使用滞后函数从上次访问中找到治疗,如果治疗不等于之前的治疗,然后检查所有行。为此,让我们创建示例数据集,如下所示:
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。 if 语句是为了确保每个 PATID 的第一行没有 PREV_TRT 值。
data lagged_example;
set example;
by PATID;
PREV_TRT=lag1(TRT);
if first.PATID then
PREV_TRT='';
run;
最后,我们使用 proc sql 创建一个 table 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;
如果您只是想找到在就诊过程中随时更改治疗的 PATID(不一定是从上次就诊开始),这意味着在就诊期间至少进行过两次治疗的 PATID,您可以简单地使用以下:
proc sql;
select PATID
from example
group by PATID
having count(distinct TRT) >=2
;
quit;
我有一个数据集,其中包含接受治疗 A 或治疗 B 的参与者,并在不同的时间间隔进行随访。例如,参与者 1 可能在第 0 个月(基线)和第 2、6 和 12 个月进行访问,但参与者 2 可能仅在基线和第 6 个月等进行访问。我想知道如何计算人数谁在任何后续访问期间从一种治疗转换为另一种治疗。我知道这应该很简单,但是因为每个人的后续访问都不一样,我似乎无法弄清楚如何处理某些参与者的缺失数据。
这是我的数据示例以及我一直在尝试做的事情。正如您从数据中看到的那样,只有参与者 1 和 5 在他们的随访期间切换了治疗,但我创建的变量 "count" 如果参与者不切换则取值 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;
任何 help/suggestions 将不胜感激。
谢谢!
没有 PATID
包含每个 VISNO
,因此每个转置行至少有一个列有缺失值(对应于不存在的 VISNO
BY
组)。缺失值不等于组中存在的任何 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;
类似地,对于预排序的数据,使用 DOW 处理的 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;
我们可以使用滞后函数从上次访问中找到治疗,如果治疗不等于之前的治疗,然后检查所有行。为此,让我们创建示例数据集,如下所示:
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。 if 语句是为了确保每个 PATID 的第一行没有 PREV_TRT 值。
data lagged_example;
set example;
by PATID;
PREV_TRT=lag1(TRT);
if first.PATID then
PREV_TRT='';
run;
最后,我们使用 proc sql 创建一个 table 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;
如果您只是想找到在就诊过程中随时更改治疗的 PATID(不一定是从上次就诊开始),这意味着在就诊期间至少进行过两次治疗的 PATID,您可以简单地使用以下:
proc sql;
select PATID
from example
group by PATID
having count(distinct TRT) >=2
;
quit;