有没有一种方法可以模拟具有特定滚动平均值和R中自相关的时间序列数据?

问题描述

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

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

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

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

# plot the data
plot(ts,type = "l")

filter函数产生滚动平均值:

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")

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

  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")

问题在于: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,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,1),ar = my_ar,ma = my_ma),n = 1000) + my_intercept

plot(df$ts)
lines(df$sim2,col = "blue")

所得到的时间序列与原始时间序列有很大不同。也许ar中的maarima.sim()更高的顺序可以解决这个问题,但是我认为完全不同的方法可能更合适。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...