尝试在 R 中使用 stl 和分解函数时出错

Posted

技术标签:

【中文标题】尝试在 R 中使用 stl 和分解函数时出错【英文标题】:Error when trying to use stl and decompose functions in R 【发布时间】:2014-02-03 01:45:07 【问题描述】:

我制作了一个简单的时间序列,我在 sin 函数中添加了一点噪音,并尝试使用 R 中的“stl”和“decompose”函数对其进行分解,而我的序列肯定有超过 2 个周期并且是定期,R 给我两个函数的以下错误:

x
  [1]  1.4537365796  2.7185844368  2.8394728999  3.8926989923  4.3405508086  5.1959080871
  [7]  5.6602505790  5.4829985648  5.6357660330  4.6084976233  4.6617322922  4.0286486832
 [13]  3.3641752333  1.7408063182  0.8815147612  0.2895139342 -0.5402768515 -1.5612641107
 [19] -2.1584502547 -2.9878043526 -3.5545638149 -4.0530074199 -4.0748538612 -4.7581704662
 [25] -4.6555349052 -4.0726206240 -3.1646413472 -2.6934453823 -2.2364605277 -1.2643569882
 [31] -0.1202011946  1.1136371449  2.2504199271  3.0313528996  3.5384449109  4.5176211013
 [37]  5.4013172839  5.4252837451  5.4768196692  5.8979709077  5.6698285659  4.5133489450
 [43]  4.2702602998  3.5180837069  2.2652913344  1.1975595698  0.5412697849 -0.5966162032
 [49] -1.0827728340 -1.8488242277 -3.4118061838 -3.9009752140 -3.9102671954 -4.3486102172
 [55] -4.7481017993 -4.0097598695 -3.9078554267 -3.8070416888 -2.5968567322 -2.2567568949
 [61] -1.1423907008  0.0002492447  0.4338279080  1.2431986797  2.3216397323  3.3235925116
 [67]  4.1591487169  4.9028481873  5.4535861470  5.0579349546  5.1548777627  4.9707124992
 [73]  5.4496833187  4.4563072487  4.1301372986  2.4594352788  1.7253019929  0.6961453965
 [79]  0.4281167695 -1.3152944759 -1.8645880957 -2.5764132038 -3.7681528112 -4.3731672862
 [85] -3.9940201611 -4.5497596299 -4.9496796983 -4.1233093447 -3.7759837204 -3.3359027749
 [91] -2.3518009102 -1.7488933797 -0.7225148838  0.5395759836  1.0496249652  2.0383715782
 [97]  3.2357449979  3.8028316517  5.0346866280  5.2154265148

fit<- stl(x, t.window=15, s.window="per", robust=TRUE)
Error in stl(x, t.window = 15, s.window = "per", robust = TRUE) :series is not periodic or has less      than two periods

fit<- decompose(x,type="multiplicative")
Error in decompose(x, type = "multiplicative") :time series has no or less than 2 periods

有人能帮我解决这个问题吗?

【问题讨论】:

与往常一样,第一条规则是:绘制您的数据以确保它是您想要的。 尝试例如stl(ts(x,freq=10), t.window=15, s.window="per", robust=TRUE) 【参考方案1】:

从错误信息中是不是很明显:

time series has no or less than 2 periods

? R 并没有告诉您您的数据不是周期性的,只是您传递给它的数据没有指示它们是周期性的。

您的时间序列x 没有周期性从 R 的角度来看。看起来你忘了告诉,或者说错了,ts() 周期性是什么。由于您没有显示 x 是如何创建的,因此我们无能为力,只能告诉您返回并创建 x 以便它确实有 >=2 个句点。

这里的重点是,R 本身无法推断出每单位时间的观察频率。您必须告诉ts() 该信息。您可以通过多种方式做到这一点:

frequency:单位时间内的观察次数。

deltat: 连续采样周期的分数 观察;例如,每月数据的 1/12。只有其中之一 应提供frequencydeltat

如果您不提供其中之一,ts() 将使用默认值 frequency = 1deltat = 1,这表示每单位时间一次观察的时间序列(例如每年一次)。

stl() 需要 "ts" 分类对象 - 如果您不提供,它将通过 as.ts() 将输入数据强制转换为 "ts" 对象。这个函数将使用我上面描述的默认值。

我认为这里发生的情况是,您没有意识到 stl() 需要一个 "ts" 类对象,也没有在您提供观察向量时为您的数据创建不合适的对象。

解决方案是通过ts() 显式创建"ts" 分类对象并指定frequencydeltat 之一。

例如

dat <- cumsum(rnorm(12*4))
x <- ts(dat)
stl(x, "periodic")
xx <- ts(dat, frequency = 12)
stl(xx, "periodic")

这里我用frequency = 12表示每单位时间有12个观察值——比如每月的数据。

上面给了我

R> stl(x, "periodic")
Error in stl(x, "periodic") : 
  series is not periodic or has less than two periods

R> stl(xx, "periodic")
 Call:
 stl(x = xx, s.window = "periodic")

Components
       seasonal    trend remainder
Jan 1 -0.103529  0.55245  -0.44301
Feb 1  0.001333  0.56981   0.86135
Mar 1 -0.382075  0.58717   1.11162
Apr 1  0.010552  0.59891  -1.04966
....

考虑到时间序列的长度,我怀疑您想要frequency = 10 的数据;那就是说你每年有十次观察。如果该系列每年有更多的观测值,例如每月数据 12 个,但您没有最近两个月或前两个月(即没有缺失数据,NAs)您刚刚开始(结束)较晚(较早) ),因此在系列的一端或两端没有整年的数据。

【讨论】:

对不起,如果很明显,我是 R 的新手,但是,我的假设是周期性序列是常规序列,其中包含傅里叶变换中的某些频率,我有这个是因为我使用 Sin 函数创建它 是的,但就计算机所知或所关心的而言,它只是一个数字向量,没有迹象表明观察到这些数字的时间点。 良好而详细的答案,但我在尝试分析每小时数据时收到此错误消息 (xxx &lt;- ts(x, freq=24))。时间序列长度或每个周期的观察次数是否有限制?编辑:我有缺失值,我尝试使用na.action=na.passna.action=na.exclude @rbatt 我无法重现您的问题 (stl(ts(rnorm(1000), frequency = 24), "periodic")),所以其他一些细节很重要,但是看看我们看到的代码 if (period &lt; 2 || n &lt;= 2 * period) 所以除非您在data 你会得到那个错误信息。这与您的数据相符吗? @rbatt 该检查是在 NAs 已被删除之后进行的,因此在 NAs 之前,您的观察结果可能超过 2 * 24被删除,一旦它们被删除,您的数据就不会达到长度阈值。看来na.action 参数实际上并没有做任何事情。

以上是关于尝试在 R 中使用 stl 和分解函数时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中预测时自动绘图功能出错

尝试在 R 中使用 tmap 绘制 SpatialLinesDataFrame 时出错

使用 three.js 加载 STL 文件时出错

在 R 中将 predict() 与 randomForest 一起使用时出错

使用包 vegdist 在 R 中执行 NMDS 时出错

R:尝试转换 data.table 时出错