2017-03-21 16 views
2

私は2つのデータ系列(較正とサンプル)を持ち、較正データを月ごとからサンプルの周波数に補間しようとしていますが、微妙に2番目にランダムに変化します。時系列補間

私は(Interpolating timeseries)これを試してみましたが、ここに私のコードです:

 require(zoo) 
    ##calib <- read.csv("C://mw2cal.csv") 
    ##sample <- read.csv("C://mw2sam.csv") 

    #using "deput" to represent the data sets 

    sample <- structure(list(DateMW.2 = structure(1:15, .Label = c("6/2/2016 18:15:00", 
    "6/2/2016 18:30:00", "6/2/2016 18:45:00", "6/2/2016 19:00:00", 
    "6/2/2016 19:15:00", "6/2/2016 19:30:00", "6/2/2016 19:45:00", 
    "6/2/2016 20:00:00", "6/2/2016 20:15:00", "6/2/2016 20:30:00", 
    "6/2/2016 20:45:00", "6/2/2016 21:00:00", "6/2/2016 21:15:00", 
    "6/2/2016 21:30:00", "6/2/2016 21:45:00"), class = "factor"), 
    MW.2 = c(61.40373, 61.41549, 61.41549, 61.42451, 61.42752, 
    61.42478, 61.43107, 61.42369, 61.40564, 61.41056, 61.40592, 
    61.39416, 61.38432, 61.3753, 61.3753)), .Names = c("DateMW.2", 
    "MW.2"), row.names = c(NA, 15L), class = "data.frame") 


    calib <- structure(list(Date = structure(c(4L, 5L, 6L, 7L, 8L, 1L, 2L, 
    3L), .Label = c("10/31/2016 12:00:00", "11/30/2016 12:00:00", 
    "12/31/2016 12:00:00", "5/31/2016 12:00:00", "6/30/2016 12:00:00", 
    "7/31/2016 12:00:00", "8/31/2016 12:00:00", "9/30/2016 12:00:00" 
    ), class = "factor"), MW2 = c(60.844402, 58.859566, 57.495434, 
    56.328285, 56.842606, 57.76762, 59.583103, 59.958263)), .Names = c("Date",  
    "MW2"), class = "data.frame", row.names = c(NA, -8L)) 



    zc <- zoo(calib$MW2, calib$Date)  
    zs <- zoo(sample$MW.2, sample$DateMW.2) 

    z <- merge(zc, zs) 

    zc <- zoo(calib$MW2, calib$Date) 
    zs <- zoo(sample$MW.2, sample$DateMW.2) 

    # "merge" gets data frames only 
    zc <- data.frame(zc) 
    zs <- data.frame(zs) 

    z <- merge(zc, zs) 

    z$zc <- na.approx(z$zc, rule=2) 

    df <- z[index(zs),] 

サンプル・データは次のようになります。

 DateMW.2  MW.2 
    6/2/2016 18:15:00 61.40373 
    6/2/2016 18:30:00 61.41549 
    6/2/2016 18:45:00 61.41549 
    6/2/2016 19:00:00 61.42451 
    6/2/2016 19:15:00 61.42752 
    6/2/2016 19:30:00 61.42478 
    6/2/2016 19:45:00 61.43107 
    6/2/2016 20:00:00 61.42369 
    6/2/2016 20:15:00 61.40564 
    6/2/2016 20:30:00 61.41056 
    6/2/2016 20:45:00 61.40592 
    6/2/2016 21:00:00 61.39416 
    6/2/2016 21:15:00 61.38432 
    ... 

と校正:

 Date   MW2 
    5/31/2016 12:00:00 60.84440 
    6/30/2016 12:00:00 58.85957 
    7/31/2016 12:00:00 57.49543 
    8/31/2016 12:00:00 56.32829 
    9/30/2016 12:00:00 56.84261 
    10/31/2016 12:00:00 57.76762 
    11/30/2016 12:00:00 59.58310 
    12/31/2016 12:00:00 59.95826 

