2016-12-16 10 views
0

У меня есть кадр данных данных датчикаR; Анализ временных рядов данных датчиков

У меня есть кадр данных следующим образом:

pressure datetime 
4.848374 2016-04-12 10:04:00 
4.683901 2016-04-12 10:04:32 
5.237860 2016-04-12 10:13:20 

Теперь я хотел бы применить ARIMA сделать прогнозный анализ.

Поскольку данные выборка не равномерно, я агрегированный его на почасовой основе, которая выглядит следующим образом:

datetime     pressure 
"2016-04-19 00:00:00 BST" 5.581806 
"2016-04-19 01:00:00 BST" 4.769832 
"2016-04-19 02:00:00 BST" 4.769832 
"2016-04-19 03:00:00 BST" 4.553711 
"2016-04-19 04:00:00 BST" 6.285599 
"2016-04-19 05:00:00 BST" 5.873414 

Давление на каждый час выглядит, как показано ниже:

enter image description here

Но Я не могу создать объект ts, так как я не уверен, какая частота должна быть для часовых данных.

+0

Я нашел это сообщение по временным рядам весьма полезным для этого. http://stats.stackexchange.com/questions/120806/frequency-value-for-seconds-minutes-intervals-data-in-r – theArun

+0

Спасибо. Я наткнулся на ссылку, но это не решило, скорее смутило меня больше. –

+0

Поскольку ваши данные агрегируются почасово, частота = 24 в день. Зависит, если у вас есть данные за неделю или месяц. – theArun

ответ

2

Ваш вопрос уже есть ответ в комментариях, но только повторить, вы должны установить частоту до 24, как вы хотите, чтобы прогнозировать часовые данные:

sensor = ts(hourlyPressure, frequency = 24) 

К следующей точке с пожеланиями для фиксации дат в вашем участке, позволяет начать с некоторых данных: например

###Sequence of numbers to forecast  
hourlyPressure<-c(1:24, 12:36, 24:48, 36:60) 
###Sequence of Accompanying Dates 
dates<-seq(as.POSIXct("2016-04-19 00:00:00"), as.POSIXct("2016-04-23 02:00:00"), by="hour") 

Теперь мы можем установить данные hourlyPressure быть ТС() объекта (давайте игнорировать даты за минуту)

sensor <- ts(hourlyPressure, frequency=24) 

Теперь подходим к вашей модели аримы, в этом примере я буду использовать функцию auto.arima из пакета прогноза, так как поиск лучшей модели аримы здесь не в центре внимания (хотя использование auto.arima() довольно надежный способ найти лучшие модели ARIMA в соответствии с вашими данными):

###fit arima model to sensor data 
sensor_arima_fit<- auto.arima(sensor) 

Вы можете построить эти данные с соответствующими датами, просто указав й значение на графике функции()

plot(y=sensor_arima_fit$x, x=dates) 

Намного сложнее, когда мы прогнозируем наши данные и хотите распечатать исходные данные, с прогнозами и правильными датами.

###now forecast ahead (lets say 2 days) using the arima model that was fit above 
forecast_sensor <- forecast(sensor_arima_fit, h = 48) 

Теперь для построения исходных данных, прогнозы с правильными датами, мы можем сделать следующее:

###set h to be the same as above 
h <- c(48) 
###calculate the dates for the forecasted values 
forecasted_dates<-seq(dates[length(dates)]+(60*60)*(1), 
        dates[length(dates)]+(60*60)*(h), by="hour") 

###now plot the data 
plot(y=c(forecast_sensor$x, forecast_sensor$mean), 
    x=seq(as.POSIXct("2016-04-19 00:00:00"),as.POSIXct(forecasted_dates[length(forecasted_dates)]), by="hour"), 
    xaxt="n", 
    type="l", 
    main="Plot of Original Series and Forecasts", 
    xlab="Date", 
    ylab="Pressure") 

###correctly formatted x axis 
axis.POSIXct(1, at=seq(as.POSIXct("2016-04-19 00:00:00"), 
         as.POSIXct(forecasted_dates[length(forecasted_dates)]), 
         by="hour"), 
      format="%b %d", 
      tick = FALSE) 

Строит исходные данные с прогнозами и даты являются правильными. Однако, как и в случае с пакетом прогнозов, возможно, мы хотим, чтобы прогнозы были синими.

###keep same plot as before 
plot(y=c(forecast_sensor$x, forecast_sensor$mean), 
    x=seq(as.POSIXct("2016-04-19 00:00:00"),as.POSIXct(forecasted_dates[length(forecasted_dates)]), by="hour"), 
    xaxt="n", 
    type="l", 
    main="Plot of Original Series and Forecasts", 
    xlab="Date", 
    ylab="Pressure") 

axis.POSIXct(1, at=seq(as.POSIXct("2016-04-19 00:00:00"), 
         as.POSIXct(forecasted_dates[length(forecasted_dates)]), 
         by="hour"), 
      format="%b %d", 
      tick = FALSE) 

###This time however, lets add a different color line for the forecasts 
lines(y=forecast_sensor$mean, x= forecasted_dates, col="blue")