2017-07-14 6 views
0
library(zoo) 
library(glmnet) 

je peux obtenir les coefficients de roulement sur une régression linéaire:R rollapply sur glmnet

seat <- as.zoo(log(UKDriverDeaths)) 
time(seat) <- as.yearmon(time(seat)) 
seat <- merge(y = seat, y1 = lag(seat, k = -1), 
y12 = lag(seat, k = -12), all = FALSE) 



tail(seat) 
fm <- rollapply(seat, width = 50, 
FUN = function(z) coef(lm(y ~ y1 + y12, data = as.data.frame(z))), 
by.column = FALSE, align = "right") 

mais je ne parviens pas à obtenir les coefficients de roulement pour glmnet:

fm <- rollapply(seat, width = 50, 
FUN = function(z) coef(cv.glmnet(z[,c(2,3)],z[,1],alpha=1, data = 
as.data.frame(z))), by.column = FALSE, align = "right") 

Nous vous remercions de toute aide

+0

Veuillez faire en sorte que votre exemple soit reproductible et expliquez ce qui vous pose problème. Est-ce qu'il donne une erreur? Si oui, incluez l'erreur ... – Dason

Répondre

2

Premièrement, cv.glmnet n'a pas d'argument data. Il a x et y arguments qui sont respectivement la matrice prédictive et le vecteur de réponse. Deuxièmement, votre jeu de données seat a des valeurs manquantes dans la première rangée (inévitable en raison de l'opération de décalage). Cela va gâcher glmnet, qui a une interface assez simple qui fait un minimum de vérification.

Troisièmement, coef sur un objet glmnet/cv.glmnet renvoie une matrice clairsemée, que rollapply ne sait pas quoi faire.

Fixation tous ces donne:

fm2 <- rollapply(seat, width=50, FUN=function(z) 
{ 
    z <- na.omit(z) 
    as.numeric(coef(cv.glmnet(z[, c(2, 3)], z[, 1], alpha=1))) 
}, by.column=FALSE, align="right") 

Vous pouvez également utiliser mon paquet glmnetUtils, qui implémente une interface formule/trame de données à glmnet. Cela concerne les deux premiers problèmes ci-dessus.

library(glmnetUtils) 
fm3 <- rollapply(seat, width=50, FUN=function(z) 
{ 
    as.numeric(coef(cv.glmnet(y ~ y1 + y12, data=as.data.frame(z), alpha=1))) 
}, by.column=FALSE, align="right") 
+0

Merci beaucoup pour votre aide. –