7

在发送到函数时,在 mts 对象上使用 apply(或 sapply)会删除其时间序列属性。我应该如何在 mts 对象中的每个时间序列上应用相同的函数(使用 ts 输入和 ts 输出)并返回它(最好作为 mts)[我的意思是除了使用 for 循环]?

例如假设我编写了一个返回时间序列趋势的函数(使用 stl)

myfunc <- function(x) {
      return(stl(x,"per")$time.series[,2])
}

现在为示例 mts

z <- ts(matrix(rnorm(90), 30, 3), start=c(1961, 1), frequency=4)
class(z)

仅发送一个时间序列可以正常工作:

myfunc(z[,1]) # works correctly, returns the trend of first series

我的函数不是为多个时间序列设计的,所以:

myfunc(z) # will not work returning the error below

Error in stl(x, "per") : only univariate series are allowed

在 mts 对象上使用 apply 将每个时间序列作为向量发送,而不保留其时间序列属性 (tsp):

apply(z,2,myfunc) # will not work returning the error below

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

2 回答 2

8

解决此问题的一种简单方法是使用索引而不是 clean apply

sapply(seq_len(ncol(z)),function(i) myfunc(z[,i]))

apply将干净的向量放入函数中,因为它首先将对象转换为矩阵。通过使用[为时间序列对象定义的函数,您可以确保每次都提取一个有效的时间序列。

于 2012-11-27T12:44:56.673 回答
3

我更改 myfunc 以检查它是否有一个 ts 对象作为参数 x。

如果 x 不是 ts ,则将其转换为 ts 对象,因为stl需要此参数类型。

  myfunc <- function(x,...){
        y <- x
       if(class(x) != 'ts') {
         dots <- c(...)
         y <- ts(x,start=c(dots[1], dots[2]), frequency=dots[3])
       }
       return(stl(y,"per")$time.series[,2])
     }
  ## no need to conversion (already ts object)
  myfunc(z[,1])


  ## mts object ( here we give parameter necessary for conversion)
  apply(z,2,myfunc,1961,1,4) 
于 2012-11-27T12:42:18.137 回答