请选择 进入手机版 | 继续访问电脑版
楼主: verbatim
1342 4

[问答] how to calculate time since last dose event? Thanks [推广有奖]

  • 1关注
  • 3粉丝

博士生

5%

还不是VIP/贵宾

-

威望
0
论坛币
513 个
通用积分
2.0505
学术水平
0 点
热心指数
2 点
信用等级
0 点
经验
3404 点
帖子
139
精华
0
在线时间
143 小时
注册时间
2006-12-1
最后登录
2020-1-30

verbatim 发表于 2014-4-24 23:20:56 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
dat = structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), DAY = c(1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 30L, 30L, 30L, 30L, 30L, 30L,
30L, 30L, 30L, 30L, 30L, 60L, 60L, 60L, 60L, 60L, 60L, 60L, 60L,
60L, 60L, 60L, 1L, 1L, 1L, 30L, 30L, 30L, 60L, 60L, 60L, 1L,
1L, 30L, 30L, 60L, 60L), TIME = c(0, 0, 1.16, 1.89, 2.88, 3.85,
4.95, 5.94, 8.01, 9.89, 24, 49, 49.5, 696, 696, 696.83, 698.01,
699.02, 700.11, 700.91, 702.06, 703.9, 705.93, 720, 1416, 1416,
1417, 1417.82, 1418.96, 1420.02, 1421.13, 1422.04, 1424.12, 1426.03,
1440, 0, 0, 2.09, 696, 696, 698.14, 1416, 1416, 1417.83, 0, 0,
696, 696, 1416, 1416), AMT = c(".", "50000", ".", ".", ".", ".",
".", ".", ".", ".", ".", "", "", ".", "50000", ".", ".", ".",
".", ".", ".", ".", ".", ".", ".", "50000", ".", ".", ".", ".",
".", ".", ".", ".", ".", ".", "50000", ".", ".", "50000", ".",
".", "50000", ".", ".", "50000", ".", "50000", ".", "50000"),
MDV = c(0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L,
0L, 0L, 1L, 0L, 1L, 0L, 1L), EVID = c(0L, 1L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 1L
), II = c(".", "24", ".", ".", ".", ".", ".", ".", ".", ".",
".", "", ".", ".", "24", ".", ".", ".", ".", ".", ".", ".",
".", ".", ".", "24", ".", ".", ".", ".", ".", ".", ".", ".",
".", ".", "24", ".", ".", "24", ".", ".", "24", ".", ".",
"24", ".", "24", ".", "24"), SS = c(".", ".", ".", ".", ".",
".", ".", ".", ".", ".", ".", "", ".", ".", "2", ".", ".",
".", ".", ".", ".", ".", ".", ".", ".", "2", ".", ".", ".",
".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "2", ".",
".", "2", ".", ".", ".", ".", "2", ".", "2"), ADDL = c(".",
"28", ".", ".", ".", ".", ".", ".", ".", ".", ".", "", ".",
".", "29", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".",
"29", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "28",
".", ".", "29", ".", ".", "29", ".", ".", "28", ".", "29",
".", "29"), OBS = 1:50), .Names = c("ID", "DAY", "TIME",
"AMT", "MDV", "EVID", "II", "SS", "ADDL", "OBS"), class = "data.frame", row.names = c(NA,
-50L))

For the above dataset, there are 3 subjects, dose event is indicated by AMT >0, MDV=1, EVID=1, but there are II (interdose interval) and ADDL (additional doses) which means last dose time may not be 0 for the records before second record with AMT >0, for example, for ID=1 and record with OBS= 12 ~14, the last dose time should be 48, 48, 672 and time since last dose event for these three records should be 1, 1.5, 24. Basically the dose was give every 24 hrs and totally 89 doses

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:calculate thanks Thank Event Since structure

本帖被以下文库推荐

  1. # Following your code
  2. # dat = structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, ...
  3. # Change all data type to numeric for easy operation
  4. datNew <-
  5.   with(
  6.     dat,
  7.     data.frame(
  8.       ID   = ID,
  9.       DAY  = DAY,
  10.       TIME = TIME,
  11.       AMT  = as.numeric(gsub("\\.", "", AMT)),
  12.       MDV  = MDV,
  13.       EVID = EVID,
  14.       II   = as.numeric(gsub("\\.", "", II)),
  15.       SS   = as.numeric(gsub("\\.", "", SS)),
  16.       ADDL = as.numeric(gsub("\\.", "", ADDL)),
  17.       OBS  = OBS
  18.               )
  19.       )

  20. # Function to do last observation carried forward - LOCF
  21. # see http://stackoverflow.com/questions/1782704/propagating-data-within-a-vector/1783275#1783275
  22. fillInTheBlanks <-
  23.   function(S) {
  24.   ## NA in S are replaced with observed values
  25.   
  26.   ## accepts a vector possibly holding NA values and returns a vector
  27.   ## where all observed values are carried forward and the first is
  28.   ## also carried backward.  cfr na.locf from zoo library.
  29.   L <- !is.na(S)
  30.   c(S[L][1], S[L])[cumsum(L)+1]
  31. }

  32. # Time of dosing recorded in the dataset
  33. datNew$*****S <-
  34.   with(datNew,
  35.        ifelse(EVID == 1, TIME, NA))

  36. # LOCF for *****S, II, & ADDL
  37. datNew$*****S.locf <-
  38.   with(datNew, unlist(tapply(*****S, ID, fillInTheBlanks)))

  39. datNew$II.locf <-
  40.   with(datNew, unlist(tapply(II, ID, fillInTheBlanks)))

  41. datNew$ADDL.locf <-
  42.   with(datNew, unlist(tapply(ADDL, ID, fillInTheBlanks)))

  43. # Time since last dose
  44. datNew$TSLD <-
  45.   with(
  46.     datNew,
  47.     TIME - *****S.locf - pmin(floor(TIME - *****S.locf) %/% II.locf, ADDL.locf)*II.locf
  48.       )
