2017-08-19 6 views
0

Je souhaite calculer les coefficients (les intersections en particulier) des régressions roulantes. Il y a beaucoup de variables dépendantes. Certains d'entre eux (Y1 et Y2) sont présentés ci-dessous. Chacun d'eux est régressé avec des variables indépendantes X1 et X2. De plus, Y1 et Y2 ont tous deux des AN dans différentes périodes. Les données sont une série chronologique avec un intervalle mensuel. La fenêtre de roulement est 6.Calculer des coefficients de régressions roulantes avec des variables dépendantes dans les colonnes

Voici mon code:

rr <- rollapply(df, width = 6, 
        FUN = function(z) coef(lm(Y1~ X1+X2, 
          data = as.data.frame(z))), 
       by.column = FALSE, align = "right") 

Cependant, le problème de ce code est que
1) ne traite que d'une variable indépendante (Y1 dans ce cas) à la fois 2) elle a donné les mêmes coefficients pour toutes les régressions tournantes. Je suppose que l'existence de NA a chamboulé la régression linéaire?
J'apprécierais grandement que quelqu'un puisse jeter des lumières. Merci.

Ceci est un exemple de données.

Date  Y1 Y2 X1  X2 
1/1/2009 NA 1.51 0.02 0.75 
2/1/2009 NA -0.38 0.01 0.59 
3/1/2009 NA 1.54 0.02 0.96 
4/1/2009 NA 1.78 0.01 0.92 
5/1/2009 NA 0.94 0.02 0.02 
6/1/2009 NA 1.37 0.01 0.46 
7/1/2009 NA 1.22 0.01 0.61 
8/1/2009 NA 1.32 0.01 0.04 
9/1/2009 NA 0.83 0.01 0.03 
10/1/2009 NA 0.95 0.02 0.61 
11/1/2009 NA 0.28 0.03 0.53 
12/1/2009 NA 0.17 0.01 0.32 
1/1/2010 1.71 NA 0.03 0.53 
2/1/2010 0.39 NA 0.03 0.16 
3/1/2010 0.11 NA 0.01 0.58 
4/1/2010 1.25 NA 0.01 0.41 
5/1/2010 0.57 NA 0.01 0.9 
6/1/2010 0.48 NA 0.01 0.58 
7/1/2010 0.16 NA 0.01 0.03 
8/1/2010 0.37 NA 0.01 0.23 
9/1/2010 0.31 NA 0.01 0.77 
10/1/2010 0.63 NA 0.01 0.75 
11/1/2010 0.61 NA 0.01 0.74 
12/1/2010 0.91 NA 0.01 0.41 

Répondre

1

Il y a deux problèmes:

  1. passer un data.frame à rollapply amène à être converti en une matrice et puisque l'une des colonnes est la colonne de caractères le résultat sera une matrice de caractères alors que numérique est ce qui est nécessaire. Utilisez df[-1] ou le code ci-dessous.

  2. lm n'accepte pas une variable dépendante ayant toutes les valeurs NA. Vérifiez pour cela et renvoyez NA dans de tels cas.

Ajout de quelques améliorations:

  • d'abord convertir l'entrée au zoo de classe.
  • définir la fonction getCoef pour obtenir les coefficients étant donné les données et le côté gauche et à droite de la formule
  • définir la fonction roll faire la rollapply réelle en utilisant rollapplyr
  • lapply la fonction roll sur c("Y1", "Y2") pour produire une liste de 2 zoo objets
  • Carte en option fortify.zoo sur L pour donner une liste de trames de données

code:

z <- read.zoo(df, FUN = as.yearmon, format = "%m/%d/%Y") 

getCoef <- function(z, lhs, rhs) { 
    if (all(is.na(z[, lhs]))) NA 
    else coef(lm(paste(lhs, "~", rhs), z)) 
} 

roll <- function(z, lhs, rhs = "X1 + X2") { 
    rollapplyr(z, 6, getCoef, by.column = FALSE, coredata = FALSE, lhs = lhs, rhs = rhs) 
} 

ynames <- c("Y1", "Y2") 
L <- lapply(ynames, roll, z = z) 

En option, une liste des data.frames:

Map(fortify.zoo, L) 

Note: L'entréedf sous forme reproductible:

Lines <- "Date Y1 Y2 X1 X2 
1/1/2009 NA 1.51 0.02 0.75 
2/1/2009 NA -0.38 0.01 0.59 
3/1/2009 NA 1.54 0.02 0.96 
4/1/2009 NA 1.78 0.01 0.92 
5/1/2009 NA 0.94 0.02 0.02 
6/1/2009 NA 1.37 0.01 0.46 
7/1/2009 NA 1.22 0.01 0.61 
8/1/2009 NA 1.32 0.01 0.04 
9/1/2009 NA 0.83 0.01 0.03 
10/1/2009 NA 0.95 0.02 0.61 
11/1/2009 NA 0.28 0.03 0.53 
12/1/2009 NA 0.17 0.01 0.32 
1/1/2010 1.71 NA 0.03 0.53 
2/1/2010 0.39 NA 0.03 0.16 
3/1/2010 0.11 NA 0.01 0.58 
4/1/2010 1.25 NA 0.01 0.41 
5/1/2010 0.57 NA 0.01 0.9 
6/1/2010 0.48 NA 0.01 0.58 
7/1/2010 0.16 NA 0.01 0.03 
8/1/2010 0.37 NA 0.01 0.23 
9/1/2010 0.31 NA 0.01 0.77 
10/1/2010 0.63 NA 0.01 0.75 
11/1/2010 0.61 NA 0.01 0.74 
12/1/2010 0.91 NA 0.01 0.41" 
df <- read.table(text = Lines, header = TRUE)