检测R中每月时间序列的平均变化年数

时间:2015-11-18 04:12:32

标签: r statistics time-series probability

我有兴趣在月度数据的趋势中找到多个平均变化年份,即平均值发生显着变化的年份。我遇到了一个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

问题:

  1. 当我使用method = "AMOC"(最多一次更改)时,它给了我点。但method = "BinSeg"由于某种原因无效。
  2. 当使用method = "PELT"时,图片中会有很多变化点,这当然不是一个好例子,因为我经历了link
  3. 简而言之,使用哪种方法来获得平均变化年份,我的数据可以从here访问。如果任何其他方法比这些方法更好并且在R中可用,请建议。

1 个答案:

答案 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))

tsdiag

毫不奇怪,各种结构变化测试是不重要的,例如,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)

bfast

有关详细信息,请参阅citation("strucchange")citation("bfast")