为变更点检测创建数据集通过时间序列数据执行输出

时间:2018-04-04 16:39:48

标签: r dplyr time-series

我使用cpt.mean计算了变化点检测,此语法的输出给出了constant mean以及跨时间序列的相应位置。所以我在这里尝试为下面可重复的示例创建相同的数据集。

s <- data.frame(Tag = c(1,1,1,2,2,2,2),row = c(1,12,22,1,7,9,16),constant_mean=c(-0.12,1.55,0,0.35,1.6,0.86,0))

所以在这里可以看到有三列Tagrow&amp; constant_mean

因此,我们仅为此Tag=1的{​​{1}}举例说明,Maximum rows would be 22常量均值为-0.12。然后row 1 to row 12常数均值为1.55。 row13 to row22。与图片类似,如下所示。

enter image description here

2 个答案:

答案 0 :(得分:3)

以下是使用data.table

的建议
library(data.table)
res <-
  setDT(s)[, 
          .SD[c(1L, rep(1L : (.N - 1L), diff(row)))],
          by = Tag
         ][, row := .I] # don't think this is needed

res
#     Tag row constant_mean
#  1:   1   1         -0.12
#  2:   1   2         -0.12
#  3:   1   3         -0.12
#  4:   1   4         -0.12
#  5:   1   5         -0.12
#  6:   1   6         -0.12
#  7:   1   7         -0.12
#  8:   1   8         -0.12
#  9:   1   9         -0.12
# 10:   1  10         -0.12
# 11:   1  11         -0.12
# 12:   1  12         -0.12
# 13:   1  13          1.55
# 14:   1  14          1.55
# 15:   1  15          1.55
# 16:   1  16          1.55
# 17:   1  17          1.55
# 18:   1  18          1.55
# 19:   1  19          1.55
# 20:   1  20          1.55
# 21:   1  21          1.55
# 22:   1  22          1.55
# 23:   2  23          0.35
# 24:   2  24          0.35
# 25:   2  25          0.35
# 26:   2  26          0.35
# 27:   2  27          0.35
# 28:   2  28          0.35
# 29:   2  29          0.35
# 30:   2  30          1.60
# 31:   2  31          1.60
# 32:   2  32          0.86
# 33:   2  33          0.86
# 34:   2  34          0.86
# 35:   2  35          0.86
# 36:   2  36          0.86
# 37:   2  37          0.86
# 38:   2  38          0.86

这基本上用row中的差异消耗每个标记的行数。我在开头添加了1,因为每个组中的row都是从1开始的,因此差异总是短一个。 关于row,我不确定您是否只需要整个行号(这是多余的IMO),或者您想要Tag。如果是后一种情况,那么这就像[, row := as.numeric(seq_len(.N)), by = Tag]

答案 1 :(得分:0)

更通用的解决方案是使用mcp包来模拟变更点数据。时间序列通常涉及自相关,因此我们将其包括在内。

library(mcp)
empty = mcp(model, sample = FALSE, par_x = "x")

df = data.frame(x = 1:200)
df$y = empty$simulate(
  df$x, 
  cp_1 = 90,  # where the change point occurs
  int_1 = -0.12,  # intercept of segment 1
  int_2 = 1.66,  # intercept of segment 2
  ar1_1 = 0.6,  # autoregressive strength
  sigma_1 = 0.5)  # standard deviations of the residuals (innovations)

让我们继续使用mcp来看看我们是否可以恢复这些参数,还可以获取显示数据的默认图:

fit = mcp(model, df, par_x = "x")
plot(fit)

enter image description here

请参阅参数估算值:

summary(fit)

Family: gaussian(link = 'identity')
Iterations: 9000 from 3 chains.
Segments:
  1: y ~ 1 + ar(1)
  2: y ~ 1 ~ 1

Population-level parameters:
    name match   sim  mean lower upper Rhat n.eff
   ar1_1    OK  0.60  0.61  0.49  0.75    1   164
    cp_1       90.00 90.04 89.01 89.99    1    15
   int_1       -0.12 -0.45 -0.75 -0.18    1   391
   int_2    OK  1.66  1.48  1.22  1.73    1  1178
 sigma_1    OK  0.50  0.50  0.45  0.55    1   681

This site包含有关使用mcp建模时间序列数据的更多信息。披露:我是mcp的开发人员。