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 変数と日数供給変数をグループ化する 2 つの配列をさらに作成する必要があります。目的は、これらが 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 として使用しますか? (それは私が想定していることです。代わりに、最初の start_dt に 180 を追加することもできると思います。)

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、各充填日に調剤された数だけ増分され、日付が進むごとにゼロに減分される錠剤残量ベクトルとマージできます。ID の行と日付の列を使用して、この目的のために R マトリックスを使用できると思いますが、そのように 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 に答える