Eu tenho uma série de zoológicos com muitos valores ausentes. Eu li que auto.arima
pode imputar esses valores ausentes? Alguém pode me ensinar como fazer isso? Muito obrigado!
Isto é o que eu tentei, mas sem sucesso:
fit <- auto.arima(tsx)
plot(forecast(fit))
Respostas:
Primeiro, saiba que
forecast
calcula previsões fora da amostra, mas você está interessado em observações dentro da amostra.O filtro Kalman lida com os valores ausentes. Assim, você pode pegar a forma de espaço de estado do modelo ARIMA a partir da saída retornada por
forecast::auto.arima
oustats::arima
e passá-la paraKalmanRun
.Editar (corrija o código com base na resposta do stats0007)
Em uma versão anterior, peguei a coluna dos estados filtrados relacionados às séries observadas, no entanto, devo usar toda a matriz e fazer a operação correspondente da matriz da equação de observação, . (Obrigado a @ stats0007 pelos comentários.) Abaixo, atualizo o código e plogo de acordo.yt=Zαt
Eu uso um
ts
objeto como uma série de exemplos em vez dezoo
, mas deve ser o mesmo:Você pode plotar o resultado (para toda a série e para o ano inteiro com observações ausentes no meio da amostra):
Você pode repetir o mesmo exemplo usando o Kalman mais suave em vez do filtro Kalman. Tudo que você precisa alterar são as seguintes linhas:
Lidar com observações ausentes por meio do filtro de Kalman às vezes é interpretado como extrapolação da série; quando o Kalman mais suave é usado, as observações ausentes são preenchidas por interpolação nas séries observadas.
fonte
makeARIMA
define as matrizes do formulário do espaço de estados e eu diria que a coluna obtidaid
está correta. O vetor na equação de observação é definidomakeARIMA
como:,Z <- c(1, rep.int(0, r - 1L), Delta)
ondeDelta
é um vetor que contém os coeficientes do filtro diferencial. Se não houver filtro diferencial (isto é, um modelo ARMAlength(tmp)==1
) , entãoid
deve ser 1; caso contrário, a primeira coluna está relacionada às séries diferenciadas, enquanto o próximo elemento aoZ
assumir o valor 1 está relacionado a , o índice que deve ser utilizado.Aqui seria a minha solução:
@ Javlacalle:
Obrigado pelo seu post, muito interessante!
Tenho duas perguntas para sua solução, espero que você possa me ajudar:
Por que você usa o KalmanRun em vez do KalmanSmooth? Eu li que KalmanRun é considerado extrapolação, enquanto suave seria uma estimativa.
Eu também não entendo sua parte de identificação. Por que você não usa todos os componentes em .Z? Quero dizer, por exemplo .Z fornece 1, 0,0,0,0,1, -1 -> 7 valores. Isso significa que .smooth (no seu caso para os estados do KalmanRun) me fornece 7 colunas. Pelo que entendi, todas as colunas que são 1 ou -1 vão para o modelo.
Digamos que a linha número 5 esteja ausente no AirPass. Então eu pegaria a soma da linha 5 assim: acrescentaria valor da coluna 1 (porque Z deu 1), não acrescentaria a coluna 2-4 (porque Z diz 0), acrescentaria a coluna 5 e acrescentaria adicione o valor negativo da coluna 7 (porque Z diz -1)
Minha solução está errada? Ou ambos estão bem? Talvez você possa me explicar mais?
fonte