不规则时间序列上的条件滚动平均值(移动平均值)

Posted

技术标签:

【中文标题】不规则时间序列上的条件滚动平均值(移动平均值)【英文标题】:Conditional rolling mean (moving average) on irregular time series 【发布时间】:2014-02-17 19:29:16 【问题描述】:

我有一组数据格式:

ID    Minutes Value
xxxx  118     3 
xxxx  121     4 
xxxx  122     3 
yyyy  122     6 
xxxx  123     4 
yyyy  123     8 
...   ...     .... 

每个 ID 都是一个病人,每个值就是那一分钟的血压。我想为每个点之前的 60 分钟和之后的 60 分钟创建一个滚动平均值。但是 - 正如您所看到的,缺少分钟(所以我不能只使用行号)并且我想为每个唯一 ID 创建平均值(因此 ID xxxx 的平均值不能包括分配给 ID yyyy 的值)。听起来 rollapply 或 rollingstat 可能是选项,但尝试将它们拼凑起来却收效甚微......

如果需要进一步说明,请告诉我。

【问题讨论】:

您的数据有多大?处理此问题的一种快速而肮脏的方法是简单地插入 NAs 以弥补丢失的时间 如果你不想使用 data.table ,你可以设置一个循环。大致上,for (jtime in 1:N) mean(DF[DF$Minutes > (jtime-60) & DF$Minutes < (jtime + 60),3]) 对添加到 data.table 滚动功能的此类功能感兴趣的读者请为这个 FR 投票:github.com/Rdatatable/data.table/issues/3241 【参考方案1】:

您可以轻松填写​​缺少的分钟(值将设置为 NA),然后使用rollapply

library(data.table)
library(zoo)

## Convert to data.table
DT <- data.table(DF, key=c("IDs", "Minutes"))

## Missing Minutes will be added in. Value will be set to NA. 
DT <- DT[CJ(unique(IDs), seq(min(Minutes), max(Minutes)))]

## Run your function
DT[, rollapply(value, 60, mean, na.rm=TRUE), by=IDs]

或者,您不需要保留“填充”分钟/NA 值:

您可以一口气完成所有操作:

## Convert your DF to a data.able
DT <- data.table(DF, key=c("IDs", "Minutes"))

## Compute rolling means, with on-the-fly padded minutes
DT[ CJ(unique(IDs), seq(min(Minutes), max(Minutes))) ][, 
  rollapply(value, 60, mean, na.rm=TRUE), by=IDs]

【讨论】:

【参考方案2】:

使用tidyr/dplyr 代替data.tableRcppRoll 代替zoo 的替代方法:

library(dplyr)
library(tidyr)
library(RcppRoll)

d %>% 
  group_by(ID) %>%
  # add rows for unosberved minutes
  complete(Minutes = full_seq(Minutes, 1)) %>%
  # RcppRoll::roll_mean() is written in C++ for speed 
  mutate(moving_mean = roll_mean(Value, 131, fill = NA, na.rm = TRUE)) %>%
  # keep only the rows that were originally observed
  filter(!is.na(Value))

数据

d <- data_frame(
  ID = rep(1:3, each = 5),
  Minutes = rep(c(1, 30, 60, 120, 200), 3),
  Value = rpois(15, lambda = 10)
)

【讨论】:

以上是关于不规则时间序列上的条件滚动平均值(移动平均值)的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 时间序列:常规 10 分钟窗口内不规则间隔数据的分组和滚动平均值

具有时间偏移熊猫的滚动平均值

计算不规则数据的移动平均值

Pandas。滚动指定时间窗口和win_type

Python Pandas:计算可变行数的滚动平均值(移动平均值)

计算移动窗口中非 na 值最少的滚动平均值