2016-10-07 2 views
1

for 루프에서 append를 사용하는 데 문제가 있습니다. 아래 for 루프의 목표는 ModelCast $ mean을 가져다가 3 개의 더 많은 예측 $ mean을 추가하는 것입니다. 그래서 결국 길이 (append_cast) = 40. 대신 나는 길이 (append_cast) = 20 얻고 있어요. 나는 문제가 append가 한 번만 실행되고 있다고 생각합니다.For Loop with Append issue

for 루프 외부의 이전 코드는 모델을 교육하고 예측합니다. for 루프의 나머지 코드는 해당 모델을 3 개의 새로운 데이터 청크에 맞추는 것입니다.

이것은 롭 Hyndman의 블로그 게시물에서 영감 : 특별히 http://robjhyndman.com/hyndsight/rolling-forecasts/

모든 팁 크게 감사합니다

다시 추정하지 않고 다단계 예측의 일부입니다.

코드 :

library("forecast") 
library("tseries") 
library("sqldf") 
library("manipulate") 
library("caret") 
library("qdapTools") 
library("RODBC") 
library("dplyr") 
library("yts") 


##Partitioning Time Series 
EndLearn1<-length(tsData-3*10) 
data_tsLearn1 <-tsData[1:EndLearn1] 

##Fit Model 
fit_Model <- auto.arima(data_tsLearn1) 

##Forecast Model 1st time 
ModelCast<-forecast(fit_Model, h=10) 

for(i in 1:3) 
{ 
    startLearn2<-1+i*10 
    EndLearn2<-EndLearn1+i*10 

    y <- tsData[startLearn2:EndLearn2] 
    fit_new <- Arima(y, model=fit_Model) 

    append_cast <- append(ModelCast$mean,forecast(fit_new, h=10)$mean, after=i*10) ## Only seems to append one forecast instead of 3 
} 


Update: The change to the code below works 
append_cast <- ts() 


for(i in 1:3) 
{ 
startLearn2<-1+i*10 
EndLearn2<-EndLearn1+i*10-1 

y <- tsData[startLearn2:EndLearn2] 
fit_new <- Arima(y, model=fit_Model) 

append_cast <- append(append_cast, forecast(fit_new, h=10)$mean, after=i*10) 
append_final<-ts(append(ModelCast$mean,append_cast[2:length(append_cast)])) ## First value in append_cast is na because ts() starts that way 
} 

Data: 
dput(tsData[1:300]) 
c(7.6, 0.6, 2.2, 1.8, NA, 6.6, 12.8, 0.2, 5.6, 2, NA, 0.4, NA, 
1.6, 0.8, 2, 0.4, NA, NA, 2, 4.8, NA, 0.2, NA, NA, NA, NA, 0.2, 
0.2, 0.2, 0.2, 0.2, NA, 0.4, 0.8, 0.6, 20, 27.4, 0.4, 29.2, 30.4, 
0.2, 42.2, NA, 0.8, 0.2, 2, 32.2, 2.4, 7, 2.2, 30.8, 26.6, 15.2, 
12, 10.2, 27, 15.8, 22.2, 20, 23.8, 1, 18.2, 6, 23, 16.2, 17, 
1.8, 17.8, 8.8, 0.2, 7.8, 2.6, 0.2, 17.8, 2.4, 15.4, 3.2, 8, 
12.4, 3.2, NA, 3.2, 2.2, 5.6, NA, 0.4, 2.6, 1.8, 2.4, NA, 2.2, 
NA, 1.6, NA, NA, NA, 1.4, 1.8, 0.2, NA, 1.8, NA, 1.4, 1.6, 5, 
0.2, NA, NA, 1.4, 0.4, NA, NA, NA, NA, NA, NA, NA, NA, NA, 2.8, 
3, 0.2, 11.4, 13.2, 15, 13.2, 5.8, 6.8, 24.6, 17, 21.6, 5, 11.4, 
23, 9.2, 7.2, 12, 31.6, 43, 1.2, 38.2, 38.4, 15.2, 43.6, 29.6, 
20, 3.8, 23, 3.2, 15.4, 14.6, 17.4, 27.6, 24, 27.8, 35.4, 2.4, 
12.4, 36, NA, 0.2, 15.6, 0.4, 20.8, 3.4, 22.8, 23.8, 25.6, 34, 
NA, 0.6, 5.6, 1.8, NA, NA, 28.6, NA, NA, 40.4, NA, 16.2, 13, 
4, NA, NA, 1.6, 1.2, 6, NA, 1.6, 1.2, NA, 1.8, NA, NA, 0.4, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0.4, NA, NA, 0.8, 3.4, 
3.2, 3.2, 3.8, 4.4, 2.8, 5.2, 11, 10.8, 0.2, 1.8, 2.4, 4.4, 2, 
1.2, 1.8, 4.6, 6, 5, 8.6, 10.6, 10.4, 10, 7.2, 7.6, 0.2, 17, 
3, 2.6, 1.4, 2.8, 0.2, NA, 7.4, 17.4, 7.4, 0.6, NA, 5.2, 1.6, 
NA, 7.2, 2.6, 7.2, 7.6, 15, 21.8, NA, 2, NA, 10.4, 4, 2.4, 4.8, 
1.4, NA, NA, 0.6, NA, 1.2, 0.2, NA, 1.4, 3, 0.4, 1, NA, 1.6, 
38.8, NA, NA, NA, 0.2, NA, NA, NA, NA, NA, NA, 0.2, 1.8, 2.8, 
4.2, 1.6, 7.4, 2, 6, 8) 

답변

1

append 기능은 그것에게 당신은뿐만 아니라 당신이 그것에 추가 할 것과 에를 추가 할 일을 전달할 것으로 기대하고있다. 당신은 후자를 지나가고 있습니다. 나는 (누군가에게 말하지 말고) 첨부 문서를 읽음으로써 이것을 밖으로 sussed.

다른 것들은 벡터 append_Cast을 초기화하여 첫 번째 루프에 추가 할 수 있도록해야합니다. 그리고 c() 랩퍼에 추가하려는 값을 래핑하여 벡터가되도록해야합니다. 다음과 같이 입력하십시오 :

append_cast <- {} 

    for(i in 1:3) 
    { 
    i<-1 
    startLearn2<-1+i*10 
    EndLearn2<-EndLearn1+i*10 

    y <- tsData[startLearn2:EndLearn2] 
    fit_new <- Arima(y, model=fit_Model) 

    append_cast <- append(append_cast, c(ModelCast$mean,forecast(fit_new, h=10)$mean, after=i*10)) ## Only seems to append one forecast instead of 3 
    } 
+1

감사합니다. 몇 가지 변경을해야했지만, 위의 코드에서 업데이트되었습니다. 귀하의 코드 버전에서는 길이가 60 인 append_cast를 사용합니다. 매번 ModelCast $ mean을 추가하기 때문입니다. 또한 append_cast를 벡터 대신 시계열로 초기화했습니다. – user3476463