我在 R 中有一个时间序列对象,其中包含来自测量自行车交通模式的传感器的数据。 我想删除代表测量错误的异常值。 通过目视检查可以轻松识别测量误差。 数据具有每年和每周的季节性,这似乎混淆了预测包中 tsclean() 函数中使用的过程,该函数是为此任务设计的。
我不想手动执行此操作,因为我将自动化大约 30 个时间序列对象的过程。
如何调整 tsclean() 函数,使其对每周周期不太敏感?
请帮忙!谢谢。
我使用以下代码来删除异常值并绘制结果以进行目视检查。 抱歉,ts 对象太大,无法在此处生成示例。
1。没有变形
library(forecast)
no_outlier <- tsclean(ts_Rachel_HoteldeVille, lambda = NULL)
plot(ts_Rachel_HoteldeVille, col='black', lwd=2)
lines(no_outlier, col = "red", lwd=2)
title(main = "No transformation")
异常值由黑线表示。应该只删除大约 9 个数据点。 清理后的数据为红色。 它太敏感并且正在删除代表正常每周变化的数据点
2。 Box Cox 应用
no_outlier_boxcox <- tsclean(ts_Rachel_HoteldeVille, lambda = "auto")
plot(ts_Rachel_HoteldeVille, col='black', lwd=2)
lines(no_outlier, col = "orange", lwd=2)
title(main = "Box Cox applied")
我还尝试应用 Box-Cox 变换,它提供了更好的结果,但并不完美。 在本例中,橙色线代表“已清理”的时间序列。 它仍在删除某些非异常值数据点,但实际上保留了明显的异常值。
tsclean()
将 MSTL 模型拟合到时间序列,然后删除季节性分量。接下来,它拟合“超级平滑”来对趋势进行建模,并将其从季节性调整后的数据中删除。最后,它使用与 Tukey 原始箱线图中“远出”值相同的阈值来识别剩余序列中的异常值。请参阅 https://robjhyndman.com/hyndsight/tsoutliers/ 了解详细信息。
如果它不适用于您的数据,您可以执行类似的操作,但找到一种更适合您的应用程序的季节性和/或趋势建模方法。关键思想是以某种方式对信号进行建模,将其删除,然后在剩下的内容中找到异常值。