我有兴趣在月度数据的趋势中找到多个平均变化年份,即平均值发生显着变化的年份。我遇到了一个R包changepoint并将我的问题表述为
library(changepoint)
df <- read.csv("test.csv")
tdf <- ts(df$x, frequency = 12, start = c(1991, 1))
d <- decompose(tdf)
tr <- as.vector(d$trend)
tr2 <- tr[13:432]
cp <- cpt.mean(tr2,penalty="SIC",pen.value=0.05, method="BinSeg", Q=80, class=FALSE)
plot(p)
现在它抛出错误
Error in 1:nseg : NA/NaN argument
问题:
答案 0 :(得分:1)
我不确定"BinSeg"
方法究竟出现了什么问题,但"PELT"
检测到的许多更改点都是由删除季节性和余数引起的。如果您想在changepoint
建模之前季节性地调整数据,那么您不应该只提取趋势。在decompose()
的情况下,这是移动平均线,因此与看似低的方差高度相关。
您可以考虑使用bfast
包提供“中断添加季节和趋势”分解。这使您可以捕捉季节或趋势的变化。它建立在strucchange
包中的结构变更(或变更点)测试的基础上。
分析数据的一种可能方法是使用一个没有任何趋势和谐波(正弦/余弦)季节模式的简单模型。可以使用bfastpp()
功能轻松设置各种频率的谐波回归量(默认值= 3):
df <- read.csv("test_22.csv")
tdf <- ts(df$x, frequency = 12, start = c(1991, 1))
df <- bfastpp(tdf)
names(df)
## [1] "time" "response" "trend" "season" "harmon"
在没有任何结构变化点的情况下拟合全样本模型得出:
m <- lm(response ~ harmon, data = df)
summary(m)
## Call:
## lm(formula = response ~ harmon, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -132.297 -13.619 -0.909 11.701 156.339
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 97.248 1.160 83.857 < 2e-16 ***
## harmoncos1 -114.401 1.640 -69.754 < 2e-16 ***
## harmoncos2 46.924 1.640 28.612 < 2e-16 ***
## harmoncos3 -15.276 1.640 -9.314 < 2e-16 ***
## harmonsin1 -29.878 1.640 -18.218 < 2e-16 ***
## harmonsin2 30.348 1.640 18.505 < 2e-16 ***
## harmonsin3 -7.165 1.640 -4.369 1.56e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 24.44 on 437 degrees of freedom
## Multiple R-squared: 0.9367, Adjusted R-squared: 0.9358
## F-statistic: 1077 on 6 and 437 DF, p-value: < 2.2e-16
残差的时间序列及其ACF看起来也相当不错
plot(ts(residuals(m), start = 1991, frequency = 12)
acf(residuals(m))
毫不奇怪,各种结构变化测试是不重要的,例如,MOSUM型测试或supLM测试。我尝试的所有其他测试也没有产生重大变化。
sctest(m, functional = maxMOSUM(0.25))
## M-fluctuation test
##
## data: m
## f(efp) = 1.3143, p-value = 0.2315
sctest(m, functional = supLM(0.1))
## M-fluctuation test
##
## data: m
## f(efp) = 17.666, p-value = 0.2162
您也可以一次性使用函数bfast()
进行类似的分析。这也会在第一次迭代中停止,因为它没有检测到中断。
bf <- bfast(tdf, season = "harmon", max.iter = 100)
plot(bf)
有关详细信息,请参阅citation("strucchange")
和citation("bfast")
。