1

我正在处理处方数据,并希望生成一个汇总变量来衡量个人在给定时期内对药物的依从性。此变量称为覆盖天数 (PDC)。我知道制作变量的步骤,但最后无法执行循环。Leslie 等人的文档中概述了这些步骤,它们提供了 SAS 代码。http://www2.sas.com/proceedings/forum2007/043-2007.pdf

第一步是将您的数据组织成宽格式,以便每个独特的人都有自己的行,他们每天服用药物以及服用了多少药物。数据框还有一个索引日期,即个人领取处方的第一个日期(进入研究)和他们的研究结束日期(开始日期 + 180 天跟进)。这一切都很好,这是一个示例数据框。xd = 填写日期和 days_supply = 个人在该日期获得的标签数量。

df[(1:4), c(1,2,3,4,5,6,42,43)]
                   ID       xd.1 days_supply.1       xd.2 days_supply.2       xd.3   start_dt     end_dt
1  Patient HAI0674228 2011-05-05            28 2011-05-11            28 2011-05-24 2011-05-05 2011-10-31
10 Patient HAI0937281 2011-01-06            28 2011-03-01            28 2011-03-28 2011-01-06 2011-07-04
12 Patient HAI1007704 2011-01-29            28 2011-03-01            28 2011-03-31 2011-01-29 2011-07-27
18 Patient HAI1028993 2011-05-17            30 2011-06-16            30          0 2011-05-17 2011-11-12

使用数组和循环的下一步是我遇到的麻烦。

首先,我需要为后续期间(180 天)中的每一天创建一个包含虚拟变量的数组,将每个值设置为 0。(这将作为每天的药物覆盖日记 - 是/否有平板电脑)

lapply(1:180, function(i) print(i))->days2
days2[]=0

工作正常

接下来,我需要再制作两个数组,将 xd 变量和 days 供应变量分组。目的是这些将设置do循环;为每个病人填写日记。

df[(1:5), c(1,2,4,6,8,9)]->filldates
filldates
array(filldates)->filldates
is.array(filldates)


df[(1:5), c(1,3,5,7,8,9)]->days_supply
> days_supply
array(days_supply)->days_supply
is.array(days_supply)
工作正常

接下来是设置循环以获取每个数组中的信息(填写日期和供应天数)以填写用药日记。这是我卡住的地方。我希望日记看起来像这样

ID      Day 1   Day 2   Day 3   Day 4-Day29 Day 30  Day 31  Day 32  Day 33
X12344  1   1   1   1            0      0      1     1

我将不胜感激有关如何设置循环来做到这一点的任何建议?

先感谢您!

生成此处使用的 DF 的代码:

