R检测时间序列的增加/减少趋势


9

我有很多时间周期,包括时期:日,周或月。通过stl()功能或通过loess(x ~ y)我可以看到特定时间序列的趋势。我需要检测时间序列的趋势是增加还是减少。我该如何处理?

我尝试使用来计算线性回归系数lm(x ~ y)并使用斜率系数。(If |slope|>2 and slope>0 then上升趋势,else if |slope|>2 and slope<0–下降)。也许还有另一种更有效的趋势检测方法?谢谢!

例如:我有timeserie1timeserie2。我需要一个简单的算法,告诉我这timeserie2是一个递增的算法,在中timeserie1,趋势没有增加或减少。我应该使用什么标准?

timeserie1

1774 1706 1288 1276 2350 1821 1712 1654 1680 1451 1275 2140 1747 1749 1770 1797 1485 1299 2330 1822
1627 1847 1797 1452 1328 2363 1998 1864 2088 2084  594  884 1968 1858 1640 1823 1938 1490 1312 2312
1937 1617 1643 1468 1381 1276 2228 1756 1465 1716 1601 1340 1192 2231 1768 1623 1444 1575 1375 1267
2475 1630 1505 1810 1601 1123 1324 2245 1844 1613 1710 1546 1290 1366 2427 1783 1588 1505 1398 1226
1321 2299 1047 1735 1633 1508 1323 1317 2323 1826 1615 1750 1572 1273 1365 2373 2074 1809 1889 1521
1314 1512 2462 1836 1750 1808 1585 1387 1428 2176 1732 1752 1665 1425 1028 1194 2159 1840 1684 1711
1653 1360 1422 2328 1798 1723 1827 1499 1289 1476 2219 1824 1606 1627 1459 1324 1354 2150 1728 1743
1697 1511 1285 1426 2076 1792 1519 1478 1191 1122 1241 2105 1818 1599 1663 1319 1219 1452 2091 1771
1710 2000 1518 1479 1586 1848 2113 1648 1542 1220 1299 1452 2290 1944 1701 1709 1462 1312 1365 2326
1971 1709 1700 1687 1493 1523 2382 1938 1658 1713 1525 1413 1363 2349 1923 1726 1862 1686 1534 1280
2233 1733 1520 1537 1569 1367 1129 2024 1645 1510 1469 1533 1281 1212 2099 1769 1684 1842 1654 1369
1353 2415 1948 1841 1928 1790 1547 1465 2260 1895 1700 1838 1614 1528 1268 2192 1705 1494 1697 1588
1324 1193 2049 1672 1801 1487 1319 1289 1302 2316 1945 1771 2027 2053 1639 1372 2198 1692 1546 1809
1787 1360 1182 2157 1690 1494 1731 1633 1299 1291 2164 1667 1535 1822 1813 1510 1396 2308 2110 2128
2316 2249 1789 1886 2463 2257 2212 2608 2284 2034 1996 2686 2459 2340 2383 2507 2304 2740 1869  654
1068 1720 1904 1666 1877 2100  504 1482 1686 1707 1306 1417 2135 1787 1675 1934 1931 1456 1363 2027
1740 1544 1727 1620 1232 1199

timeserie2

 122  155  124   97  155  134  115  122  162  115  102  163  135  120  139  160  126  122  169  154
 121  134  143  100  121  182  139  145  135  147   60   58  153  145  130  126  143  129   98  171
 145  107  133  115  113   96  175  128  106  117  124  107  114  172  143  111  104  132  110   80
 159  131  113  123  123  104  101  179  127  105  133  127  101   97  164  134  124   90  110  102
  90  186   79  145  130  115   79  104  191  137  114  131  109   95  119  173  158  137  128  119
 109  120  182  140  133  113  121  110  122  159  129  124  119  109  108   95  167  138  125  105
 139  118  115  166  140  112  116  139  121  109  164  135  118  121  112  111  102  169  136  151
 132  135  130  112  156  134  121  116  114   91   86  141  160  116  118  112   84  114  165  141
 109  123  122  110  100  162  145  121  118  115  107  103  162  142  130  139  134  121  118  164
 147  125  120  134  107  130  158  141  144  148  124  135  118  212  178  154  167  155  176  143
 201  170  144  138  152  136  123  223  189  160  153  190  136  144  276  213  199  211  196  170
 179  460  480  499  550  518  493  557  768  685  637  593  507  611  569  741  635  563  577  498
 456  446  677  552  515  441  438  462  530  699  629  555  641  625  544  585  705  584  553  622
 506  500  533  777  598  541  532  513  434  510  714  631 1087 1249 1102  913  888 1147 1056 1073
1075 1136  927  922 1066 1074  996 1189 1062  999  974 1174 1097 1055 1053 1097 1065 1171  843  441
 552  779  883  773  759  890  404  729  703  810  743  743  946  883  813  876  841  742  715  960
 862  743  806  732  669  621

1
您的第二个示例没有趋势,因此您不应检测到趋势。在周期230,数据具有与趋势不同的电平移位(即0,0,0,0,0,0,1,1,1,1,1,1等)。同样,可以使用Tsay检验确定方差在200左右的变化。查看更多在这里www.unc.edu/~jbhill/tsay.pdf
汤姆·赖利

