Erreurs non corrélées du modèle des moindres carrés généralisés (GLS)

8

En tant qu'institution financière, nous nous heurtons souvent à l'analyse de données chronologiques. Souvent, nous finissons par faire une régression en utilisant des variables de séries chronologiques. Dans ce cas, nous rencontrons souvent des résidus avec une structure de séries chronologiques qui viole l'hypothèse de base d'erreurs indépendantes dans la régression OLS. Récemment, nous construisons un autre modèle dans lequel je pense que nous avons une régression avec des erreurs autocorrélées.Les résidus du modèle linéaire ont lm(object)clairement une structure AR (1), comme le montrent ACF et PACF. J'ai pris deux approches différentes, la première était évidemment d'adapter le modèle en utilisant les moindres carrés généralisés gls()dans R. Mon attente était que les résidus de gls (objet) soient un bruit blanc (erreurs indépendantes). Mais les résidus degls(object)ont toujours la même structure ARIMA que dans la régression ordinaire. Malheureusement, il y a quelque chose qui ne va pas dans ce que je fais que je n'ai pas pu comprendre. J'ai donc décidé d'ajuster manuellement les coefficients de régression à partir du modèle linéaire (estimations OLS). Étonnamment, cela semble fonctionner lorsque j'ai tracé les résidus de la régression ajustée (les résidus sont du bruit blanc). Je veux vraiment l'utiliser gls()dans le nlmepackage pour que le codage soit beaucoup plus simple et plus facile. Quelle serait l'approche que je devrais adopter ici? Suis-je censé utiliser REML? ou est-ce que mon attente de résidus non corrélés (bruit blanc) provenant d'un objet gls () est fausse?

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

Y a-t-il un problème avec ce que je fais ???????

Anand
la source

Réponses:

11

Les résidus de glsauront en effet la même structure d'autocorrélation, mais cela ne signifie pas que les estimations des coefficients et leurs erreurs standard n'ont pas été ajustées de manière appropriée. (Il n'est évidemment pas nécessaire non plus que soit diagonal.) En effet, les résidus sont définis comme . Si la matrice de covariance de était égale à , il n'y aurait pas besoin d'utiliser GLS!Ωe=YXβ^GLSeσ2I

En bref, vous n'avez rien fait de mal, il n'est pas nécessaire d'ajuster les résidus, et les routines fonctionnent toutes correctement.

predict.glsprend en compte la structure de la matrice de covariance lors de la formation des erreurs standard du vecteur de prédiction. Cependant, il n'a pas la fonctionnalité pratique "prévoir quelques observations à venir" predict.Arima, qui prend en compte les résidus pertinents à la fin de la série de données et la structure des résidus lors de la génération des valeurs prédites. arimaa la capacité d'incorporer une matrice de prédicteurs dans l'estimation, et si vous êtes intéressé par la prévision à quelques pas, cela peut être un meilleur choix.

EDIT: Invité par un commentaire de Michael Chernick (+1), j'ajoute un exemple comparant GLS avec les résultats ARMAX (arima), montrant que les estimations des coefficients, les probabilités logarithmiques, etc. sont toutes identiques, au moins à quatre décimales lieux (un degré de précision raisonnable étant donné que deux algorithmes différents sont utilisés):

# 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: invité par un commentaire de anand (OP), voici une comparaison des prédictions de glset arimaavec la même structure de données de base que ci-dessus et certaines lignes de sortie étrangères supprimées:

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

Comme nous pouvons le voir, les valeurs prédites sont différentes, bien qu'elles convergent à mesure que nous progressons dans le futur. En effet, glsne traite pas les données comme une série chronologique et ne prend pas en compte la valeur spécifique du résidu à l'observation 995 lors de la formation des prédictions arima. L'effet du résidu à obs. 995 diminue à mesure que l'horizon de prévision augmente, conduisant à la convergence des valeurs prédites.

Par conséquent, pour les prévisions à court terme des données de séries chronologiques, ce arimasera mieux.

jbowman
la source
1
L'application d'une structure d'arma aux résidus serait, je pense, un peu différente du résultat donné par le gls concernant les paramètres de régression.
Michael R. Chernick
L'approche de modélisation ARMA correspond également à la structure de corrélation dans les résidus plutôt que de la spécifier dans la matrice de covariance.
Michael R. Chernick
Bowman, merci monsieur pour une explication si concise et claire. Donc, en bref, utiliser la structure des résidus à la fin des séries de données au lieu de la matrice de covariance sera une meilleure approche en matière de prédiction. Qu'est-ce que cela signifie est predire.arima () vous donnera une meilleure prédiction que Predict.gls () correcte?
Anand
J'ai ajouté quelques exemples de prédiction à la réponse, mais la version courte est oui, car les données de série temporelle predict.arima()vous donneront une meilleure prédiction que predict.gls().
jbowman le
jBowman, puis-je demander deux suites à cette question plutôt ancienne (je me connectais juste pour demander la même chose que cet OP)? 1) Je suppose que la même chose vaut pour l'hétéroskédasticité - c'est-à-dire que les résidus de GLS n'auront toujours pas l'air homoscédastiques? 2) La situation est-elle différente pour la régression avec des erreurs arima (votre exemple arima)? J'ai toujours lu que pour voir si vous avez correctement spécifié le modèle, les résidus devraient être du bruit blanc?
B_Miner
3

Vous voulez les résidus normalisés. Tu vois ?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
la source