ウェブサイトの訪問者数に関する毎日の時系列があります。私のシリーズは_01/06/2014
_から今日_14/10/2015
_までであるため、将来の訪問者数を予測したいと思います。 Rでシリーズを読むにはどうすればよいですか?考えています:
_series <- ts(visitors, frequency=365, start=c(2014, 6))
_
はいの場合、時系列モデルを実行した後arimadata=auto.arima()
次の60日間の訪問者数を予測したいのですが、どうすればよいですか?
_h=..?
forecast(arimadata,h=..),
_
h
の値は何ですか?ご協力ありがとうございます
ts
の指定が間違っています。これを毎日の観測として設定する場合は、2014年6月1日が何曜日であるかを指定し、start
で指定する必要があります。
_## Create a daily Date object - helps my work on dates
inds <- seq(as.Date("2014-06-01"), as.Date("2015-10-14"), by = "day")
## Create a time series object
set.seed(25)
myts <- ts(rnorm(length(inds)), # random data
start = c(2014, as.numeric(format(inds[1], "%j"))),
frequency = 365)
_
start
をc(2014, as.numeric(format(inds[1], "%j")))
として指定していることに注意してください。複雑なことは、6月1日が何の日かを特定することです。
_> as.numeric(format(inds[1], "%j"))
[1] 152
_
これができたら、効果的にそこにいます:
_## use auto.arima to choose ARIMA terms
fit <- auto.arima(myts)
## forecast for next 60 time points
fore <- forecast(fit, h = 60)
## plot it
plot(fore)
_
私が提供したランダムデータを考えると、それは適切なようです...
データに適したauto.arima()
の適切な引数を選択する必要があります。
X軸のラベルは、年の0.5(半)を指すことに注意してください。
これは、Zooパッケージを使用して作成されたZoo
オブジェクトを介して行う方が簡単かもしれません。
_## create the Zoo object as before
set.seed(25)
myzoo <- Zoo(rnorm(length(inds)), inds)
_
start
またはfrequency
情報を指定する必要はありません。毎日inds
オブジェクトから以前に計算されたDate
を使用するだけです。
前と同じように進めます
_## use auto.arima to choose ARIMA terms
fit <- auto.arima(myts)
## forecast for next 60 time points
fore <- forecast(fit, h = 60)
_
ただし、x軸はエポック(1970-01-01)以来の日数であるため、プロットは問題を引き起こすため、この軸の自動プロットを抑制してから独自に描画する必要があります。 inds
があるのでこれは簡単です
_## plot it
plot(fore, xaxt = "n") # no x-axis
Axis(inds, side = 1)
_
これにより、ラベル付きのティックが2つだけ生成されます。さらに制御したい場合は、目盛りとラベルを配置する場所をRに伝えます。
_## plot it
plot(fore, xaxt = "n") # no x-axis
Axis(inds, side = 1,
at = seq(inds[1], tail(inds, 1) + 60, by = "3 months"),
format = "%b %Y")
_
ここでは、3か月ごとにプロットします。
時系列オブジェクトは、毎日の時系列の作成ではうまく機能しません。 Zooライブラリを使用することをお勧めします。
Library(Zoo)
Zoo(visitors, seq(from = as.Date("2014-06-01"), to = as.Date("2015-10-14"), by = 1))
Rに複数の季節性がある日次データを予測するためのステップバイステップガイドがあります。時系列が非常に長くない限り、最も簡単なアプローチは、頻度属性を7に設定することです。
y <- ts(x, frequency=7)
その後、通常の時系列予測方法のいずれかが合理的な予測を生成するはずです。例えば
library(forecast)
fit <- ets(y)
fc <- forecast(fit)
plot(fc)
時系列が1年以上を取り込むのに十分な長さである場合、1年ごとの季節性と1週間ごとの季節性を考慮する必要があります。その場合、TBATSなどの複数の季節モデルが必要です。
y <- msts(x, seasonal.periods=c(7,365.25))
fit <- tbats(y)
fc <- forecast(fit)
plot(fc)
これは、週ごとのパターンと、より長い年次パターンをキャプチャする必要があります。期間365.25は、うるう年を考慮した1年の平均の長さです。一部の国では、代替または追加の年の長さが必要になる場合があります。
イースターや旧正月などの感動的なイベントに関連する季節性を把握することはさらに困難です。毎月のデータを使用しても、フェスティバルは3月または4月(イースターの場合)または1月または2月(旧正月の場合)に落ちる可能性があるため、注意が必要です。通常の季節モデルではこれができません。移動する休日の影響に対処する最良の方法は、ダミー変数を使用することです。ただし、ETSモデルもTBATSモデルも共変量を許可しません。 TBATSと同じ形式の状態空間モデルを使用できますが、複数のエラーおよび共変量の原因がありますが、それを行うためのRコードはありません。
代わりに、ARIMAエラーのある回帰モデルを使用できます。回帰モデルには、ダミーの休日効果と長い年次季節性が含まれます。何十年ものデータがない限り、通常、年間の季節形状は年ごとに変化しないと仮定するのが合理的であるため、フーリエ項を使用して年間の季節性をモデル化できます。 K = 5フーリエ項を使用して年間の季節性をモデル化し、休日のダミー変数がholidayfに100個の将来値を持つベクトルholidayにあるとします。次に、次のコードが適切なモデルに適合します。
y <- ts(x, frequency=7)
z <- fourier(ts(x, frequency=365.25), K=5)
zf <- fourierf(ts(x, frequency=365.25), K=5, h=100)
fit <- auto.arima(y, xreg=cbind(z,holiday), seasonal=FALSE)
fc <- forecast(fit, xreg=cbind(zf,holidayf), h=100)
次数Kは、近似モデルのAICを最小化することで選択できます。
これは、かなりの数の観測が欠落しているいくつかの毎日の観測が与えられたときに、時系列を作成する方法です。 @ gavin-simpsonは非常に大きな助けになりました。これが誰かの悲しみを救うことを願っています。
元のデータは次のようになりました。
library(lubridate)
set.seed(42)
minday = as.Date("2001-01-01")
maxday = as.Date("2005-12-31")
dates <- seq(minday, maxday, "days")
dates <- dates[sample(1:length(dates),length(dates)/4)] # create some holes
df <- data.frame(date=sort(dates), val=sin(seq(from=0, to=2*pi, length=length(dates))))
このデータを使用して時系列を作成するには、日付ごとに1行の「ダミー」データフレームを作成し、それを既存のデータフレームとマージしました。
df <- merge(df, data.frame(date=seq(minday, maxday, "days")), all=T)
このデータフレームは時系列にキャストできます。欠落している日付はNA
です。
nts <- ts(df$val, frequency=365, start=c(year(minday), as.numeric(format(minday, "%j"))))
plot(nts)
series <- ts(visitors, frequency=365, start=c(2014, 152))
152の数値は、頻度= 365のために152の数値から始まるため、2014年1月6日です。60日間を予測するには、h = 60です。
forecast(arimadata , h=60)