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

我可以得到一個線性迴歸滾動係數:[R rollapply上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") 

,但我有麻煩的滾動係數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") 

謝謝你任何幫助

+0

請讓您的示例具有可重現性,並明確說明是什麼給了您這個問題。它是否給出錯誤?如果包含錯誤... – Dason

回答

2

首先,cv.glmnet沒有data參數。它分別具有xy參數,它們分別是預測矩陣和響應向量。

其次,您的seat數據集在第一行中有缺失值(由於滯後操作而不可避免)。這將弄糟glmnet,它有一個相當簡單的接口,它只做最小限度的檢查。

三,在glmnet/cv.glmnet對象上的coef返回一個稀疏矩陣,其中rollapply不知道該如何處理。

固定所有這些給出:

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") 

也可以使用我的glmnetUtils包,它實現了一個公式/數據幀接口glmnet。這涉及上面的兩個問題。

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

非常感謝您的幫助。 –