R에서 특이 치를 탐지하여 예측하는 방법은 무엇입니까? -시계열 분석 절차 및 방법


16

월별 시계열 데이터가 있으며 특이 치를 감지하여 예측하고 싶습니다.

이것은 내 데이터 세트의 샘플입니다.

       Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
2006  7.55  7.63  7.62  7.50  7.47  7.53  7.55  7.47  7.65  7.72  7.78  7.81
2007  7.71  7.67  7.85  7.82  7.91  7.91  8.00  7.82  7.90  7.93  7.99  7.93
2008  8.46  8.48  9.03  9.43 11.58 12.19 12.23 11.98 12.26 12.31 12.13 11.99
2009 11.51 11.75 11.87 11.91 11.87 11.69 11.66 11.23 11.37 11.71 11.88 11.93
2010 11.99 11.84 12.33 12.55 12.58 12.67 12.57 12.35 12.30 12.67 12.71 12.63
2011 12.60 12.41 12.68 12.48 12.50 12.30 12.39 12.16 12.38 12.36 12.52 12.63

내가 언급 한 시계열 분석 절차 및 R을 사용하는 방법 , 그러나 정확한 것 같다하지 않습니다, 예측의 다른 모델의 일련의 작업을 수행하려면. 또한 tsoutliers를 포함시키는 방법을 잘 모르겠습니다.

나는 이상 내 tsoutliers의 문의 및 아리마 모델링 및 절차에 관한 또 다른 포스트 가지고 여기 뿐만 아니라입니다.

이 코드는 현재 링크 번호 1과 비슷한 내 코드입니다.

암호:

product<-ts(product, start=c(1993,1),frequency=12)

#Modelling product Retail Price

#Training set
product.mod<-window(product,end=c(2012,12))
#Test set
product.test<-window(product,start=c(2013,1))
#Range of time of test set
period<-(end(product.test)[1]-start(product.test)[1])*12 + #No of month * no. of yr
(end(product.test)[2]-start(product.test)[2]+1) #No of months
#Model using different method
#arima, expo smooth, theta, random walk, structural time series
models<-list(
#arima
product.arima<-forecast(auto.arima(product.mod),h=period),
#exp smoothing
product.ets<-forecast(ets(product.mod),h=period),
#theta
product.tht<-thetaf(product.mod,h=period),
#random walk
product.rwf<-rwf(product.mod,h=period),
#Structts
product.struc<-forecast(StructTS(product.mod),h=period)
)

##Compare the training set forecast with test set
par(mfrow=c(2, 3))
for (f in models){
    plot(f)
    lines(product.test,col='red')
}

##To see its accuracy on its Test set, 
#as training set would be "accurate" in the first place
acc.test<-lapply(models, function(f){
    accuracy(f, product.test)[2,]
})
acc.test <- Reduce(rbind, acc.test)
row.names(acc.test)<-c("arima","expsmooth","theta","randomwalk","struc")
acc.test <- acc.test[order(acc.test[,'MASE']),]

##Look at training set to see if there are overfitting of the forecasting
##on training set
acc.train<-lapply(models, function(f){
    accuracy(f, product.test)[1,]
})
acc.train <- Reduce(rbind, acc.train)
row.names(acc.train)<-c("arima","expsmooth","theta","randomwalk","struc")
acc.train <- acc.train[order(acc.train[,'MASE']),]

 ##Note that we look at MAE, MAPE or MASE value. The lower the better the fit.

이것은 빨간색 "테스트 세트"와 파란색 "예측 된"세트의 비교를 통해 매우 신뢰할 수 없거나 정확하지 않은 내 다른 예측의 플롯입니다. 다른 예측의 줄거리 다른 예측

각 테스트 및 교육 세트 모델의 정확도

Test set
                    ME      RMSE       MAE        MPE     MAPE      MASE      ACF1 Theil's U
theta      -0.07408833 0.2277015 0.1881167 -0.6037191 1.460549 0.2944165 0.1956893 0.8322151
expsmooth  -0.12237967 0.2681452 0.2268248 -0.9823104 1.765287 0.3549976 0.3432275 0.9847223
randomwalk  0.11965517 0.2916008 0.2362069  0.8823040 1.807434 0.3696813 0.4529428 1.0626775
arima      -0.32556886 0.3943527 0.3255689 -2.5326397 2.532640 0.5095394 0.2076844 1.4452932
struc      -0.39735804 0.4573140 0.3973580 -3.0794740 3.079474 0.6218948 0.3841505 1.6767075

Training set
                     ME      RMSE       MAE         MPE     MAPE      MASE    ACF1 Theil's U
theta      2.934494e-02 0.2101747 0.1046614  0.30793753 1.143115 0.1638029  0.2191889194        NA
randomwalk 2.953975e-02 0.2106058 0.1050209  0.31049479 1.146559 0.1643655  0.2190857676        NA
expsmooth  1.277048e-02 0.2037005 0.1078265  0.14375355 1.176651 0.1687565 -0.0007393747        NA
arima      4.001011e-05 0.2006623 0.1079862 -0.03405395 1.192417 0.1690063 -0.0091275716        NA
struc      5.011615e-03 1.0068396 0.5520857  0.18206018 5.989414 0.8640550  0.1499843508        NA

