2016-12-20 3 views
1

나는 시계열의 학습 데이터 값이 100이고 auto.arima를 사용하여 모델 순서와 계수를 찾는다 .한 번에 한 단계 앞당겨 예측에서 한 번에 하나의 값만 수신 R

센서에서 스트리밍 값을 한 번에 하나씩 수신합니다. 하나의 값을 받으면 auto.arima에서 얻은 모델 객체로부터 다음 값 (one-step ahead/single value only)을 예측/예측해야합니다. 특정 사건에 따라 모델 계수를 업데이트하지만, 지금은 언급 할 필요가 없습니다. 센서가 작동 할 때까지 미리 진행되는 예측이 수행됩니다. https://drive.google.com/open?id=0B3UpwQBKryLleXdtMkQyOXVDcW8

이 내 코드입니다 :

내 샘플 교육 및 테스트 데이터입니다. 그에 따라 설정되는 모델에는 특정 제약 조건이 있습니다. 샘플의 한 단계가 전방 예측 (적색 플롯)에서 수동으로 생성 된 데이터뿐만 아니라, (녹색 줄거리)에 끼워 (MDL)을 사용하기 위해

data<-read.csv('stackoverflow_data.csv',header=TRUE, sep=","); 
data1<-data[[1]]; # first 100 points of data - training data 
mdl<-auto.arima(data1,max.p=3, max.q=3,max.d=1, stepwise=FALSE, approximation = FALSE,allowdrift=TRUE, allowmean=TRUE); 
summary(mdl); 

Series: data1 
ARIMA(1,0,1) with non-zero mean 

Coefficients: 
     ar1  ma1 intercept 
     0.7456 0.2775 767.7463 
s.e. 0.0804 0.1197  0.1072 

sigma^2 estimated as 0.04944: log likelihood=9.34 
AIC=-10.69 AICc=-10.27 BIC=-0.27 

Training set error measures: 
         ME  RMSE  MAE   MPE  MAPE 
Training set -0.004354719 0.2189945 0.1706344 -0.0005753987 0.02222701 
        MASE  ACF1 
Training set 0.9063639 -0.01022176 

. 다음은 원본 훈련 데이터 (검은 색 플롯)와 결합 된 플롯입니다.

이 코드는 수동 한 걸음 예상 예측 코드입니다.

(1) (I 인해 평판 점수에 이미지를 게시 할 수 없기 때문에 나는 위의 이미지 링크를 공유) 플롯을 관찰함으로써, :

one step ahead forecast : in-sample data plot

res_1 = 0; 
res_2 = 0; 
constant_1 = mdl$coef [["intercept"]] * (1 - mdl$coef [["ar1"]]); 
fc = 0; 
for (i in 1:length(data1)){ 
    fc[i] <-constant_1 +(mdl$coef [["ar1"]]*(data1[i])) + (mdl$coef [["ma1"]]*(res_1)); # one-step ahead forecast for in-sample data 
res_2[i] = data1[i] - fc[i]; 
res_1 = data1[i] - fc[i]; 
} 
내 질문 있습니다 적합 (mdl) 예측이 한 시간 단위로 해제 된 것으로 보입니다
. 어떻게 수정 될 수 있습니까?

(2) 공유 링크의 테스트 데이터는 한 단계 앞당치 예보가 수행 될 미래 데이터입니다. 이 데이터는 한 번에 하나의 값으로 순차적으로옵니다. 시간 알고리즘이 값을 계속 가져올 때까지 그 시점에받은 단일 값에서 단일 다음 값을 예측할 수있는 방법은 무엇입니까?

+0

한발 앞서 수행이 적절한 방법이다 예측 DATA2 = 데이터 [2] ]; fit2 <- Arima (c (data1, data2 [1]), model = mdl) = (forecast (fit2, h = 1) $ fitted [101]) –

+0

또는 다음을 고려해야합니다. data2 = data [[2 ]]; fit2 <- Arima (c (data1, data2 [1]), model = mdl) a = (예측치 (fit2, h = 1) $ mean [1]) –

답변

2
  1. AR (1) 계수에 이전 관측치가 아닌 현재 관측치를 곱합니다.

  2. 테스트 데이터에 ARIMA 모델을 다시 맞 춥니 다.

용이 R 이루어 :

library(forecast) 

data <- read.csv('stackoverflow_data.csv', header=TRUE, sep=",") 
data1 <- ts(data[[1]][1:100]) # first 100 points of data - training data 
mdl <- auto.arima(data1, max.p=3, max.q=3, max.d=1, 
     stepwise=FALSE, approximation=FALSE, allowdrift=TRUE, allowmean=TRUE) 

# One-step forecasts on training data 
plot(data1) 
lines(fitted(mdl), col='red') 

enter image description here

# One-step forecasts on test data 
data2 <- ts(data[[2]], start=length(data1)+1) 
data12 <- ts(c(data1,data2)) 
mdl2 <- Arima(data12, model=mdl) 
plot(data2) 
lines(window(fitted(mdl2), start=101), col='red') 

enter image description here

+0

신속한 답장을 보내 주셔서 감사합니다! 실제 시나리오에서, 나는 배열의 형태로 테스트 데이터를 가지지 않을 것이고, 나는 그것을 위해 한 번에 (이전의 관찰로 생각한) 단일 값을 가질 것이다.내 목표는 그 단일 값에서 다음 값을 예측/예측하고 실제 다음 값이 나타날 때 잔차를 찾는 것입니다. 나는 그것을 위해 for-loop를 시도했지만 결과는 기대와 다르다. –

+0

출력은이 코드에 의해 생성 된 것과 같을 것으로 예상됩니다. https://drive.google.com/open?id=0B3UpwQBKryLlQ2FrQU9yNlF4cVE 그러나 마지막 값은 예측하지 않습니다. –