有没有办法在 R 中模拟具有特定滚动平均值和自相关性的时间序列数据?

Ber*_*enk 5 simulation r time-series arima autocorrelation

我有一个现有的时间序列(1000 个样本),并使用 R 中的函数计算滚动平均值filter(),每个样本取 30 个样本的平均值。这样做的目标是创建时间序列的“平滑”版本。现在我想创建“看起来像”原始时间序列的人工数据,即有些噪音,如果我将相同的filter()函数应用于人工数据,这将导致相同的滚动平均值。简而言之,我想模拟一个具有相同总体过程但不与现有时间序列完全相同的值的时间序列。总体目标是研究某些方法是否可以检测时间序列之间趋势的相似性,即使趋势周围的波动不相同。

为了提供一些数据,我的时间序列看起来有点像这样:

set.seed(576)
ts <- arima.sim(model = list(order = c(1,0,0), ar = .9), n = 1000) + 900

# save in dataframe
df <- data.frame("ts" = ts)

# plot the data
plot(ts, type = "l")
Run Code Online (Sandbox Code Playgroud)

过滤函数产生滚动平均值:

my_filter <- function(x, n = 30){filter(x, rep(1 / n, n), sides = 2, circular = T)}
df$rolling_mean <- my_filter(df$ts)
lines(df$rolling_mean, col = "red")
Run Code Online (Sandbox Code Playgroud)

为了模拟数据,我尝试了以下方法:

  1. 向滚动平均值添加随机噪声。
df$sim1 <- df$rolling_mean + rnorm(1000, sd = sd(df$ts))

lines(df$sim1, col = "blue")

df$sim1_rm <- my_filter(df$sim1)
lines(df$sim1_rm, col = "green")
Run Code Online (Sandbox Code Playgroud)

问题是:a)模拟值的方差高于原始值的方差,b)滚动平均值虽然与原始值非常相似,但有时与原始值偏差很大,c)有不存在自相关性。数据中具有自相关结构会很好,因为它应该类似于原始数据。

编辑:问题 a) 可以通过使用sd = sqrt(var(df$ts)-var(df$rolling_mean))而不是 来解决sd = sd(df$ts)。

  1. 我尝试过arima.sim(),这似乎是指定数据中应存在的自相关的明显选择。arima()我使用模型参数作为 的输入对原始数据进行建模arima.sim()。
ts_arima <- arima(ts, order = c(1,0,1))

my_ar <- ts_arima$coef["ar1"]
my_ma <- ts_arima$coef["ma1"]
my_intercept <- ts_arima$coef["intercept"]

df$sim2 <- arima.sim(model = list(order = c(1,0,1), ar = my_ar, ma = my_ma), n = 1000) + my_intercept

plot(df$ts)
lines(df$sim2, col = "blue")
Run Code Online (Sandbox Code Playgroud)

生成的时间序列与原始时间序列有很大不同。也许更高的顺序 forar和mainarima.sim()可以解决这个问题,但我认为一种完全不同的方法可能更合适。