如何计算 1000 次模拟数据实现的数据段的平均值?

问题描述 投票:0回答:1

我正在研究变化点检测,想要估计 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 个实现的 CP
y=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)
r
1个回答
0
投票

你就快到了。我根据这个答案改编了一个函数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
© www.soinside.com 2019 - 2024. All rights reserved.