auto.arima를 사용하여 결 측값을 대치하는 방법


12

누락 된 값이 많은 동물원 시리즈가 있습니다. auto.arima이 누락 된 값을 무시할 수 있다는 것을 읽었 습니까? 누구든지 어떻게 할 수 있습니까? 고마워요!

이것은 내가 시도했지만 성공하지 못했습니다.

fit <- auto.arima(tsx)
plot(forecast(fit))

javlacalle과 아래 답변에 추가하여 imputeTS 패키지에서이를 구현했습니다. 기능은 na.kalman라고하고 칼만은 ARIMA 모델의 상태 공간 형태에 부드럽게 않습니다
stats0007

답변:


25

먼저, forecast표본 외 예측 을 계산하지만 표본 내 관측에 관심 이 있다는 점에 유의하십시오 .

칼만 필터는 결 측값을 처리합니다. 따라서 forecast::auto.arima또는 로 반환 된 출력에서 ​​ARIMA 모델의 상태 공간 양식을 가져 와서 stats::arima전달할 수 KalmanRun있습니다.

편집 (stats0007의 답변을 기반으로 코드 수정)

이전 버전에서는 관측 된 시리즈와 관련된 필터링 된 상태의 열을 가져 왔지만 전체 행렬을 사용하고 관측 방정식 의 해당 행렬 연산을 수행해야합니다 . (주석은 @ stats0007에게 감사합니다.) 아래에서 코드를 업데이트하고 그에 따라 플롯합니다.yt=Zαt

내가 사용하는 ts대신에 샘플 일련의 객체를 zoo하지만 동일해야합니다 :

require(forecast)
# sample series
x0 <- x <- log(AirPassengers)
y <- x
# set some missing values
x[c(10,60:71,100,130)] <- NA
# fit model
fit <- auto.arima(x)
# Kalman filter
kr <- KalmanRun(x, fit$model)
# impute missing values Z %*% alpha at each missing observation
id.na <- which(is.na(x))
for (i in id.na)
  y[i] <- fit$model$Z %*% kr$states[i,]
# alternative to the explicit loop above
sapply(id.na, FUN = function(x, Z, alpha) Z %*% alpha[x,], 
  Z = fit$model$Z, alpha = kr$states)
y[id.na]
# [1] 4.767653 5.348100 5.364654 5.397167 5.523751 5.478211 5.482107 5.593442
# [9] 5.666549 5.701984 5.569021 5.463723 5.339286 5.855145 6.005067

결과를 표본의 중간에 누락 된 관측 값으로 전체 계열 및 전체 연도에 대해 플롯 할 수 있습니다.

par(mfrow = c(2, 1), mar = c(2.2,2.2,2,2))
plot(x0, col = "gray")
lines(x)
points(time(x0)[id.na], x0[id.na], col = "blue", pch = 19)
points(time(y)[id.na], y[id.na], col = "red", pch = 17)
legend("topleft", legend = c("true values", "imputed values"), 
  col = c("blue", "red"), pch = c(19, 17))
plot(time(x0)[60:71], x0[60:71], type = "b", col = "blue", 
  pch = 19, ylim = range(x0[60:71]))
points(time(y)[60:71], y[60:71], col = "red", pch = 17)
lines(time(y)[60:71], y[60:71], col = "red")
legend("topleft", legend = c("true values", "imputed values"), 
  col = c("blue", "red"), pch = c(19, 17), lty = c(1, 1))

원래 시리즈의 플롯과 누락 된 관측치에 대한 값

칼만 필터 대신 칼만 스무더를 사용하여 동일한 예제를 반복 할 수 있습니다. 다음 줄만 변경하면됩니다.

kr <- KalmanSmooth(x, fit$model)
y[i] <- kr$smooth[i,]

칼만 필터를 사용하여 누락 된 관측 값을 처리하는 것은 때때로 계열의 외삽으로 해석됩니다. 칼만 스무더가 사용될 때, 누락 된 관측치는 관측 된 시리즈의 보간에 의해 채워 진다고합니다.


안녕하세요 Javlacalle, 도와 주셔서 감사합니다. 시계열에 대한 조건이 있는지 또는 이것이 적용 가능한지 물어볼 수 있습니까? 이 명령 행에 대해 조금 설명해 주시겠습니까? TMP <-하는 FIT ( Z == 1) ID <- ifelse (길이 (TMP) == 1 TMP [1], TMP [2])model
user3730957

makeARIMA상태 공간 양식의 행렬을 정의하는 방법을 다시 확인했으며 가져온 열 id이 정확 하다고 말합니다 . 관측 방정식의 벡터는 다음과 makeARIMA같이 정의 됩니다. Z <- c(1, rep.int(0, r - 1L), Delta)여기서 Delta차이 필터의 계수를 포함하는 벡터입니다. 차이 필터 (예 : ARMA 모델 length(tmp)==1) id가없는 경우 1이어야합니다. 그렇지 않으면 첫 번째 열은 차등 계열과 관련이 있으며 Z값 1 을 취하는 다음 요소는 과 관련 이 있습니다. yt1
javlacalle

1
@ user3730957이 문제를 색인으로 수정하여 답변을 업데이트했습니다.
javlacalle

2

내 해결책은 다음과 같습니다.

# Take AirPassengers as example
data <- AirPassengers

# Set missing values
data[c(44,45,88,90,111,122,129,130,135,136)] <- NA


missindx <- is.na(data)

arimaModel <- auto.arima(data)
model <- arimaModel$model

#Kalman smoothing
kal <- KalmanSmooth(data, model, nit )
erg <- kal$smooth  

for ( i in 1:length(model$Z)) {
       erg[,i] = erg[,i] * model$Z[i]
}
karima <-rowSums(erg)

for (i in 1:length(data)) {
  if (is.na(data[i])) {
    data[i] <- karima[i]
  }
}
#Original TimeSeries with imputed values
print(data)

@ Javlacalle :

귀하의 게시물에 대한 Thx, 매우 흥미로운!

귀하의 솔루션에 대한 두 가지 질문이 있습니다.

  1. 왜 KalmanSmooth 대신 KalmanRun을 사용합니까? 나는 KalmanRun이 외삽으로 간주되고 매끄러운 것은 추정이라고 읽었습니다.

  2. 나는 또한 당신의 아이디 부분을 얻지 못합니다. .Z의 모든 구성 요소를 사용하지 않는 이유는 무엇입니까? 예를 들어 .Z는 1, 0,0,0,0,1, -1-> 7 값을 제공합니다. 이것은 .smooth (귀하의 경우 KalmanRun states)가 7 개의 열을 제공한다는 것을 의미합니다. 1 또는 -1 인 모든 열을 이해하면 모델로 이동합니다.

    AirPass에서 5 번 행이 누락되었다고 가정하겠습니다. 그런 다음 5 행의 합을 다음과 같이 취합니다 .Z 열이 1이기 때문에 1 열의 값을 추가하고 2 열 4를 추가하지 않습니다 (Z는 0이라고 말함), 5 열을 추가하면 7 열의 음수 값을 더합니다 (Z는 -1이므로)

    내 솔루션이 잘못 되었습니까? 아니면 둘 다 괜찮습니까? 좀 더 설명해 주시겠습니까?


답변의 두 번째 부분을 자신의 답변이 아닌 @Javlacalle의 게시물에 대한 의견으로 게시하는 것이 좋습니다.
Patrick Coulombe

시도 ...하지만 내가 코멘트 50 평판이 있어야 말한다
stats0007
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.