使用上MTS对象应用的功能的家庭(Using Apply family of functions o

2019-08-03 05:26发布

一个MTS对象上的使用申请(或sapply)发送到功能时删除其时间序列的性能。 我应该如何在每个时间序列应用相同的功能(与输入TS和TS输出)在MTS对象,并返回它(优选作为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对象发送的每个时间序列的作为载体,不保持其时间序列的属性(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

Answer 1:

对此的一种简单的方法,是指数,而不是一个干净的工作apply

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

apply放干净矢量的函数内,因为它首先将一个目的是一个矩阵。 通过使用[时间序列对象定义的函数,你确信你每次提取有效的时间序列。



Answer 2:

我改变MYFUNC检查它是否有一个TS对象作为参数x。

如果x不是TS,为STL需要这个参数类型它被转换为TS对象。

  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) 


文章来源: Using Apply family of functions on mts objects
标签: r apply