모형 정확도에서 가장 정확한 모형이 세타 모형임을 알 수 있습니다. 예측이 왜 정확하지 않은지 잘 모르겠으며 그 이유 중 하나는 데이터 세트의 "이상 값"을 처리하지 않아 모든 모델에 대한 예측이 잘못되었다고 생각합니다.

이것은 내 특이점입니다

특이 치 플롯 특이 치

tsoutliers 출력

ARIMA(0,1,0)(0,0,1)[12]                    

Coefficients:
        sma1    LS46    LS51    LS61    TC133   LS181   AO183   AO184   LS185   TC186    TC193    TC200
      0.1700  0.4316  0.6166  0.5793  -0.5127  0.5422  0.5138  0.9264  3.0762  0.5688  -0.4775  -0.4386
s.e.  0.0768  0.1109  0.1105  0.1106   0.1021  0.1120  0.1119  0.1567  0.1918  0.1037   0.1033   0.1040
       LS207    AO237    TC248    AO260    AO266
      0.4228  -0.3815  -0.4082  -0.4830  -0.5183
s.e.  0.1129   0.0782   0.1030   0.0801   0.0805

sigma^2 estimated as 0.01258:  log likelihood=205.91
AIC=-375.83   AICc=-373.08   BIC=-311.19

 Outliers:
    type ind    time coefhat  tstat
1    LS  46 1996:10  0.4316  3.891
2    LS  51 1997:03  0.6166  5.579
3    LS  61 1998:01  0.5793  5.236
4    TC 133 2004:01 -0.5127 -5.019
5    LS 181 2008:01  0.5422  4.841 
6    AO 183 2008:03  0.5138  4.592
7    AO 184 2008:04  0.9264  5.911
8    LS 185 2008:05  3.0762 16.038
9    TC 186 2008:06  0.5688  5.483
10   TC 193 2009:01 -0.4775 -4.624
11   TC 200 2009:08 -0.4386 -4.217
12   LS 207 2010:03  0.4228  3.746
13   AO 237 2012:09 -0.3815 -4.877
14   TC 248 2013:08 -0.4082 -3.965
15   AO 260 2014:08 -0.4830 -6.027
16   AO 266 2015:02 -0.5183 -6.442

관련 데이터 세트 및 이상 값 탐지 등을 통해 데이터를 "분석"/ 예측하는 방법을 알고 싶습니다. 이상 값을 처리하고 예측을 수행 할 수 있도록 도와주십시오.

마지막으로, @forecaster가 링크 1 번에서 언급 한 것처럼 다른 모델을 결합하는 방법을 알고 싶습니다. 다른 모델을 결합하면 더 나은 예측 / 예측이 이루어질 것입니다.

편집

다른 모델에 특이 치를 통합하고 싶습니다.

예를 들어 몇 가지 코드를 시도했습니다.

