私はいくつかの研究を行ってきましたが、解決策を見つけることができません。時系列データ、非常に基本的なデータフレームがあります。それをx
と呼びましょう。
Date Used
11/1/2011 587
11/2/2011 578
11/3/2011 600
11/4/2011 599
11/5/2011 678
11/6/2011 555
11/7/2011 650
11/8/2011 700
11/9/2011 600
11/10/2011 550
11/11/2011 600
11/12/2011 610
11/13/2011 590
11/14/2011 595
11/15/2011 601
11/16/2011 700
11/17/2011 650
11/18/2011 620
11/19/2011 645
11/20/2011 650
11/21/2011 639
11/22/2011 620
11/23/2011 600
11/24/2011 550
11/25/2011 600
11/26/2011 610
11/27/2011 590
11/28/2011 595
11/29/2011 601
11/30/2011 700
12/1/2011 650
12/2/2011 620
12/3/2011 645
12/4/2011 650
12/5/2011 639
12/6/2011 620
12/7/2011 600
12/8/2011 550
12/9/2011 600
12/10/2011 610
12/11/2011 590
12/12/2011 595
12/13/2011 601
12/14/2011 700
12/15/2011 650
12/16/2011 620
12/17/2011 645
12/18/2011 650
12/19/2011 639
12/20/2011 620
12/21/2011 600
12/22/2011 550
12/23/2011 600
12/24/2011 610
12/25/2011 590
12/26/2011 750
12/27/2011 750
12/28/2011 666
12/29/2011 678
12/30/2011 800
12/31/2011 750
私はこれを助けてくれて本当に感謝しています。時系列データを使用しており、履歴データに基づいて予測を作成できる必要があります。
最初にxts
に変換しようとしました:
x.xts <- xts(x$Used, x$Date)
次に、x.xts
を通常の時系列に変換しました。
x.ts <- as.ts(x.xts)
ets
に値を入れます:
x.ets <- ets(x.ts)
10期間の予測を実行しました:
x.fore <- forecast(x.ets, h=10)
x.fore
は次のとおりです。
Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
87 932.9199 831.7766 1034.063 778.2346 1087.605
88 932.9199 818.1745 1047.665 757.4319 1108.408
89 932.9199 805.9985 1059.841 738.8103 1127.029
90 932.9199 794.8706 1070.969 721.7918 1144.048
91 932.9199 784.5550 1081.285 706.0153 1159.824
92 932.9199 774.8922 1090.948 691.2375 1174.602
93 932.9199 765.7692 1100.071 677.2849 1188.555
94 932.9199 757.1017 1108.738 664.0292 1201.811
95 932.9199 748.8254 1117.014 651.3717 1214.468
96 932.9199 740.8897 1124.950 639.2351 1226.605
x.fore
をプロットしようとすると、グラフが表示されますが、x軸には日付ではなく数字が表示されています。
私がしている手順は正しいですか?ショーの日付を読み取るためにx軸を変更するにはどうすればよいですか?
ご意見ありがとうございました。
私がやったことは次のとおりです。
_x$Date = as.Date(x$Date,format="%m/%d/%Y")
x = xts(x=x$Used, order.by=x$Date)
# To get the start date (305)
# > as.POSIXlt(x = "2011-11-01", Origin="2011-11-01")$yday
## [1] 304
# Add one since that starts at "0"
x.ts = ts(x, freq=365, start=c(2011, 305))
plot(forecast(ets(x.ts), 10))
_
その結果:
これから何を学ぶことができます:
2011.85
_は、「日番号_365*.85
_」(年間310日)を意味します。as.POSIXlt(x = "2011-11-01", Origin="2011-11-01")$yday
を使用して1年の日を特定でき、as.Date(310, Origin="2011-01-01")
のようなものを使用して日番号から日付を特定できます。最初にデータをxtsに変換する理由がないため、さらに中間ステップを削除できます。
_x = ts(x$Used, start=c(2011, as.POSIXlt("2011-11-01")$yday+1), frequency=365)
# NOTE: We have only selected the "Used" variable
# since ts will take care of dates
plot(forecast(ets(x), 10))
_
これにより、上の画像とまったく同じ結果が得られます。
@joranが提供するソリューションに基づいて、次を試すことができます。
_# 'start' calculation = `as.Date("2011-11-01")-as.Date("2011-01-01")+1`
# No need to convert anything to dates at this point using xts
x = ts(x$Used, start=c(2011, 305), frequency=365)
# Directly plot your forecast without your axes
plot(forecast(ets(x), 10), axes = FALSE)
# Generate labels for your x-axis
a = seq(as.Date("2011-11-01"), by="weeks", length=11)
# Plot your axes.
# `at` is an approximation--there's probably a better way to do this,
# but the logic is approximately 365.25 days in a year, and an Origin
# date in R of `January 1, 1970`
axis(1, at = as.numeric(a)/365.25+1970, labels = a, cex.axis=0.6)
axis(2, cex.axis=0.6)
_
どちらが得られますか:
元のコードの問題の一部は、データをxts
オブジェクトに変換し、それをts
オブジェクトに変換した後、forecast
ポイントの日付が失われることです。
_x.fore
_出力の最初の列(Point
)を次と比較します。
_> forecast(ets(x), 10)
Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
2012.000 741.6437 681.7991 801.4884 650.1192 833.1682
2012.003 741.6437 676.1250 807.1624 641.4415 841.8459
2012.005 741.6437 670.9047 812.3828 633.4577 849.8298
2012.008 741.6437 666.0439 817.2435 626.0238 857.2637
2012.011 741.6437 661.4774 821.8101 619.0398 864.2476
2012.014 741.6437 657.1573 826.1302 612.4328 870.8547
2012.016 741.6437 653.0476 830.2399 606.1476 877.1399
2012.019 741.6437 649.1202 834.1672 600.1413 883.1462
2012.022 741.6437 645.3530 837.9345 594.3797 888.9078
2012.025 741.6437 641.7276 841.5599 588.8352 894.4523
_
これが元のアプローチの問題を理解し、Rで時系列を処理する能力を向上させることを願っています。
最終的で、より正確な解決策-実際に今やるべき他の作業を避けているため... =
日付処理を改善するには、lubridate
パッケージを使用します。
_require(lubridate)
y = ts(x$Used, start=c(2011, yday("2011-11-01")), frequency=365)
plot(forecast(ets(y), 10), xaxt="n")
a = seq(as.Date("2011-11-01"), by="weeks", length=11)
axis(1, at = decimal_date(a), labels = format(a, "%Y %b %d"), cex.axis=0.6)
abline(v = decimal_date(a), col='grey', lwd=0.5)
_
その結果:
ts
オブジェクトの開始日を識別する代替方法に注意してください。
特定のモデルよりも好みがない場合は、さまざまな状況に適用されるモデルを使用することをお勧めします。
library(forecast)
t.ser <- ts(used, start=c(2011,1), freq=12)
t.ets <- ets(t.ser)
t.fc <- forecast(t.ets,h=10)
これにより、今後10か月間の予測が得られます。
より技術的であるため、一般的な状況に適した指数平滑法を使用します。データの種類によっては、用途に適したより良いモデルがあるかもしれませんが、ets
が一般的な選択肢です。
2つの期間が完了していないため(24か月未満)、モデルはサゾナリティを検出できないため、これは計算に含まれないことを強調することが重要です。
プロットを変更して日付を表示するのは非常に簡単です。元のプロットの軸を単純に非表示にしてから自分で描画するだけです。
plot(x.fore,axes = FALSE)
axis(2)
axis(1,at = pretty(1:72,n = 6),
labels = (x$Date[1]-1) + pretty(1:72,n = 6),
cex.axis = 0.65)