首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何计算随着时间推移而转换治疗的人数

如何计算随着时间推移而转换治疗的人数
EN

Stack Overflow用户
提问于 2020-04-05 23:28:03
回答 3查看 342关注 0票数 0

我有一个数据集的参与者,谁是治疗A或治疗B,并在不同的时间间隔随访。例如,参与者1可能在第0个月(基线),然后在第2、6和12个月进行访问,但参与者2可能只是在基线和第6个月进行访问,我想知道如何计算在任何后续访问中从一种治疗转向另一种治疗的人数。我知道这应该很简单,但由于后续访问对每个人来说都不一样,我似乎不知道如何处理一些参与者丢失的数据。

下面是我的数据和我一直在努力做的事情的一个例子。您可以从数据中看到,只有参与者1和5在跟踪期间切换了治疗,但是我创建的变量“计数”(如果参与者不切换,则值0)和值1(如果他们确实切换)在任何地方都会得到值1。

代码语言:javascript
运行
复制
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;

如有任何帮助/建议,将不胜感激。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-06 10:08:54

没有一个PATID具有每个VISNO,因此每个转置行至少有一个缺少值的列(对应于BY组中不存在的VISNOs )。缺少的值不等于组中存在的任何VISNO TRT,因此行中的TRT相等值永远不会断言为true,从而导致每行都包含count=1

假设您想要一个具有多个处理方法的PATID计数,那么一个SQL查询就可以提供这个功能。

示例:

代码语言:javascript
运行
复制
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步骤可以计算相同的计数。

示例:

代码语言:javascript
运行
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2020-04-07 23:56:12

我们可以使用滞后函数来查找前一次访问的处理,然后检查所有行,如果处理不等于前一次处理。为此,让我们按照以下方式创建示例数据集:

代码语言:javascript
运行
复制
 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从领先的访问:

代码语言:javascript
运行
复制
 proc sort data=example;
        by PATID visno;
    run;

现在,让我们在最后一次访问中找到每个PATID的治疗方法。这里使用lag1,它查找前面的处理,并将值存储到一个新的字段PREV_TRT中。语句以确保每个PATID的第一行没有PREV_TRT值。

代码语言:javascript
运行
复制
data lagged_example;
    set example;
    by PATID;
    PREV_TRT=lag1(TRT);

    if first.PATID then
        PREV_TRT='';
run;

最后,我们使用proc创建一个表followup_trt_change,该表具有所有的行,与每次PATID的前一次访问相比,这些行的处理方式都发生了变化。请注意,此步骤是可选的。

代码语言:javascript
运行
复制
proc sql;
    create table followup_trt_change as select * from lagged_example where 
        TRT <> PREV_TRT and not missing(PREV_TRT);
quit;

以下是所有至少一次改变治疗方式的PATID。

代码语言:javascript
运行
复制
 proc sql;
        select distinct PATID from lagged_example where TRT <> PREV_TRT and not 
            missing(PREV_TRT);
    quit;
票数 1
EN

Stack Overflow用户

发布于 2020-04-08 00:01:06

如果您只想在访问过程中的任何时候找到改变治疗的PATID(不一定是上次访问的时候),这意味着在访问期间至少有两次治疗的PATID,您可以简单地使用以下方法:

代码语言:javascript
运行
复制
proc sql;
select PATID
from example
group by PATID
having count(distinct TRT) >=2
;
quit;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61050838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档