【问题标题】:How to calculate the total time duration of concentration crossing a threshold multiple times?如何计算浓度多次跨越阈值的总持续时间?
【发布时间】:2016-12-06 17:26:04
【问题描述】:

使用 R,我试图计算每个人的总持续时间,其中这个持续时间是花费在某个阈值以上的时间。

例如,在下面的图中,我有 3 个受试者 (ID) 的浓度数据,我想找到每个人在蓝色虚线上方花费的时间(x 轴)。数据集结构类似于:

head(dataset)
  ID time      CP
1  1  0.0 0.00000000
2  1  0.0 0.00000000
3  1  0.5 0.03759806
4  1  1.0 0.12523455
5  1  1.5 0.23483219
6  1  2.0 0.34820905

Solid lines represent the concentrations for 3 different subjects

我尝试使用以下代码:

library(data.table) 
TAbove<-setDT(dataset)[CP > .05, diff(range(time)), by = ID]

但是,此代码计算从第一次上升到蓝色虚线上方到最后一次下降的持续时间。例如绿线ID,见黑线。

我如何编写一个代码,通过排除它们来考虑浓度下降到虚线以下的时间。最终结果将是蓝色虚线以上所有时间的总持续时间。如下所示

【问题讨论】:

  • ?rle。暂时忽略多个 id,比如说,x = sin(seq(-3*pi, 3*pi, 0.1)) 和计算r = rle(x &gt; threshold),连续的TRUEs(即x &gt; threshold)的开始和结束位置分别是s = cumsum(c(1, r$lengths))[r$values]e = i + r$lengths[r$values] - 1。对time[e] - time[s] 求和应该给出x &gt; threshold 的总时间。
  • @alexis_laz 您可以添加您的评论作为答案吗?这为我解决了问题,我会投票。认为您只有 1 个错字,当您定义 e 时,i 应该是 s

标签: r time threshold


【解决方案1】:

我认为您的解决方案几乎是完美的,请忽略 range。我在扩展数据集上尝试了以下内容(添加了一些条目)

> dat <- fread("ID time      CP
+               1  0.0 0.00000000
+               1  0.0 0.00000000
+               1  0.5 0.03759806
+               1  1.0 0.12523455
+               1  1.5 0.23483219
+               1  2.0 0.34820905
+               1  3.0 0.5
+               2  0.0 0.5
+               2  0.5 0.01
+               2  1.0 0.2")

结果如下:

> dat[CP > .05, diff(time), by = ID]
   ID  V1
1:  1 0.5
2:  1 0.5
3:  1 1.0
4:  2 1.0

编辑:使用原始数据集计算

使用原始数据集

dataset <- fread("ID time      CP
                  1  0.0 0.00000000
                  1  0.0 0.00000000
                  1  0.5 0.03759806
                  1  1.0 0.12523455
                  1  1.5 0.23483219
                  1  2.0 0.34820905")

我们得到以下结果:

> dataset[CP > .05, diff(time), by = ID]
   ID  V1
1:  1 0.5
2:  1 0.5

【讨论】:

  • 出于某种原因,代码给了我不同的答案。 ID V1 1: 1 0.5 2: 1 0.5 3: 1 0.5 4: 1 0.5
  • 也许重新启动您的 R 会话或更新到最新版本的 data.table 会有所帮助。只需仔细检查我的解决方案,它就可以在我的机器上使用最新版本的 R、data.table 和新的 R 会话。
  • 对不起,试过了,但仍然给我不同的结果。你能写出你使用的代码吗?
  • 用您提供的原始数据集的计算编辑了我的答案。在具有CP &gt; 0.05 的观察之间正确计算时间范围。希望这会有所帮助!
【解决方案2】:

因此,感谢 rhole 提供了如何解决问题的想法。 下面的代码帮助我进行了分析,但是我必须添加一个名为“Day”的变量,然后计算每天的持续时间。在这里我使用了一天,因为每天有一个间隔。但你可以根据需要进行调整。

#sub-setting by day
dataset$Day[dataset$time>=0 &dataset$time<24] <- "Day 1"
dataset$Day[dataset$time>=24 &dataset$time<48] <- "Day 2"
dataset$Day[dataset$time>=48 &dataset$time<72] <- "Day 3"
#per day#
TAbove<-setDT(dataset)[CP > .05, diff((time)), by = .(ID,Day)]
library(plyr)
# sum the time duration for each day per person
sumPerDay<-summarise(group_by(TAbove, ID,Day),
           sum=sum(V1))
# sum the time duration for ALL days per person
sumAll<-summarise(group_by(TAbove, ID),
                 sum=sum(V1))

【讨论】:

    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 2010-09-24
    • 2017-06-29
    • 2021-12-30
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 2012-12-16
    相关资源
    最近更新 更多