【问题标题】:Identifying the number of subjects who had treatment switch确定有治疗转换的受试者数量
【发布时间】:2016-09-06 23:07:31
【问题描述】:

嗨,SAS 的人,

我正在使用医院就诊数据进行一些研究项目。我必须确定改变治疗的受试者。

治疗分为局部治疗、非生物系统治疗和生物治疗。切换事件被定义为在最后一次治疗退出时未分配的药物的退出。有一个层次结构,最高的是生物制剂,然后是非生物系统药物,然后是局部药物。

  • 如果首先观察到患者撤出局部用药,那么此后任何撤出对生物、非生物全身或新局部治疗的治疗都是一种转换。
  • 如果首先观察到患者退出非生物系统,那么在此之后任何撤消对生物或新的非生物系统的治疗都是一种转换。
  • 退出任何主题都不是转换。
  • 如果首先观察到患者撤回生物,则只能切换到另一个生物(与第一次不同)。
  • 任何局部或非生物系统性的退出都不是一个开关。

根据上述逻辑,一旦患者切换到较高级别的治疗,较低级别的治疗将被视为伴随用药,而撤除伴随用药并不表示治疗转换。

简而言之,如果患者从较低级别的治疗转移到较高级别或具有相同级别(不同的 ATC 代码),那么它将被视为转换。

治疗层次

生物制品 > Non_Bio_Sys >局部

我正在添加示例数据集以供参考,其中包含可变信息:

LPNR: unique subjID
EDATUM: prescrition date ( treatment recieved date)
ATC_CODE: codes for each of treament type
          'D05AX52',
          'D05AX02' = PSorasis(Topical) ;

          'L01XC02',
          'L04AA24',
          'L04AB01',
          'L04AB02',
          'L04AB04',
          'L04AB05',
          'L04AB06',
          'L04AC03',
          'L04AC07' = Non_Bio_systemic ;

          'A11CC03',           
          'D05BB02',                
          'L01BA01',               
          'L01BB03',               
          'L01XX05',               
          'L04AA21',               
          'L04AD01',               
          'L04AX03' = Biologics ;
TYPE: Treatment type

样本数据:

data have;
  length TYPE $20.;
  input pnr ATC_CODE $ type $ EDATUM $ 10. ;
  date=input(edatum,mmddyy10.);
  format date mmddyy10.;
  cards;
478 L04AX03 Nonbiologic_systemic 2/10/2010 
478 D05AX52 Psoriasis 2/23/2010 
478 L04AX03 Nonbiologic_systemic 3/5/2010 
478 L04AX03 Nonbiologic_systemic 5/18/2010 
478 L04AX03 Nonbiologic_systemic 8/2/2010 
478 L04AX03 Nonbiologic_systemic 11/3/2010
478 L04AX03 Nonbiologic_systemic 2/7/2011 
478 L04AX03 Nonbiologic_systemic 8/16/2011
478 L04AX03 Nonbiologic_systemic 11/22/2011
603 D05AX02 Psoriasis 8/24/2005 
603 D05AX02 Psoriasis 10/13/2005 
603 D05AX02 Psoriasis 6/2/2006
603 D05AX02 Psoriasis 7/19/2006 
603 D05AX02 Psoriasis 4/3/2007
603 D05AX02 Psoriasis 12/7/2007 
603 D05AX02 Psoriasis 1/4/2008
603 D05AX02 Psoriasis 1/4/2008 
603 D05AX02 Psoriasis 10/2/2008
603 D05AX52 Psoriasis 3/16/2009
603 D05AX52 Psoriasis 3/16/2009
603 D05AX52 Psoriasis 5/7/2009
603 D05AX52 Psoriasis 8/21/2009
603 D05AX52 Psoriasis 11/9/2009 
603 D05AX52 Psoriasis 3/19/2010 
603 D05AX52 Psoriasis 7/30/2010 
603 D05AX52 Psoriasis 7/30/2010
603 D05AX52 Psoriasis 1/13/2011 
603 D05AX52 Psoriasis 5/3/2011 
603 D05AX52 Psoriasis 12/12/2011
1103 L04AX03 Nonbiologic_systemic 1/17/2006
1103 L04AX03 Nonbiologic_systemic 8/23/2006
1103 L04AX03 Nonbiologic_systemic 11/9/2006
1103 D05AX52 Psoriasis 4/19/2007 
1103 L04AX03 Nonbiologic_systemic 4/19/2007 
1103 D05AX52 Psoriasis 10/26/2007 
1103 D05AX52 Psoriasis 4/1/2008
1103 L04AX03 Nonbiologic_systemic 10/20/2008 
1103 D05AX52 Psoriasis 10/20/2008
1103 L04AX03 Nonbiologic_systemic 4/7/2009 
1103 L04AX03 Nonbiologic_systemic 11/20/2009 
1103 L04AX03 Nonbiologic_systemic 11/12/2010 
1103 L04AX03 Nonbiologic_systemic 8/12/2011
1103 D05AX52 Psoriasis 10/22/2011 
1103 D05AX52 Psoriasis 12/29/2011
;

