首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R rollapply on glmnet

R rollapply on glmnet
EN

Stack Overflow用户
提问于 2017-07-14 22:24:55
回答 1查看 254关注 0票数 1
代码语言:javascript
复制
library(zoo)
library(glmnet)

我可以得到线性回归的滚动系数:

代码语言:javascript
复制
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的滚动系数时遇到了麻烦:

代码语言:javascript
复制
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")

感谢您的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-15 02:54:31

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

其次,seat数据集的第一行缺少值(由于滞后操作,这是不可避免的)。这会把glmnet搞得一团糟,因为glmnet有一个相当简单的接口,只做最少的检查。

第三,glmnet/cv.glmnet对象上的coef返回一个稀疏矩阵,rollapply不知道如何处理这个矩阵。

解决所有这些问题会带来以下好处:

代码语言:javascript
复制
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的公式/数据框架接口。这解决了上面的前两个问题。

代码语言:javascript
复制
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")
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45105351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档