web-dev-qa-db-ja.com

Rでstl関数と分解関数を使用しようとするとエラーが発生する

単純な時系列を作成しました。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

誰かがこの問題を手伝ってくれませんか?

13
user3183867

エラーメッセージから明らかではありませんか:

_time series has no or less than 2 periods
_

? Rはあなたのデータを教えてくれないではない定期的、それを渡したデータにindicationがないことだけが定期的であることを示しています。

時系列xには周期性がありませんRの観点からts()の周期性を通知するのを忘れたか、通知でエラーが発生したようです。 xがどのように作成されたかを示していないため、前に戻ってxを作成し、期間が2以上になるように指示する以外にできることはありません。

ここでのポイントは、それ自体では、Rは単位時間あたりの観測頻度を推測できないということです。その情報をts()に伝える必要があります。これを行うには、いくつかの方法があります。

frequency:単位時間あたりの観測数。

deltat:連続する観測間のサンプリング期間の割合。たとえば、月次データの場合は1/12。 frequencyまたはdeltatのいずれか1つのみを指定する必要があります。

これらのいずれかを指定しない場合、ts()はデフォルトの_frequency = 1_、_deltat = 1_を使用します。これは、単位時間あたり1回の観測(たとえば、1年あたり1回)の時系列を示します。 。

stl()には_"ts"_クラスのオブジェクトが必要です。指定しない場合、as.ts()を介して_"ts"_オブジェクトに入力データが強制されます。この関数は、上で説明したデフォルトを使用します。

ここで私が起こったと思うのは、stl()が_"ts"_クラスオブジェクトを必要とすることや、観測のベクトルを提供しただけではデータに不適切なオブジェクトを作成したことに気付かなかったということです。

解決策は、ts()を介して_"ts"_クラス化オブジェクトを明示的に作成し、frequencyまたはdeltatのいずれかを指定することです。

例えば。

_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_が必要だと思います。それはあなたが年間10回の観察をしていると言うでしょう。シリーズの年ごとの観測数が多い場合、たとえば月次データの場合は12であるが、最後の2か月または最初の2か月がない場合(つまり、欠落データがないNAs)、後で開始した(終了した)場合(以前)年に、したがってシリーズの一端または両端に完全な年の価値のあるデータがありません。