ID=c("1234", "1233", "1235", "1222")  ###random IDs
dt_fill1=as.character(c("2011-05-05", "2011-01-06", "2011-01-29", "2011-05-17"))
days_supp1=c(28,28,28,30)
dt_fill2=as.character(c("2011-05-11", "2011-03-01", "2011-03-01", "2011-06-16"))
days_supp2=c(28,28,28,30)
st_date=as.character(c("2011-05-05", "2011-01-06", "2011-01-29", "2011-05-17"))
end_date=as.charachter(c("2011-10-31", "2011-07-04", "2011-07-27", "2011-11-12")
df=data.frame(ID, dt_fill1, days_supp1, dt_fill2, days_supp2, st_date, end_date)
df 

更详细的df:

ID=c("hai0674228", "hai0937281",  "hai1007704", "hai1028993",  "hai1095329",  "hai1537305",  "hai1706893",  "hai1989514",  "hai2202516", "hai2224780")
dt_fill1=as.character(c("2011-05-05", "2011-01-06", "2011-01-29", "2011-05-17", "2011-01-11", "2011-01-26", "2011-01-06", "2011-01-10", "2011-01-07", "2011-04-26" ))
days_supp1=c(28,28,28,30, 28,30,28,28,28,30)
dt_fill2=as.character(c("2011-05-11", "2011-03-01", "2011-03-01", "2011-06-16", "2011-02-08", "2011-03-14", "0", "2011-02-04", "2011-02-05", "2011-05-17"))
days_supp2=c(28,28,28,30,28,30,0,28,28,30)
dt_fill3=as.character(c("2011-05-24",  "2011-03-28", "2011-03-31", "0", "2011-03-02", "2011-03-19", "0", "2011-03-02", "2011-03-07",  "2011-06-14"))
days_supp3=c(30,28,28,0,28,30,0,28,28,30)
dt_fill4=as.character(c("2011-06-21", "2011-04-27", "2011-04-25", "0", "2011-03-30", "2011-04-15",  "0", "2011-03-31",  "2011-03-28", "2011-06-29"))
days_supp4=c(28,28,28,0,28,30,0,28,28,30)
dt_fill5=as.character(c("0", "2011-05-20", "2011-05-23", "0",  "2011-05-02", "2011-05-12", "0", "2011-04-28", "2011-04-28", "0"))
days_supp5=c(0,28,28,0,28,30,0,28,28,0)
st_date=as.character(c("2011-05-05", "2011-01-06", "2011-01-29", "2011-05-17", "2011-01-11", "2011-01-26", "2011-01-06", "2011-01-10", "2011-01-07", "2011-04-26"))
end_date=as.character(c("2011-10-31", "2011-07-04", "2011-07-27", "2011-11-12", "2011-07-09", "2011-07-24", "2011-07-04", "2011-07-08", "2011-07-05", "2011-10-22"))
df=data.frame(ID, dt_fill1, days_supp1, dt_fill2, days_supp2, dt_fill3, days_supp3, dt_fill4, days_supp4, dt_fill5, days_supp5,  st_date, end_date)
df
4

2 回答 2

1

这解决了计算 6 个月供应量比例的目标。几乎从来没有第一步是“走宽”。(R 中的答案几乎总是“做多”。) 似乎“end.date”列距 fill_dates 6 个月,所以我们将使用第一条记录中的 end_date 作为正确的 end_date?(这就是我的假设。我想您也可以将 180 添加到第一个 start_dt 中。)

reshape(dat[,-6], direction="long", 
                 idvar="ID", varying=c(xd=c(2,4), supply=c(3,5) ) )
                     ID   start_dt     end_dt time         xd days_supply
HAI0674228.1 HAI0674228 2011-05-05 2011-10-31    1 2011-05-05          28
HAI0937281.1 HAI0937281 2011-01-06 2011-07-04    1 2011-01-06          28
HAI1007704.1 HAI1007704 2011-01-29 2011-07-27    1 2011-01-29          28
HAI1028993.1 HAI1028993 2011-05-17 2011-11-12    1 2011-05-17          30
HAI0674228.2 HAI0674228 2011-05-05 2011-10-31    2 2011-05-11          28
HAI0937281.2 HAI0937281 2011-01-06 2011-07-04    2 2011-03-01          28
HAI1007704.2 HAI1007704 2011-01-29 2011-07-27    2 2011-03-01          28
HAI1028993.2 HAI1028993 2011-05-17 2011-11-12    2 2011-06-16          30

rdat <- .Last.value

by(rdat, rdat$ID, function(d) sum(d$days_supply)/ 
   as.numeric(difftime(as.Date(d$end_dt)[1], as.Date(d$start_dt)[1] )))
rdat$ID: HAI0674228
[1] 0.3128492
------------------------------------------------------------ 
rdat$ID: HAI0937281
[1] 0.3128492
------------------------------------------------------------ 
rdat$ID: HAI1007704
[1] 0.3128492
------------------------------------------------------------ 
rdat$ID: HAI1028993
[1] 0.3351955

如果您想要“日记”,您可以as.Date(start_dt[1])+0:180与一个药丸剩余向量合并,该向量在每个填充日期增加分配的数量并随着每个提前日期减少到零。我想您可以为此目的使用 R 矩阵,其中行代表 ID,列代表日期,但不希望以这种方式使用 R data.frame 对其进行编码。

我将勾勒出一个可能有效的数据结构:

daymat <- matrix(0, nrow=4, ncol=180)
rownames(daymat) <-  tapply(as.character(rdat$start_dt), rdat$ID, "[", 1)
daymat[ , 1:10]
#           [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
2011-05-05    0    0    0    0    0    0    0    0    0     0
2011-01-06    0    0    0    0    0    0    0    0    0     0
2011-01-29    0    0    0    0    0    0    0    0    0     0
2011-05-17    0    0    0    0    0    0    0    0    0     0

这可能是每个处方药的增量步骤:

daymat[ IDseq, as.Date(start_dt)-
                  as.Date(rownames(daymat)[IDseq]) + 0:day_supply] <- 

  daymat[ IDseq, as.Date(start_dt)- 
                  as.Date(rownames(daymat)[IDseq]) +  0:day_supply] +1

根据填充发生的频率,有些天会结束 2 甚至 3 天。然后,您可以从该供应行进行连续减法。但需要在每个月的单独行上将其显示为 6 个月。

于 2013-05-17T21:54:41.907 回答
0

我在处理药房数据时遇到了类似的需求。一种方法是修改以下代码。你有没有使用 R 成功计算过 PDC?

calc_adherence <- function(fills, year){
filldates <- as.Date(as.character(fills$FirstDateofService), format('%m/%d/%Y'))
days_supplied <- fills$DaysSupplied
first_fill <- min(filldates)
last_fill <- max(filldates)

duration <- as.Date(paste("12/31",year, sep="/"), format('%m/%d/%Y')) - first_fill + 1
med_days <- vector(mode = 'integer', length=as.numeric(duration))
for (i in seq(duration)){
  for(j in seq(length(filldates))){
    if(filldates[j] <= first_fill + i - 1 && first_fill + i - 1 <= filldates [j] + days_supplied[j] - 1)
      med_days[i] <- 1
  }
}

early_fill_days <- calc_early_fill(filldates, days_supplied)
days_covered <- sum(med_days) +early_fill_days
adh <- days_covered / as.numeric(duration)
if (adh > 1) adh <- 1
ad <- data.frame(PatientID=fills$PatientID[1], FirstFill=first_fill,     LastFill=last_fill, Duration=duration, 
                 DaysCovered=days_covered,     LastDaysSupplied=tail(days_supplied, n=1),     TotalDaysSupplied=sum(fills$DaysSupplied),
                 Method="PDC", Adherence="adh")
}
于 2015-06-10T15:45:51.530 回答