26

私はいくつかの調査を行いましたが、解決策を見つけることに行き詰まっています。私は時系列データ、非常に基本的なデータフレームを持っています。それを呼びましょう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

これについて何か助けていただければ幸いです。時系列データを扱っており、履歴データに基づいて予測を作成できる必要があります。

  1. 最初に私はそれをに変換しようとしましたxts

    x.xts <- xts(x$Used, x$Date)
    
  2. 次に、x.xts定期的な時系列に変換しました。

    x.ts <- as.ts(x.xts)
    
  3. に値を入れますets:

    x.ets <- ets(x.ts)
    
  4. 10 期間の予測を実行:

    x.fore <- forecast(x.ets, h=10)
    
  5. 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
    
  6. をプロットしようとするとx.fore、グラフが表示されますが、x 軸には日付ではなく数値が表示されます。

ここに画像の説明を入力

私がやっている手順は正しいですか?ショーの日付を読み取るように x 軸を変更するにはどうすればよいですか?

ご意見をお寄せいただきありがとうございます。

4

3 に答える 3

45

これが私がしたことです:

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))

その結果:

出力例

これから何を学ぶことができますか:

  • 多くの手順を組み合わせて、作成する中間オブジェクトの数を減らすことができます
  • 出力はまだ @joran ほどきれいではありませんが、それでも読みやすいです。「日番号」(年の310日)2011.85を意味します。365*.85
  • を使用して年内の日を計算し、as.POSIXlt(x = "2011-11-01", origin="2011-11-01")$yday日番号から日付を計算するには、次のようなものを使用して実行できます。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))

これにより、上の画像とまったく同じ結果が得られます。

更新 2

@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)

どちらが得られますか:

2 回目の試行

元のコードの問題の一部は、データをxtsオブジェクトに変換し、それをオブジェクトに変換した後、ポイントtsの日付が失われることです。forecast

出力の最初の列 ( Point) を次の列と比較します。x.fore

> 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 で時系列を処理する能力を向上させるのに役立つことを願っています。

アップデート 3

最終的でより正確な解決策 - 私は実際に今しなければならない他の仕事を避けているからです...

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オブジェクトの開始日を識別する別の方法に注意してください。

于 2012-04-27T08:20:36.040 に答える
9

特定のモデルに好みがない場合は、幅広い状況に当てはまるモデルを使用することをお勧めします。

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 か月未満) がないため、モデルはサゾナリティを検出できないため、これは計算に含まれないことを強調することが重要です。

于 2012-04-24T16:55:27.710 に答える
8

日付を表示するようにプロットを変更するのは、元のプロットの軸を抑制してから自分で描画するだけで、かなり簡単です。

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)

ここに画像の説明を入力してください

于 2012-04-27T04:55:23.360 に答える