누락 된 값이 많은 동물원 시리즈가 있습니다. auto.arima
이 누락 된 값을 무시할 수 있다는 것을 읽었 습니까? 누구든지 어떻게 할 수 있습니까? 고마워요!
이것은 내가 시도했지만 성공하지 못했습니다.
fit <- auto.arima(tsx)
plot(forecast(fit))
누락 된 값이 많은 동물원 시리즈가 있습니다. auto.arima
이 누락 된 값을 무시할 수 있다는 것을 읽었 습니까? 누구든지 어떻게 할 수 있습니까? 고마워요!
이것은 내가 시도했지만 성공하지 못했습니다.
fit <- auto.arima(tsx)
plot(forecast(fit))
답변:
먼저, forecast
표본 외 예측 을 계산하지만 표본 내 관측에 관심 이 있다는 점에 유의하십시오 .
칼만 필터는 결 측값을 처리합니다. 따라서 forecast::auto.arima
또는 로 반환 된 출력에서 ARIMA 모델의 상태 공간 양식을 가져 와서 stats::arima
전달할 수 KalmanRun
있습니다.
편집 (stats0007의 답변을 기반으로 코드 수정)
이전 버전에서는 관측 된 시리즈와 관련된 필터링 된 상태의 열을 가져 왔지만 전체 행렬을 사용하고 관측 방정식 의 해당 행렬 연산을 수행해야합니다 . (주석은 @ stats0007에게 감사합니다.) 아래에서 코드를 업데이트하고 그에 따라 플롯합니다.
내가 사용하는 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,]
칼만 필터를 사용하여 누락 된 관측 값을 처리하는 것은 때때로 계열의 외삽으로 해석됩니다. 칼만 스무더가 사용될 때, 누락 된 관측치는 관측 된 시리즈의 보간에 의해 채워 진다고합니다.
makeARIMA
상태 공간 양식의 행렬을 정의하는 방법을 다시 확인했으며 가져온 열 id
이 정확 하다고 말합니다 . 관측 방정식의 벡터는 다음과 makeARIMA
같이 정의 됩니다. Z <- c(1, rep.int(0, r - 1L), Delta)
여기서 Delta
차이 필터의 계수를 포함하는 벡터입니다. 차이 필터 (예 : ARMA 모델 length(tmp)==1
) id
가없는 경우 1이어야합니다. 그렇지 않으면 첫 번째 열은 차등 계열과 관련이 있으며 Z
값 1 을 취하는 다음 요소는 과 관련 이 있습니다.
내 해결책은 다음과 같습니다.
# 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, 매우 흥미로운!
귀하의 솔루션에 대한 두 가지 질문이 있습니다.
왜 KalmanSmooth 대신 KalmanRun을 사용합니까? 나는 KalmanRun이 외삽으로 간주되고 매끄러운 것은 추정이라고 읽었습니다.
나는 또한 당신의 아이디 부분을 얻지 못합니다. .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이므로)
내 솔루션이 잘못 되었습니까? 아니면 둘 다 괜찮습니까? 좀 더 설명해 주시겠습니까?