我尝试过的解决方案:

proc sort data=have;
  by pnr date;
run;

/* Identifying the number of subjects who had treatment switch */
data need;
  set have;
  length change $ 10.;
  by pnr;

  /* Create new variable change and keep constant if it is topical for first observation */
  /* Compare topical values with next values if it changes to other non bio or bio then switched */
  if first.pnr and atc_code in ( 'D05AX52','D05AX02') then change="";
  else if not first.pnr and atc_code not in('D05AX52','D05AX02','L01XC02','L04AA24','L04AB01',
                                            'L04AB02','L04AB04','L04AB05','L04AB06','L04AC03',
                                            'L04AC07','A11CC03','D05BB02','L01BA01','L01BB03',
                                            'L01XX05' ,'L04AA21' ,'L04AD01' ,'L04AX03') then change='switched';
  /* Compare non bio values with next values if it changes to other non bio or bio then switched*/
  if first.pnr and atc_code in ('L01XC02','L04AA24','L04AB01','L04AB02','L04AB04',
                                'L04AB05','L04AB06','L04AC03','L04AC07') then change="";
  else if not first.pnr and atc_code not in( 'D05AX52','D05AX02') and 
                            atc_code in('L01XC02','L04AA24','L04AB01','L04AB02','L04AB04','L04AB05',
                                        'L04AB06','L04AC03','L04AC07','A11CC03','D05BB02','L01BA01',
                                        'L01BB03' ,'L01XX05' ,'L04AA21' ,'L04AD01' ,'L04AX03') then change='switched';

  /* Compare bio with next values if it changes to other bio then switched */
  if first.pnr and atc_code in('A11CC03','D05BB02','L01BA01','L01BB03' ,'L01XX05' ,
                               'L04AA21' ,'L04AD01' ,'L04AX03') then change='';
  else if not first.pnr and atc_code not in('D05AX52','D05AX02') and 
                            atc_code in('A11CC03','D05BB02','L01BA01','L01BB03' ,'L01XX05',
                                        'L04AA21' ,'L04AD01' ,'L04AX03') then change='switched';

  if atc_code=lag(atc_code) then change="";                        
run;

我期望的结果

pnr   ATC_CODE  TYPE                  EDATUM      Flag_switch
478   L04AX03   Nonbiologic_systemic  2/10/2010
478   D05AX52   Psoriasis             2/23/2010
478   L04AX03   Nonbiologic_systemic  5/18/2010   switch
478   L04AX03   Nonbiologic_systemic  8/2/2010
478   L04AX03   Nonbiologic_systemic  11/3/2010
478   L04AX03   Nonbiologic_systemic  2/7/2011
478   L04AX03   Nonbiologic_systemic  8/16/2011
478   L04AX03   Nonbiologic_systemic  11/22/2011
603   D05AX02   Psoriasis             8/24/2005
603   D05AX02   Psoriasis             10/13/2005
603   D05AX02   Psoriasis             6/2/2006
603   D05AX02   Psoriasis             7/19/2006
603   D05AX02   Psoriasis             4/3/2007
603   D05AX02   Psoriasis             12/7/2007
603   D05AX02   Psoriasis             1/4/2008
603   D05AX02   Psoriasis             10/2/2008
603   D05AX52   Psoriasis             3/16/2009   switch
603   D05AX52   Psoriasis             5/7/2009
603   D05AX52   Psoriasis             8/21/2009
603   D05AX52   Psoriasis             11/9/2009
603   D05AX52   Psoriasis             3/19/2010
603   D05AX52   Psoriasis             7/30/2010
603   D05AX52   Psoriasis             1/13/2011
603   D05AX52   Psoriasis             5/3/2011
603   D05AX52   Psoriasis             12/12/2011
1103  L04AX03   Nonbiologic_systemic  1/17/2006
1103  L04AX03   Nonbiologic_systemic  8/23/2006
1103  L04AX03   Nonbiologic_systemic  11/9/2006
1103  L04AX03   Nonbiologic_systemic  4/19/2007
1103  D05AX52   Psoriasis             10/26/2007
1103  D05AX52   Psoriasis             4/1/2008
1103  L04AX03   Nonbiologic_systemic  10/20/2008  switch
1103  D05AX52   Psoriasis             10/20/2008
1103  L04AX03   Nonbiologic_systemic  4/7/2009    switch
1103  L04AX03   Nonbiologic_systemic  11/20/2009
1103  L04AX03   Nonbiologic_systemic  11/12/2010
1103  L04AX03   Nonbiologic_systemic  8/12/2011
1103  D05AX52   Psoriasis             10/22/2011
1103  D05AX52   Psoriasis             12/29/2011

