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)

時系列の1つだけを送信すると正しく機能します。

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 を変更して、パラメーター x として ts オブジェクトがあるかどうかを確認します。

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) 
于 2012-11-27T12:42:18.137 に答える