问题描述
我有一个现有的时间序列(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")
为了模拟数据,我尝试了以下方法:
- 在滚动平均值上添加随机噪声。
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)
来解决。
- 我尝试了
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
中的ma
和arima.sim()
更高的顺序可以解决这个问题,但是我认为完全不同的方法可能更合适。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)