Erros não correlacionados do modelo Generalized Least Square (GLS)

8

Como instituição financeira, frequentemente analisamos dados de séries temporais. Muitas vezes acabamos fazendo regressão usando variáveis ​​de séries temporais. Quando isso acontece, geralmente encontramos resíduos com a estrutura de séries temporais que viola a suposição básica de erros independentes na regressão do OLS. Recentemente, estamos construindo outro modelo no qual acredito ter regressão com erros autocorrelacionados. Os resíduos do modelo linear têm lm(object)claramente uma estrutura AR (1), como é evidente no ACF e PACF. Eu tomei duas abordagens diferentes, a primeira obviamente foi para ajustar o modelo usando mínimos quadrados generalizados gls()em R. Minha expectativa era que os resíduos de gls (objeto) fossem um ruído branco (erros independentes). Mas os resíduos degls(object)ainda tem a mesma estrutura ARIMA que na regressão comum. Infelizmente, há algo errado no que estou fazendo que não consegui descobrir. Por isso, decidi ajustar manualmente os coeficientes de regressão a partir do modelo linear (estimativas OLS). Surpreendentemente, isso parece estar funcionando quando eu plotei os resíduos da regressão ajustada (os resíduos são ruído branco). Eu realmente quero usar gls()no nlmepacote para que a codificação seja muito mais simples e fácil. Qual seria a abordagem que eu deveria adotar aqui? Eu devo usar REML? ou a minha expectativa de resíduos não correlacionados (ruído branco) do objeto gls () está errada?

gls.bk_ai <- gls(PRNP_BK_actINV ~ PRM_BK_INV_ENDING + NPRM_BK_INV_ENDING, 
                 correlation=corARMA(p=1), method='ML',  data  = fit.cap01A)

gls2.bk_ai  <- update(gls.bk_ai, correlation = corARMA(p=2))

gls3.bk_ai <- update(gls.bk_ai, correlation = corARMA(p=3))

gls0.bk_ai <- update(gls.bk_ai, correlation = NULL)

anova(gls.bk_ai, gls2.bk_ai, gls3.bk_ai, gls0.bk_ai)  
     ## looking at the AIC value, gls model with AR(1) will be the best bet

acf2(residuals(gls.bk_ai)) # residuals are not white noise

Existe algo errado com o que estou fazendo ???????

Anand
fonte

Respostas:

11

Os resíduos de gls, de fato, terão a mesma estrutura de autocorrelação, mas isso não significa que as estimativas do coeficiente e seus erros padrão não foram ajustados adequadamente. (Obviamente, também não há exigência de que seja diagonal.) Isso ocorre porque os resíduos são definidos como . Se a matriz de covariância de fosse igual a , não haveria necessidade de usar GLS!e = Y - X β GLS e σ 2 IΩe=YXβ^GLSeσ2I

Em resumo, você não fez nada de errado, não há necessidade de ajustar os resíduos, e as rotinas estão todas funcionando corretamente.

predict.glsleva em consideração a estrutura da matriz de covariância ao formar erros padrão do vetor de previsão. No entanto, ele não possui o recurso conveniente "prever algumas observações à frente" predict.Arima, que leva em consideração os resíduos relevantes no final da série de dados e a estrutura dos resíduos ao gerar valores previstos. arimatem a capacidade de incorporar uma matriz de preditores na estimativa e, se você estiver interessado em prever alguns passos à frente, pode ser uma escolha melhor.

EDIT: Solicitado por um comentário de Michael Chernick (+1), estou adicionando um exemplo comparando GLS com resultados ARMAX (arima), mostrando que estimativas de coeficientes, probabilidades de log etc. são iguais, pelo menos quatro casas decimais locais (um grau razoável de precisão, considerando que dois algoritmos diferentes são usados):

# Generating data
eta <- rnorm(5000)
for (j in 2:5000) eta[j] <- eta[j] + 0.4*eta[j-1]
e <- eta[4001:5000]
x <- rnorm(1000)
y <- x + e

> summary(gls(y~x, correlation=corARMA(p=1), method='ML'))
Generalized least squares fit by maximum likelihood
  Model: y ~ x 
  Data: NULL 
       AIC      BIC    logLik
  2833.377 2853.008 -1412.688

Correlation Structure: AR(1)
 Formula: ~1 
 Parameter estimate(s):
      Phi 
