stl()分解不会接受单变量ts对象?

mok*_*oku 4 r

我在R中的stl()时间序列分解函数有问题告诉我,当它实际上是我的ts对象不是单变量的吗?

tsData <- ts(data = dummyData, start = c(2012,1), end = c(2014,12), frequency = 12)

> tsData
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2012  22  26  34  33  40  39  39  45  50  58  64  78
2013  51  60  80  80  93 100  96 108 111 119 140 164
2014 103 112 154 135 156 170 146 156 166 176 193 204

> class(tsData)
[1] "ts"

> stl(tsData, s.window = "periodic")
Error in stl(tsData, s.window = "periodic") : 
  only univariate series are allowed

> dput(dummyData)
structure(list(index = c(22L, 26L, 34L, 33L, 40L, 39L, 39L, 45L, 
50L, 58L, 64L, 78L, 51L, 60L, 80L, 80L, 93L, 100L, 96L, 108L, 
111L, 119L, 140L, 164L, 103L, 112L, 154L, 135L, 156L, 170L, 146L, 
156L, 166L, 176L, 193L, 204L)), .Names = "index", class = "data.frame", row.names = c(NA, 
-36L))
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解决这个问题?

Eli*_*ias 9

为了避免这些类型的问题或错误,尝试仅通过形成原始数据点或值来创建单变量时间序列,调用ts()函数.

更好地说,您应该始终只将变量的值放在变量的整个结构中.让我通过一个非常简单的例子来解释一下:

想象一下,你有一个变量X,它是一个矢量(很可能是从其他数据源导入或形成的),它是100x1维度,即它包含100个值或数据点.如果你想用这个向量制作一个单变量的时间序列,那么做错的方法就像你为你的情况做的那样:

ts(X,频率= 24)

要小心,正确的做法是这样的:

ts(X [1:100],频率= 24)

或者甚至喜欢这样:

ts(X [1:100,1],频率= 24)

我希望亲爱的朋友,你可以在下次需要制作一个单变量的时间序列时避开它.!!


nru*_*ell 5

我不是100%地肯定有什么问题的确切原因,但你可以通过解决这个问题dummyData$indexts的,而不是整个对象:

tsData2 <- ts(
  data=dummyData$index, 
  start = c(2012,1), 
  end = c(2014,12), 
  frequency = 12)
##
R>  stl(tsData2, s.window="periodic")
 Call:
 stl(x = tsData2, s.window = "periodic")

Components
            seasonal     trend   remainder
Jan 2012 -24.0219753  36.19189   9.8300831
Feb 2012 -20.2516062  37.82808   8.4235219
Mar 2012  -0.4812396  39.46428  -4.9830367
Apr 2012 -10.1034302  41.32047   1.7829612
May 2012   0.6077088  43.17666  -3.7843705
Jun 2012   4.4723800  45.22411 -10.6964877
Jul 2012  -7.6629462  47.27155  -0.6086074
Aug 2012  -1.0551286  49.50673  -3.4516016
Sep 2012   2.2193527  51.74191  -3.9612597
Oct 2012   7.3239448  55.27391  -4.5978509
Nov 2012  18.4285405  58.80591 -13.2344456
Dec 2012  30.5244146  63.70105 -16.2254684
Run Code Online (Sandbox Code Playgroud)

...


我猜,当你传递data.framedata的说法ts,一些额外的属性结转,虽然这通常似乎不符合该采取多种功能的问题ts类对象(一元或其它方式),显然这是一个问题stl.

R>  all.equal(tsData2,tsData)
[1] "Attributes: < Names: 1 string mismatch >"                         
[2] "Attributes: < Length mismatch: comparison on first 2 components >"
[3] "Attributes: < Component 2: Numeric: lengths (3, 2) differ >"      
##
R>  str(tsData2)
 Time-Series [1:36] from 2012 to 2015: 22 26 34 33 40 39 39 45 50 58 ...
##
R>  str(tsData)
 'ts' int [1:36, 1] 22 26 34 33 40 39 39 45 50 58 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr "index"
 - attr(*, "tsp")= num [1:3] 2012 2015 12
Run Code Online (Sandbox Code Playgroud)

编辑:

进一步研究这个问题,我认为这个问题与dimnamesdummyData整个传递时传递的属性有关.请注意以下内容的摘录stl:

if (is.matrix(x)) 
        stop("only univariate series are allowed")
Run Code Online (Sandbox Code Playgroud)

并从定义matrix:

如果x是向量并且具有长度为2的"dim"属性,则is.matrix返回TRUE,否则返回FALSE

因此,尽管您传递的stl是单变量时间序列(原始tsData),但就函数而言,具有长度2 dimnames属性(即a matrix)的向量不是单变量序列.以这种方式进行错误处理似乎有点奇怪,但我确信该函数的作者有一个很好的理由.