エラー間がありました解決されたデータセットをマージする。あなたがそれに興味があるなら、あなたはスクロールダウンすることができます。

ここで問題となるのは、補間の代わりに較正データセットを繰り返すことだけです。補間されたdfの部分を見て、それを上記の元のデータと比較することができます。

 > df 
     zc  zs    date  
    1  60.84440 61.40373 2016-06-02 18:15:00 
    2  58.85957 61.40373 2016-06-02 18:30:00 
    3  57.49543 61.40373 2016-06-02 18:45:00 
    4  56.32829 61.40373 2016-06-02 19:00:00 
    5  56.84261 61.40373 2016-06-02 19:15:00 
    6  57.76762 61.40373 2016-06-02 19:30:00 
    7  59.58310 61.40373 2016-06-02 19:45:00 
    8  59.95826 61.40373 2016-06-02 20:00:00 
    9  60.84440 61.41549 2016-06-02 20:15:00 
    10 58.85957 61.41549 2016-06-02 20:30:00 
    11 57.49543 61.41549 2016-06-02 20:45:00 
    12 56.32829 61.41549 2016-06-02 21:00:00 
    13 56.84261 61.41549 2016-06-02 21:15:00 
    14 57.76762 61.41549 2016-06-02 21:30:00 
    15 59.58310 61.41549 2016-06-02 21:45:00 
    16 59.95826 61.41549 2016-06-02 22:00:00 
    17 60.84440 61.41549 2016-06-02 22:15:00 
    18 58.85957 61.41549 2016-06-02 22:30:00 
    19 57.49543 61.41549 2016-06-02 22:45:00 
    20 56.32829 61.41549 2016-06-02 23:00:00 
    21 56.84261 61.41549 2016-06-02 23:15:00 
    22 57.76762 61.41549 2016-06-02 23:30:00 
    23 59.58310 61.41549 2016-06-02 23:45:00 
    24 59.95826 61.41549 2016-06-03 00:00:00 
    25 60.84440 61.42451 2016-06-03 00:15:00 
    ... 

WindowsとMacではRバージョン3.3.2を使用しています。




これは私が得たエラーと出力されます。私はマージ中に問題が起きていることを知りました。 zとzcをzにマージすると、zにはNAだけが表示されます。

 > head(z) 
     zc zs 
    1 NA NA 
    2 NA NA 
    3 NA NA 
    4 NA NA 
    5 NA NA 
    6 NA NA 
    > z$zc <- na.approx(z$zc, rule=2) 
    Error in NextMethod("[<-") : replacement has length zero 
    > df <- z[index(zs),] 
    > df 
      zc zs 
    1  NA NA 
    2  NA NA 
    3  NA NA 
    4  NA NA 
    5  NA NA 
    ... 

mergeを使用してのコメント:zoo

出力データフレームではなかったので、それをマージすることはできません。 data.frameを使用してzcとzsをdfに変換すると、この問題は解決されます。

+0

'head(z)'を実行して、あなたが信じているように、その中にzcとzsという列があることを確認します。また、なぜそれらの行を途中で繰り返すのですか?そして、おそらく別の変数を大きなZと呼んではいけません。それは私たちすべてを混乱させます。 – dash2

+0

@ dash2私はそれをもっとはっきりと述べた方がいいでしょう。しかし、問題はマージである。私は質問を編集します。 – Masoud

+0

ありがとう!このエラーは、「NA」のすべての値から派生しているようです。 – lukeA

答えて

0

あなたのデータセットがすでに日付時刻としてフォーマットされている場合は、zooを使用して苦労する必要はありません。ここでは、私は単にapprox関数を使用して、それは私が望むものを正確に与えました。質問からデータセットを取得して、コードを再現することができます。

 ipc <- approx(calib$Date,calib$MW2, xout = sample$`DateMW-2`, 
     rule = 1, method = "linear", ties = mean) 

データが指定されたデータポイント間で直線的に補間されていることがわかります。あなたの洞察に満ちたコメントの

enter image description here

感謝。