R rollapply 在 glmnet 上

R rollapply on glmnet

library(zoo)
library(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")

感谢您的帮助

首先,cv.glmnet 没有 data 参数。它有 xy 个参数,分别是预测矩阵和响应向量。

其次,您的 seat 数据集在第一行中有缺失值(由于滞后操作不可避免)。这会弄乱 glmnet,它有一个相当简单的界面,只进行最少的检查。

第三,coef glmnet/cv.glmnet 对象 returns 一个稀疏矩阵,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 的 formula/data 框架接口。这解决了上面的前两个问题。

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