2
@Tom是的,您所说的在数据图中很明显。(实际上,一个图显示了三个单独的突然的电平转换,而不仅仅是一个)。但是,将其描述为不同于“趋势”并不能使您的分析合理,我知道这将揭示此时间序列行为中的细微细节。我想建议,通过对数据行为进行清晰的描述,而不是通过讨论“趋势”的可能定义,可以更好地为OP服务。她要了替代测试最小二乘斜率-这是一个事实的指示什么,她指“的趋势。”
whuber

Answers:


7

您可以应用一个零移相器滤波器,并切除所有高于某个阈值的频率。这会给您一种“趋势”。

例如,查看以下问题:“ 如何在R中的数据点上运行高通或低通滤波器? ”它们显示了如何使用Butterworth低通滤波器。该滤波器的问题在于它不是零相移,即,您看到低频分量的相移相对于原始信号。您可能想要找到不会移动相位的滤波器。如果这是经济数据,我建议按照劳伦斯·克里斯蒂安诺(Lawrence J. Christiano)和特里·J·菲茨杰拉德(Terry J. Fitzgerald)(1999)的“带通滤波器”建议克里斯蒂安诺的滤波器。对于物理数据,必须有大量的零相移滤波器可用。

更新:

这是将低通滤波器应用于第二时间序列的LOG的示例。需要LOG才能使差异均匀。

UPDATE2:

以下是带有频带的频域中的样本分解:不规则[2-19],周期性[20-99]和趋势[100-](以周期长度为单位)。必须根据对潜在现象的理解来仔细选择频带。


1
我对这个答案感到困惑了一段时间,终于意识到您必须使用“趋势”一词,就像许多统计学家使用“平稳”一样。这一切都说得通。我们应该希望OP尽快通过“趋势” 阐明她的意思。
ub

是的,我在时间序列分解意义上使用“趋势”:y =趋势+周期性+季节性+不规则,例如en.wikipedia.org/wiki/Decomposition_of_time_series 在这种情况下,趋势将是“非常低”的频率成分。多低取决于问题
Aksakal 2014年

1
似乎并非如此。当您滤除高频成分时,您将删除一些“不规则”(读取:噪声)以及周期性部分的一小部分,但趋势,中期和长期周期性成分以及季节性成分将全部保留。
ub

1
对于趋势,您可以使用低带通滤波器。假设您有数年的每月数据系列。在这种情况下,低频段可能是10年周期,因此您会切掉所有高于1/10的频率(时间以年为单位)。阈值确实取决于现象,在经济数据中,商业周期可能长达10-15年,因此您可能需要将低频段设置为1/16
Aksakal 2014年

1
如您的新插图所示,当您过于积极地进行过滤时,您也会丢失明显的趋势:您的平滑度非常强,几乎会丢失最后三分之一的数据。无论如何,这绝对不是您引用的Wikipedia文章描述的定性概念组成部分的分解。统计方法(无论如何执行)的另一个问题是统计方法:您如何测试 “趋势”是否存在以及趋势是上升还是下降?
whuber

3

时间序列中的趋势检测可以完全错误地执行,也可以更主动地执行。系列可以具有显示趋势的值(例如)1,2,3,4,5,然后在一个或多个时间点显示趋势的变化(例如,7,9,11,13,15,...另一个示例)1,1,1,1,1,2,3,4,5,6,其中前5个读数不存在趋势,然后出现趋势。1,1,1,1,1,2,2,2,2,2据说像这样的系列具有水平移动(截距变化)。汽车箱是一款软件(据我所知)独特地结合了分析功能以检测,测试和结合时间趋势。我是开发人员之一,并在此特定领域扩展了分析。您尝试使用的过程(在我看来是不正确的)是模型推定的,即没有脉冲,没有电平移动,没有季节性脉冲,没有ARIMA结构,恒定误差方差等。假设模型的另一个可能的不良示例是:采用 [1个-]ÿŤ=θ0+[中号一个/一个[R]一个Ť再次假设一个特殊的结构。

这里的想法是ARIMA模型可能不正确,或者 θ0 在不同的时间点变化(因此变化趋势)。

整个想法是让数据“说话”和分析“侦听”并检测“正确模型”或至少“有用模型”。

Orson Bean(或者也许是其他人)曾经说过:“趋势是趋势……直到它弯曲,并且当趋势弯曲时,趋势才结束。”时间序列中的本地时间趋势要求确定断点然后估算局部趋势。一些有用的材料/参考资料可以在http://www.autobox.com/OLDWEB/udontsay.html上找到

如果您希望发布一些数据,请这样做,我将一些结果发布回给您。


3
趋势是趋势是趋势\,但问题是,它会弯曲吗?\会改变其走向吗?通过某种不可预见的力量\会过早结束吗?亚历山大·凯恩克罗斯
尼克·考克斯

谢谢你的回答。我会研究您的信息。我也发布了一些数据。
Jurgita 2014年

1
在那种情况下,玛尔塔(Marta),听起来您正在测试一个全局的 “趋势”(就时间序列两端之间的典型值而言),而不是此答案中所述的局部趋势。那是对的吗?
ub

1
@尼克谢谢!由于花了一些精力来寻找消息源,因此,这里是:《经济预测》,皇家经济协会主席致辞,1969年7月3日。凯恩克罗斯(Cairncross)以林肯语录开始讲话,随后是最初的打油诗(刻意归因于“斯坦年龄预测者”)。随后的言论清楚地表明了他所指的是预测-趋势推断。
whuber

1
@whuber,您是对的,我正在寻找全球趋势。抱歉,如果我的问题引起误解。
Jurgita 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.