【问题讨论】:

  • 请重新格式化您的问题,使其不全部使用代码块。
  • @Reeza。我重新格式化了这个问题。感谢您的帮助。
  • 问题仍然不可读...请验证我的格式是否正确。
  • @Dominic 嗨,感谢您的快速回复。很抱歉解释不清楚,但我的意思是:正如您看到的数据,我们在 TYPE 变量中有三种处理类型。现在对于每个类型变量,我们都有不同的 ATC_CODE。我需要识别事件(SWITCH),只要受试者在治疗期间将其治疗类型从较低治疗类型(即局部)更改为较高治疗组(即 Non_bio_sys 或 Biologics)。 Non_sys_Bio 也是如此,如果 Subject 更改为 Biologics,那么它也将被视为 Switch。
  • 连续事件也将被计算在内,只要受试者在其治疗类型中更改其 ATC_CODE,即以防万一,当治疗类型为“银屑病”并且其 ATC_CODE 发生变化时,我们必须识别它作为开关。其他治疗组也是如此。治疗顺序:BIOLOGICS> NON_BIO_SYS> TOPICAL。希望我能消除你的疑虑。请帮忙。谢谢

标签: sas


【解决方案1】:

好的。因此,这是几种可能的解决方案之一。您仍然需要找出治疗类型 3(生物制剂)的开关,并弄清楚如何处理在同一日期有多个条目的地方。但这应该能让你继续前进!

准备数据

proc format;
  value treatType 1 = "Topical"
                  2 = "Non-biologic systemics"
                  3 = "Biologics";
run;

data have;
  format pnr 8. tType treatType. tCode $10. date YYMMDDs8.;
  informat tType 1. date yymmdd10.;
  input pnr tCode tType date;
  datalines;
478 L04AX03 2 2010-02-10
478 D05AX52 1 2010-02-23
478 L04AX03 2 2010-03-05
478 L04AX03 2 2010-05-18
478 L04AX03 2 2010-08-02
478 L04AX03 2 2010-11-03
478 L04AX03 2 2011-02-07
478 L04AX03 2 2011-08-16
478 L04AX03 2 2011-11-22
603 D05AX02 1 2005-08-24
603 D05AX02 1 2005-10-13
603 D05AX02 1 2006-06-02
603 D05AX02 1 2006-07-19
603 D05AX02 1 2007-04-03
603 D05AX02 1 2007-12-07
603 D05AX02 1 2008-01-04
603 D05AX02 1 2008-01-04
603 D05AX02 1 2008-10-02
603 D05AX52 1 2009-03-16
603 D05AX52 1 2009-03-16
603 D05AX52 1 2009-05-07
603 D05AX52 1 2009-08-21
603 D05AX52 1 2009-11-09
603 D05AX52 1 2010-03-19
603 D05AX52 1 2010-07-30
603 D05AX52 1 2010-07-30
603 D05AX52 1 2011-01-13
603 D05AX52 1 2011-05-03
603 D05AX52 1 2011-12-12
1103 L04AX03 2 2006-01-17
1103 L04AX03 2 2006-08-23
1103 L04AX03 2 2006-11-09
1103 D05AX52 1 2007-04-19
1103 L04AX03 2 2007-04-19
1103 D05AX52 1 2007-10-26
1103 D05AX52 1 2008-04-01
1103 L04AX03 2 2008-10-20
1103 D05AX52 1 2008-10-20
1103 L04AX03 2 2009-04-07
1103 L04AX03 2 2009-11-20
1103 L04AX03 2 2010-11-12
1103 L04AX03 2 2011-08-12
1103 D05AX52 1 2011-10-22
1103 D05AX52 1 2011-12-29
run;

计算开关变量

proc sort data=have;
  by pnr date;
run;

data want;
  set have;
  by pnr;
  format switch 1. tCode_prev $10. tType_prev 3.;
  retain tCode_prev '' tType_prev .;
  format switch 1.;

  if first.pnr then do;
    switch = 0;
  end;

  else if tType_prev = 1 then do;
    if tType > 1 or tCode ne tCode_prev then switch = 1;
    else switch = 0;
  end;

  else if tType_prev = 2 then do;
    if tType > 2 or (tType = 2 and tCode ne tCode_prev) then switch = 1;
    else switch = 0;
  end;

  else if tType_prev = 3 then do;
    /* Here's your homework */
  end;

  output;    
  tCode_prev = tCode;
  tType_prev = tType;

  drop tCode_prev tType_prev;
run;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2020-08-22
    • 1970-01-01
    • 2022-06-14
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多