复制代码

使用道具

verbatim 发表于 2014-5-8 23:25:18 |显示全部楼层 |坛友微信交流群
> # Time of dosing recorded in the dataset
>  
> datNew$*****S <-
Error: unexpected '^' in "datNew$**"
>  
>   with(datNew,
+  
+        ifelse(EVID == 1, TIME, NA))
[1]   NA    0   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA  696   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA 1416   NA   NA   NA   NA
[31]   NA   NA   NA   NA   NA   NA    0   NA   NA  696   NA   NA 1416   NA   NA    0   NA  696   NA 1416

使用道具

verbatim 发表于 2014-5-9 01:21:12 |显示全部楼层 |坛友微信交流群
when I change *****S to S, I got below dataset (datNew):, however, for the records with OBS = 11, 24, 35, TSLD should be 24 instead of current 0 in datNew. Thanks for further help in advance.

datNew = structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), DAY = c(1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 30L, 30L, 30L, 30L, 30L, 30L,
30L, 30L, 30L, 30L, 30L, 60L, 60L, 60L, 60L, 60L, 60L, 60L, 60L,
60L, 60L, 60L, 1L, 1L, 1L, 30L, 30L, 30L, 60L, 60L, 60L, 1L,
1L, 30L, 30L, 60L, 60L), TIME = c(0, 0, 1.16, 1.89, 2.88, 3.85,
4.95, 5.94, 8.01, 9.89, 24, 49, 49.5, 696, 696, 696.83, 698.01,
699.02, 700.11, 700.91, 702.06, 703.9, 705.93, 720, 1416, 1416,
1417, 1417.82, 1418.96, 1420.02, 1421.13, 1422.04, 1424.12, 1426.03,
1440, 0, 0, 2.09, 696, 696, 698.14, 1416, 1416, 1417.83, 0, 0,
696, 696, 1416, 1416), AMT = c(NA, 50000, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, 50000, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, 50000, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 50000,
NA, NA, 50000, NA, NA, 50000, NA, NA, 50000, NA, 50000, NA, 50000
), MDV = c(0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L,
1L, 0L, 1L, 0L, 1L), EVID = c(0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L,
0L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 1L), II = c(NA, 24, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 24, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, 24, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
24, NA, NA, 24, NA, NA, 24, NA, NA, 24, NA, 24, NA, 24), SS = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 2, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, 2, NA, NA, 2, NA, NA, NA, NA, 2, NA,
2), ADDL = c(NA, 28, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, 29, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 29, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, 28, NA, NA, 29, NA, NA, 29, NA,
NA, 28, NA, 29, NA, 29), OBS = 1:50, S = c(NA, 0, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, 696, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, 1416, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, 0, NA, NA, 696, NA, NA, 1416, NA, NA, 0, NA, 696, NA, 1416
), S.locf = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 696,
696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 1416, 1416,
1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 0, 0, 0, 0, 696,
696, 696, 1416, 1416, 0, 0, 0, 696, 696, 1416), II.locf = c(24,
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
24), ADDL.locf = c(28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
29, 29, 29, 29, 29, 29, 29, 29, 28, 28, 28, 28, 29, 29, 29, 29,
29, 28, 28, 28, 29, 29, 29), TSLD = c(0, 0, 1.16, 1.89, 2.88,
3.85, 4.95, 5.94, 8.01, 9.89, 0, 1, 1.5, 24, 0, 0.830000000000041,
2.00999999999999, 3.01999999999998, 4.11000000000001, 4.90999999999997,
6.05999999999995, 7.89999999999998, 9.92999999999995, 0, 24,
0, 1, 1.81999999999994, 2.96000000000004, 4.01999999999998, 5.13000000000011,
6.03999999999996, 8.11999999999989, 10.03, 0, 0, 0, 2.09, 24,
0, 2.13999999999999, 24, 0, 1.82999999999993, 0, 0, 24, 0, 24,
0)), .Names = c("ID", "DAY", "TIME", "AMT", "MDV", "EVID", "II",
"SS", "ADDL", "OBS", "S", "S.locf", "II.locf", "ADDL.locf", "TSLD"
), row.names = c(NA, -50L), class = "data.frame")

使用道具

jacosis 发表于 2014-5-9 13:32:50 |显示全部楼层 |坛友微信交流群
I did not test your data but have recently dealt with a similar problem. Here I want to show you the method of how to do it.

1. First you need to extract the dosing event together with the unique ID of the data set, and create a new dataframe.

2. Merge the two data sets by the unique ID, which would give you a column of the dosing time.

3. What's left is pretty straightforward. You can simply do a elementary-school math to calculate the time after dosing.

Hope this helps.

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 03:46