2016-11-28 100 views
0

我有一個模型,可以預測某些事件的持續時間,以及這些事件的持續時間的度量。然後我想計算預測和測量之間的差異,平均差異和RMSE。我能夠做到這一點,但格式是非常尷尬的,而不是我所期待的:計算和格式化時間間隔的平均值和平方

database <- data.frame(Predicted = c(strptime(c("4:00", "3:35", "3:38"), format = "%H:%M")), 
         Measured = c(strptime(c("3:39", "3:40", "3:53"), format = "%H:%M"))) 
database 
>    Predicted   Measured 
1 2016-11-28 04:00:00 2016-11-28 03:39:00 
2 2016-11-28 03:35:00 2016-11-28 03:40:00 
3 2016-11-28 03:38:00 2016-11-28 03:53:00 

這是第一個怪事:爲什麼R表示關於我的時間日期,即使我清楚指定了一個僅限於時間的格式(%H:%M),並且我的數據中沒有日期開始?它變得怪異:

database$Error <- with(database, Predicted-Measured) 
database$Mean_Error <- with(database, mean(Predicted-Measured)) 
database$RMSE <- with(database, sqrt(mean(as.numeric(Predicted-Measured)^2))) 
> database 
      Predicted   Measured Error Mean_Error  RMSE 
1 2016-11-28 04:00:00 2016-11-28 03:39:00 21 mins 0.3333333 15.17674 
2 2016-11-28 03:35:00 2016-11-28 03:40:00 -5 mins 0.3333333 15.17674 
3 2016-11-28 03:38:00 2016-11-28 03:53:00 -15 mins 0.3333333 15.17674 

爲什麼可變Error分鐘表示?對於Error這不是一個不錯的選擇,但是對於Mean_Error來說很難閱讀。對於RMSE它更糟糕,但這可能是由於as.numeric函數:如果我刪除它,R抱怨'^' not defined for "difftime" objects。我的問題是:

  1. 是否可以顯示在%H:%M格式顯示第一列2(PredictedMeasured)?
  2. 其他3列(Error,Mean_ErrorRMSE)我想比較一下%M:%S格式和一個格式,只需幾秒鐘,然後在這兩個列表中進行選擇。可能嗎?

編輯:只是爲了更清楚,我的目標是要插入的時間間隔的觀察到一個數據幀,並計算時間間隔不同的向量。然後,計算該向量的一些統計數據:均值,均方根誤差等。我知道我可以在幾秒鐘內輸入時間觀測值,但這看起來不太好:很難說13200秒是3小時40分鐘。因此,我希望能夠將時間間隔存儲在%H:%M中,但能夠以代數方式操作它們並以我選擇的格式顯示結果。那可能嗎?

+1

對於第一個怪事,'strptime'轉換成'POSIXlt',它會增加今天的日期它。要僅顯示小時和分鐘使用:'format(strptime(c(「4:00」,「3:35」,「3:38」),format =「%H:%M」),format =「% H:%M「)'這只是字符(即,你失去了日期 - 時間類) – aichao

+0

@aichao,我試過'數據庫$預測< - 格式(strptime(數據庫$預測,格式=」%H:%M 「),format =」%H:%M「)',但我得到了'>數據庫$預測 [1] NA NA NA'。我猜這裏真正的問題是我不需要日期時間對象,但更多的東西像時間間隔對象......是否有可能獲得? 「 – DeltaIV

回答

1

我們可以用difftime來指定時間差的單位。 difftime的輸出是類別difftime的對象。當這個difftime對象被強制使用as.numeric爲數字,我們可以改變這些單位(見?difftime的例子):

## Note we don't convert to date-time because we just want %H:%M 
database <- data.frame(Predicted = c("4:00", "3:35", "3:38"), 
         Measured = c("3:39", "3:40", "3:53")) 
## We now convert to date-time and use difftime to compute difference in minutes 
database$Error <- with(database, difftime(strptime(Predicted,format="%H:%M"),strptime(Measured,format="%H:%M"), units="mins")) 
## Use as.numeric to change units to seconds 
database$Mean_Error <- with(database, mean(as.numeric(Error,units="secs"))) 
database$RMSE <- with(database, sqrt(mean(as.numeric(Error,units="secs")^2))) 
## Predicted Measured Error Mean_Error  RMSE 
##1  4:00  3:39 21 mins   20 910.6042 
##2  3:35  3:40 -5 mins   20 910.6042 
##3  3:38  3:53 -15 mins   20 910.6042