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")感谢您的帮助
发布于 2017-07-15 02:54:31
首先,cv.glmnet没有data参数。它有x和y参数,分别是预测矩阵和响应向量。
其次,seat数据集的第一行缺少值(由于滞后操作,这是不可避免的)。这会把glmnet搞得一团糟,因为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")https://stackoverflow.com/questions/45105351
复制相似问题