我有一些高度季节性的天气相关数据,我想做的是识别一些“异常值”并将这些异常值更改为合理的值(我不想删除它们)。
我正在使用pracma包中的hampel过滤器来识别和纠正这些异常值,但问题是一些季节性峰值被降低了太多。我猜这个函数没有考虑季节性。下图显示了这一点(24 个月的窗口),红线是过滤后的数据。
有没有办法纠正这个问题?换句话说,取“峰值”并在季节之间平均它们?谢谢!
我有一些高度季节性的天气相关数据,我想做的是识别一些“异常值”并将这些异常值更改为合理的值(我不想删除它们)。
我正在使用pracma包中的hampel过滤器来识别和纠正这些异常值,但问题是一些季节性峰值被降低了太多。我猜这个函数没有考虑季节性。下图显示了这一点(24 个月的窗口),红线是过滤后的数据。
有没有办法纠正这个问题?换句话说,取“峰值”并在季节之间平均它们?谢谢!
正如@Michael 所建议的那样,这里有一些删除季节性组件的代码,对剩余的系列应用异常值过滤器,并再次添加季节性组件(使用风险自负):
filter.outliers = function(serie.orig)
{
require(forecast)
require(pracma)
## get a stl decomposition object
stl.decomp = stl(serie.orig, s.window = 'periodic', t.window = 13, robust = T)
## remove the seasonal component
serie.desaz = seasadj(stl.decomp)
## apply a hampel filter
serie.desaz2 = hampel(serie.desaz, k = 12)$y
## put back the seasonal component
return(serie.desaz2 + stl.decomp$time.series[, 'seasonal'])
}