forecast.ets( res$fit ,h=period,xreg=newxreg)
Error in if (object$components[1] == "A" & is.element(object$components[2], : argument is of length zero

forecast.StructTS(res$fit,h=period,xreg=newxreg)
Error in predict.Arima(object, n.ahead = h) : 'xreg' and 'newxreg' have different numbers of columns

일부 오류가 발생했으며 특이 치를 회귀 변수로 통합하는 올바른 코드가 확실하지 않습니다. 또한 predict.theta 또는 forecast.rwf가 없기 때문에 thetaf 또는 rwf로 어떻게 작업합니까?


1
지속적인 재 편집이 작동하지 않는 것처럼 도움을받는 또 다른 방법을 사용해야 할 것입니다.
IrishStat

@irishstat에 동의합니다. 아래 두 답변 모두 귀하의 질문에 대한 직접적인 답변을 제공하며 거의 관심을받지 않은 것 같습니다.
예측 자

ETS 및 thetaf에는 오류를 발생시키는 특정 기능에 대한 문서를 읽으십시오. 회귀자를 처리하는 기능이 없습니다.
예측 자

답변:


7

이 답변은 다른 질문 의 6 번과 7 번과 관련이 있습니다 .

특이 치는 모형에 의해 설명되지 않은 관측치로 이해되므로 예측에서의 역할은 새로운 특이 치의 존재가 예측되지 않는다는 의미에서 제한됩니다. 이 특이 치를 예측 방정식에 포함시키기 만하면됩니다.

가산 성 이상치 (단일 관측치에 영향을 미침)의 경우,이 특이 치가 포함 된 변수는 표본에서 관측치에 대해 특이 치가 탐지 되었기 때문에 단순히 0으로 채워집니다. 레벨 이동 (데이터의 영구적 인 변경)의 경우 예측에서 이동을 유지하기 위해 변수가 변수로 채워집니다.


다음으로, 'tsoutliers'에 의해 특이 치가 탐지 된 ARIMA 모델에 대해 R로 예측을 얻는 방법을 보여줍니다. 열쇠는에 newxreg전달 되는 인수 를 올바르게 정의하는 것 predict입니다.

(이것은 예측시 특이 치를 처리하는 방법에 대한 귀하의 질문에 대한 답변을 보여주기위한 것이므로 결과 모델 또는 예측이 최상의 솔루션인지 여부는 다루지 않습니다.)

require(tsoutliers)
x <- c(
  7.55,  7.63,  7.62,  7.50,  7.47,  7.53,  7.55,  7.47,  7.65,  7.72,  7.78,  7.81,
  7.71,  7.67,  7.85,  7.82,  7.91,  7.91,  8.00,  7.82,  7.90,  7.93,  7.99,  7.93,
  8.46,  8.48,  9.03,  9.43, 11.58, 12.19, 12.23, 11.98, 12.26, 12.31, 12.13, 11.99,
 11.51, 11.75, 11.87, 11.91, 11.87, 11.69, 11.66, 11.23, 11.37, 11.71, 11.88, 11.93,
 11.99, 11.84, 12.33, 12.55, 12.58, 12.67, 12.57, 12.35, 12.30, 12.67, 12.71, 12.63,
 12.60, 12.41, 12.68, 12.48, 12.50, 12.30, 12.39, 12.16, 12.38, 12.36, 12.52, 12.63)
x <- ts(x, frequency=12, start=c(2006,1))
res <- tso(x, types=c("AO","LS","TC"))

# define the variables containing the outliers for
# the observations outside the sample
npred <- 12 # number of periods ahead to forecast 
newxreg <- outliers.effects(res$outliers, length(x) + npred)
newxreg <- ts(newxreg[-seq_along(x),], start = c(2012, 1))

# obtain the forecasts
p <- predict(res$fit, n.ahead=npred, newxreg=newxreg)

# display forecasts
plot(cbind(x, p$pred), plot.type = "single", ylab = "", type = "n", ylim=c(7,13))
lines(x)
lines(p$pred, type = "l", col = "blue")
lines(p$pred + 1.96 * p$se, type = "l", col = "red", lty = 2)  
lines(p$pred - 1.96 * p$se, type = "l", col = "red", lty = 2)  
legend("topleft", legend = c("observed data", 
  "forecasts", "95% confidence bands"), lty = c(1,1,2,2), 
  col = c("black", "blue", "red", "red"), bty = "n")

예측

편집하다

predict위에서 사용한 함수 는 선택한 ARIMA 모델 ARIMA (2,0,0)에 저장된 예측값 res$fit과 탐지 된 특이 치를 기반으로 예측을 반환합니다 res$outliers. 다음과 같은 모델 방정식이 있습니다.

와이=제이=1미디엄ω제이제이()나는(제이)+θ()ϕ()α()ϵ,ϵ나는(0,σ2),

제이제이tsoutliers나는


그래서 당신은 "newxreg"인수에 특이 치를 추가하는 것이 었습니다. 이것을 회귀 자라고합니까? 회귀 분석기 사용을 알 수 있습니까? 또한 "예측"기능에서 회귀를 사용하여 여전히 ARIMA를 사용합니까? 아니면 다른 예측 방법입니까? tsoutliers 사용에 도움을 주셔서 감사합니다. = D
Ted

다른 모델에서도 예측에 사용할 특이 값을 회귀 분석기로 통합 할 수 있습니까? 기본 구조 모델, 세타, 랜덤 워크 등?
Ted

@Ted 예, 예측은 ARMA 모델을 기반으로합니다. 이에 대한 세부 정보로 답변을 편집했습니다.
javlacalle

임의 이동, 구조적 시계열 모델과 같은 다른 모델에서도 레벨 이동, 덧셈 이상치 등의 효과가 포함 된 회귀 변수를 통합 할 수 있습니다. 소프트웨어를 사용하는 방법을 묻는 경우 아마도 다른 게시물에서 질문하고 질문이 stackoverflow 와 같은 다른 사이트에 더 적합한 지 고려해야합니다 .
javlacalle

오 그래. 또 다른 질문은 예측예측을 사용 하는 것의 차이점이 있는지 아는 것 입니까? 있다면, 차이점은 무엇입니까
Ted

2

72 개의 관측치에 대한 합리적인 모형을 개발하는 데 도움이되는 소프트웨어를 사용하면 오차 분산이 예상 값과 연결될 수 있으므로 전력 변환 (로그)이 포함됩니다. 이것은 눈이 높은 수준에서 증가 된 분산을 감지 할 수있는 원래 플롯에서 상당히 분명합니다. 여기에 이미지 설명을 입력하십시오actual.fit/forecast 여기에 이미지 설명을 입력하십시오및 최종 여기에 이미지 설명을 입력하십시오잔차 그림이 포함 됩니다. 전력 변환을 고려한보다 현실적인 신뢰 한계에 유의하십시오. 이 응답은 R을 사용하지 않지만 R을 사용하는 합리적인 모델이 포함 할 수있는 것에 대한 기준을 높입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.