0.4229375 

Coefficients:
                 Value  Std.Error  t-value p-value
(Intercept) -0.0375764 0.05448021 -0.68973  0.4905
x            0.9730496 0.03011741 32.30854  0.0000

 Correlation: 
  (Intr)
x -0.022

Standardized residuals:
        Min          Q1         Med          Q3         Max 
-2.97562731 -0.65969048  0.01350339  0.70718362  3.32913451 

Residual standard error: 1.096575 
Degrees of freedom: 1000 total; 998 residual
> 
> arima(y, order=c(1,0,0), xreg=x)

Call:
arima(x = y, order = c(1, 0, 0), xreg = x)

Coefficients:
         ar1  intercept       x
      0.4229    -0.0376  0.9730
s.e.  0.0287     0.0544  0.0301

sigma^2 estimated as 0.9874:  log likelihood = -1412.69,  aic = 2833.38

EDIT: Solicitado por um comentário de anand (OP), aqui está uma comparação de previsões de glse arimacom a mesma estrutura básica de dados acima e algumas linhas de saída estranhas removidas:

df.est <- data.frame(list(y = y[1:995], x=x[1:995]))
df.pred <- data.frame(list(y=NA, x=x[996:1000]))

model.gls <- gls(y~x, correlation=corARMA(p=1), method='ML', data=df.est)
model.armax <- arima(df.est$y, order=c(1,0,0), xreg=df.est$x)

> predict(model.gls, newdata=df.pred)
[1] -0.3451556 -1.5085599  0.8999332  0.1125310  1.0966663

> predict(model.armax, n.ahead=5, newxreg=df.pred$x)$pred
[1] -0.79666213 -1.70825775  0.81159072  0.07344052  1.07935410

Como podemos ver, os valores previstos são diferentes, embora estejam convergindo à medida que avançamos para o futuro. Isso ocorre porque glsnão trata os dados como uma série temporal e leva em consideração o valor específico do resíduo na observação 995 ao formar previsões, mas o arimafaz. O efeito do residual em obs. 995 diminui à medida que o horizonte de previsão aumenta, levando à convergência dos valores previstos.

Consequentemente, para previsões de curto prazo de dados de séries temporais, arimaserá melhor.

jbowman
fonte
1
A aplicação de uma estrutura de arma aos resíduos seria um pouco diferente do resultado que o gls fornece em relação aos parâmetros de regressão.
22912 Michael Michael Chernick
Além disso, a abordagem de modelagem ARMA encaixa a estrutura de correlação nos resíduos, em vez de especificá-la na matriz de covariância.
22912 Michael Michael Chernick
Bowman, obrigado senhor por uma explicação concisa e clara. Portanto, resumidamente, usar a estrutura de resíduos no final da série de dados em vez da matriz de covariância será uma abordagem melhor na previsão. O que isso significa é prever.arima () fornecerá uma previsão melhor do que prever.gls () correto?
Anand
Anexamos algumas coisas de exemplo de previsão à resposta, mas a versão curta é sim, pois os dados de séries temporais predict.arima()fornecerão uma previsão melhor do que predict.gls().
22412 jbowman
jBowman, posso fazer dois follow-ups para essa pergunta bastante antiga (eu estava apenas efetuando login para fazer a mesma coisa que este OP)? 1) Presumo o mesmo para a heterocedasticidade - ou seja, os resíduos do GLS ainda não parecerão homoscedásticos? 2) A situação é diferente para regressão com erros de arima (seu exemplo de arima)? Eu sempre li que para ver se você tem o modelo especificado corretamente, os resíduos devem ser ruído branco?
precisa saber é o seguinte
3

Você deseja os resíduos normalizados. Veja ?residuals.lme.

#Reproducible code from ?corARMA
fm1Ovar.lme <- lme(follicles ~ sin(2*pi*Time) + cos(2*pi*Time),
                   data = Ovary, random = pdDiag(~sin(2*pi*Time)))
fm5Ovar.lme <- update(fm1Ovar.lme,
                corr = corARMA(p = 1, q = 1))

#raw residuals divided by the corresponding standard errors
acf(residuals(fm5Ovar.lme),type="partial")

#standardized residuals pre-multiplied 
#by the inverse square-root factor of the estimated error correlation matrix
acf(residuals(fm5Ovar.lme,type="normalized"),type="partial")
Roland
fonte