как посчитать количество людей, которые со временем меняют лечение SAS - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть набор данных с участниками, которые проходят курс лечения А или курс В, и за ними следят в разные промежутки времени. Например, участник 1 может иметь посещения в месяц 0 (базовый уровень), а затем в месяцы 2, 6 и 12, но участник 2 может иметь посещения только в базовый период и в месяц 6 et c. Мне было интересно, как я могу посчитать количество людей, которые переключаются с одного лечения на другое во время любого из последующих посещений. Я знаю, что это должно быть довольно просто сделать, но поскольку последующие визиты не одинаковы для всех, я не могу понять, как справиться с отсутствующими данными для некоторых участников.

Вот пример моего данные и что я пытался сделать. Как видно из данных, только участники 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;

Любая помощь / предложения будут оценены.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 06 апреля 2020

Не существует PATID, который имеет каждый VISNO, поэтому каждая транспонированная строка имеет хотя бы один столбец с пропущенным значением (что соответствует отсутствующим VISNO s в группе 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;

enter image description here

Аналогично, для предварительно отсортированных данных шаг DATA с обработкой DOW может вычислить тот же счет.

Пример:

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;
1 голос
/ 08 апреля 2020

Если вы просто хотите найти ПАТИДы, которые изменили свое лечение в любое время в ходе посещений (не обязательно с момента их последнего посещения обязательно), а это означает, что ПАТИДы, у которых было хотя бы два курса лечения во время их посещений, вы можете просто использовать следующее:

proc sql;
select PATID
from example
group by PATID
having count(distinct TRT) >=2
;
quit;
1 голос
/ 08 апреля 2020

мы можем использовать функцию задержки, чтобы найти лечение от предыдущего посещения, а затем проверить все строки, если обработка не совпадает с предыдущей обработкой. Для этого давайте создадим примерный набор данных следующим образом:

 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;

Наконец, мы используем pro c sql, чтобы создать таблицу 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;
...