1. ホーム
  2. r

[解決済み] ts(x) のエラー : 'ts' オブジェクトは1つ以上のオブザベーションを持つ必要があります。

2022-02-18 07:21:05

質問

を使用して予測する場合 forecast ライブラリで、次のコードが期待通りに実行されないことに気づきました。

library(forecast)
library(dplyr)
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100))

get <- function (df1){
  ts1 <- ts((df1%>%filter(gp==2))$dt)
  as.numeric(forecast(ar(ts1),15)$mean)
}    

print(get(df1))

エラーリターンは

Error in ts(x) : 'ts' object must have one or more observations.

原因は ar または ar.burg 関数を使用します。なぜなら、もしこの関数を ets などでは、この関数はうまく動作します。

もっと不思議なのは、コードを変更すると。

library(forecast)
library(dplyr)
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100))
ts1 <- ts((df1%>%filter(gp==2))$dt)

get <- function (ts1){
  as.numeric(forecast(ar(ts1),15)$mean)
}


print(get(ts1))

コードも正常に実行されています。のバグかもしれませんね。 ar 関数があり、問題はスコープに何らかの関連があるようです。このことについて何か考えがありますか?

解決方法は?

問題はスコープに関係することです。 forecast() は、モデルの適合に使用される時系列を見つけようとします。forecastパッケージの関数(例えば ets ) はこの情報をモデルオブジェクトに格納するので、簡単に forecast() を見つけることができます。しかし ar() はstatsパッケージのもので、モデル適合に使用した時系列を保存しません。そこで forecast() を探しに行きます。もしコードを get() 関数を使用すれば、問題なく動作します。 forecast() を見つけることに成功しました。 ts1 オブジェクトをローカル環境で使用することができます。しかし、その中の get() 関数を使用すると、エラーが発生します。

簡単な修正の1つは、フィットしたモデルに情報を追加してから forecast :

library(forecast)
library(dplyr)
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100))
ts1 <- ts((df1%>%filter(gp==2))$dt)

get <- function (ts1){
  fit <- ar(ts1)
  fit$x <- ts1
  as.numeric(forecast(fit,15)$mean)
}

print(get(ts1))

または predict の代わりに forecast :

library(dplyr)
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100))
ts1 <- ts((df1%>%filter(gp==2))$dt)

get <- function (ts1){
  fit <- ar(ts1)
  as.numeric(predict(fit,n.ahead=15)$pred)
}

print(get(ts1))