如何在Julia中对月度气温时间序列去季节化、去趋势并计算异常值?
Julia 时间序列去季节化、去趋势与异常值计算方案
核心工具包与操作方法
1. 基础组合工具实现
- 去趋势:通过线性回归拟合趋势项,再从原序列中剥离趋势:
using StatsBase, TimeSeries, GLM # 假设ts是你的月度气温TimeArray对象 dates = timestamp(ts) x = collect(1:length(dates)) # 拟合线性趋势模型 model = lm(@formula(value ~ x), DataFrame(x=x, value=values(ts))) trend = predict(model, DataFrame(x=x)) # 得到去趋势序列 detrended_ts = values(ts) .- trend - 去季节化:针对月度数据,计算各月份的平均波动,再从去趋势序列中减去对应月份的均值:
# 提取每个数据点的月份 months = Dates.month.(dates) # 计算1-12月的平均季节波动 seasonal_offsets = [mean(detrended_ts[months .== m]) for m in 1:12] # 得到去季节化+去趋势的序列 deseasonalized_detrended_ts = detrended_ts .- [seasonal_offsets[m] for m in months]
2. 专业时间序列包 TSA.jl
该包提供了开箱即用的时间序列分解功能,适合快速处理:
using TSA # 对时间序列进行加法模型分解(气温数据更适合加法模型) decomp_result = decompose(ts, model=:additive) # 分解后直接获取残差项(已去除趋势和季节成分) cleaned_ts = decomp_result.residual
3. 异常值计算
基于处理后的残差序列,常用两种异常值判定方式:
- 标准差法:将超出均值±3倍标准差的点视为异常值
res_mean = mean(cleaned_ts) res_std = std(cleaned_ts) outliers = cleaned_ts[(cleaned_ts .> res_mean + 3res_std) .| (cleaned_ts .< res_mean - 3res_std)] - 四分位距法:将低于Q1-1.5IQR或高于Q3+1.5IQR的点视为异常值
q1, q3 = quantile(cleaned_ts, [0.25, 0.75]) iqr = q3 - q1 outliers = cleaned_ts[(cleaned_ts .< q1 - 1.5iqr) .| (cleaned_ts .> q3 + 1.5iqr)]
注意事项
- 气温数据的季节波动幅度通常不随均值变化,优先选择加法模型;若处理的是营收等数据,可切换为乘法模型(设置
model=:multiplicative)。 - 若序列存在缺失值,可先用
TimeSeries.interpolate方法填充后再处理。
内容的提问来源于stack exchange,提问作者vcv
相关产品推荐
相关产品推荐

