我正在研究变化点检测,想要估计 1000 个模拟数据实现的变化点 (CP) 的数量和位置。我已经估计了 CP 的数量及其位置,然后我将根据每个实现的 CP 位置计算每个数据段的平均值。我编写了一个代码,根据 CP 位置计算每个数据段的平均值,该代码仅适用于 1 个实现,但我无法将其扩展到 1000 个实现。因此,我需要您的帮助,并恳请您的学者支持。
例如,估计使用 arma(2,6) 生成的数据的变化点 (CP):
set.seed(111)
f <- rep(c(0, 5, 2, 8, 1, -2), c(100, 200, 200, 50, 200, 250))
x <- f + arima.sim(list(ar = c(.75, -.5), ma = c(.8, .7, .6, .5, .4, .3)), n = length(f), sd = 1)
wc=wcm.gsa(x)
使用作者有代码的检测方法 https://github.com/haeran-cho/wcm.gsa
CP=wc$cp
CP # CP= 95, 297, 500, 550, 750
计算每个数据段的平均值,即[1:95]、[96:297]、[298:500]、[501:550]、[551:750]、[751:1000]之间的x平均值)根据CP位置,我编写代码:
for (i in 2:length(CP))
{
if(i==1)
mn[i]=mean(x[1:CP[i]]) else
mn[i]=mean(x[(CP[i-1]+1):CP[i]])
}
est.ft=print(c(mn[1:i], mean(x[(CP[length(CP)]+1):length(x)])))
我想估计 CP 并根据 1000 个实现的 CP 位置计算每个数据段的平均值。我使用
估计了 1000 个实现的 CPy=as.data.frame(replicate(1000, f + arima.sim(list(ar = c(.75, -.5), ma = c(.8, .7, .6, .5, .4,
.3)), n = length(f), sd = 1)))
wcm = function (x) wcm.gsa(x)$cp
m=sapply(y[1:1000], wcm)
你就快到了。我根据这个答案改编了一个函数https://stackoverflow.com/a/16358095/12176280拆分函数。
## This function splits a vector at changepoints and calculates the mean of each chunk.
splitAt <- function(x, pos) unname(split(x, cumsum(seq_along(x) %in% (pos+1)))) |> sapply(mean)
检查是否有效:
> splitAt(x,CP)
[1] 0.2429253 5.1971471 1.6105275 7.7804240 1.3270635 -2.0442541
> est.ft
[1] 0.2429253 5.1971471 1.6105275 7.7804240 1.3270635 -2.0442541
然后你可以使用向量列表
mapply
和变化点列表y
来使用这个函数m
(我在这个测试中只使用了10个实现)。
> mapply( splitAt , x=y, pos=m)
$V1
[1] 0.4128471 5.5288876 2.7397518 8.5439779 0.7192723 3.3075475 -2.2773475
$V2
[1] -0.3943777 3.3181151 6.9971671 1.1576218 -1.8598642
$V3
[1] -0.9368701 4.2092452 0.9656501 7.2576583 0.9931713 -2.2473779
$V4
[1] -0.2403794 5.1575427 1.5175894 8.2009883 2.7080846 0.9270326 -2.1582418
$V5
[1] -0.3436777 4.9006335 2.9385906 0.9303320 -2.7066879
$V6
[1] -0.9856804 4.3627405 1.4778232 6.8431225 1.1335163 -1.7233991
$V7
[1] 0.2859023 4.9725381 1.9741004 6.1717678 1.7284418 -2.3646056
$V8
[1] -0.6060031 4.8036211 1.9822621 8.6880420 0.5106320 -2.2751981
$V9
[1] -0.4341405 4.4911962 1.6182828 7.7579370 0.4405483 -2.4892161
$V10
[1] 0.4838477 4.8951024 2.0386160 7.9571610 1.8665128 -1.7820840