R 季节性时间序列

机器算法验证 r 回归 时间序列
2022-03-12 06:29:46

我使用该decompose函数R并提出了我每月时间序列的 3 个组成部分(趋势、季节性和随机)。如果我绘制图表或查看表格,我可以清楚地看到时间序列受季节性影响。

然而,当我将时间序列回归到 11 个季节性虚拟变量上时,所有系数都没有统计学意义,这表明没有季节性。

我不明白为什么我会得出两个截然不同的结果。这发生在任何人身上吗?难道我做错了什么?


我在这里添加一些有用的细节。

这是我的时间序列和相应的每月变化。在这两个图表中,您都可以看到存在季节性(或者这是我想要评估的)。特别是,在第二张图表(这是该系列的每月变化)中,我可以看到一个反复出现的模式(一年中同一个月的高点和低点)。

时间序列

每月变化

下面是decompose函数的输出。我很欣赏,正如@RichardHardy 所说,该函数不会测试是否存在实际的季节性。但分解似乎证实了我的想法。

分解

但是,当我对 11 个季节性虚拟变量(1 月至 11 月,不包括 12 月)的时间序列进行回归时,我发现以下内容:

    Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
    (Intercept) 5144454056  372840549  13.798   <2e-16 ***
    Jan     -616669492  527276161  -1.170    0.248    
    Feb     -586884419  527276161  -1.113    0.271    
    Mar     -461990149  527276161  -0.876    0.385    
    Apr     -407860396  527276161  -0.774    0.443    
    May     -395942771  527276161  -0.751    0.456    
    Jun     -382312331  527276161  -0.725    0.472    
    Jul     -342137426  527276161  -0.649    0.520    
    Aug     -308931830  527276161  -0.586    0.561    
    Sep     -275129629  527276161  -0.522    0.604    
    Oct     -218035419  527276161  -0.414    0.681    
    Nov     -159814080  527276161  -0.303    0.763

基本上,所有的季节性系数在统计上都不显着。

要运行线性回归,我使用以下函数:

lm.r = lm(Yvar~Var$Jan+Var$Feb+Var$Mar+Var$Apr+Var$May+Var$Jun+Var$Jul+Var$Aug+Var$Sep+Var$Oct+Var$Nov)

我将 Yvar 设置为具有每月频率(频率 = 12)的时间序列变量。

我还尝试考虑时间序列的趋势部分,包括回归的趋势变量。然而,结果并没有改变。

                  Estimate Std. Error t value Pr(>|t|)    
    (Intercept) 3600646404   96286811  37.395   <2e-16 ***
    Jan     -144950487  117138294  -1.237    0.222    
    Feb     -158048960  116963281  -1.351    0.183    
    Mar      -76038236  116804709  -0.651    0.518    
    Apr      -64792029  116662646  -0.555    0.581    
    May      -95757949  116537153  -0.822    0.415    
    Jun     -125011055  116428283  -1.074    0.288    
    Jul     -127719697  116336082  -1.098    0.278    
    Aug     -137397646  116260591  -1.182    0.243    
    Sep     -146478991  116201842  -1.261    0.214    
    Oct     -132268327  116159860  -1.139    0.261    
    Nov     -116930534  116134664  -1.007    0.319    
    trend     42883546    1396782  30.702   <2e-16 ***

因此我的问题是:我在回归分析中做错了吗?

3个回答

移除趋势后,您是否对数据进行回归?您有一个积极的趋势,并且您的季节性特征可能在您的回归中被掩盖(由于趋势或错误导致的方差大于月份),除非您已经考虑了 Yvar 中的趋势......

另外,我对时间序列不是非常有信心,但不应该为每个观察分配一个月,你的回归看起来像这样吗?

lm(Yvar ~ Time + Month)

如果这没有意义,请道歉......回归在这里最有意义吗?

在您对时间序列的图形描述中,很明显“趋势”——时间上的线性分量——是实现的最重要的贡献者。我们会评论说,这个时间序列最重要的方面是每个月的稳定增长。

在那之后,我会评论说,相比之下,季节性变化是微不足道的。因此,使用超过 6 年的月度测量值(总共只有 72 次观测),线性回归模型无法准确地将 11 个月的对比中的任何一个识别为统计显着性也就不足为奇了。此外,时间效应确实达到了统计显着性也就不足为奇了,因为在所有 72 个观测值上发生的近似一致的线性增加是相同的,取决于它们的季节性效应。

任何 11 个月的对比缺乏统计显着性并不意味着没有季节性影响。事实上,如果您要使用回归模型来确定是否存在任何季节性,则合适的检验是嵌套 11 自由度检验,它同时评估每个月对比的统计显着性。您可以通过执行 ANOVA、似然比检验或稳健 Wald 检验来获得这样的检验。例如:

library(lmtest) model.mt <- lm(outcome ~ time + month) model.t <- lm(outcome ~ time) aov(model.mt, model.t) lrtest(model.mt, model.t) library(sandwich) ## autoregressive consistent robust standard errors waldtest(lrtest, lmtest, vcov.=function(x)vcovHAC(x))

我不知道是不是你的情况,但是当我开始在 R 中分析时间序列时发生在我身上,问题是我在创建时间序列对象来分解它时没有正确说明时间序列周期。时间序列函数中有一个参数可让您指定其频率。这样做,它正确地分解了它的季节性趋势。