无法使用glmnet将R的future包用于套索回归

时间:2018-07-26 07:15:29

标签: r future purrr glmnet

我最近发现了R的future软件包,并且已经成功使用了它。 但是,我无法将此包与套索回归的预测一起使用。

在下面的玩具示例中,我首先创建一些玩具数据,然后拟合套索回归,最后对新数据进行预测。 我两次执行此过程:一次不使用future软件包,然后再使用future软件包:

library(tidyverse)
library(glmnet)

set.seed(1)
a <- tibble(id = rep(letters[1:2], each = 100), x1 = rnorm(200), x2 = rnorm(200),
            y = 1 + 2*x2 + rnorm(200))

newdata <- as.matrix(data.frame(x1 = rnorm(200), x2 = rnorm(200)))

pred_func <- function(z) predict(z, newx = newdata)[,1]

b1 <- a %>% 
  group_by(id) %>% 
  nest(.key = data) %>% 
  mutate(lasso = map(data, function(z){glmnet(x = as.matrix(select(z, x1, x2)), y = z$y,  
                                                 intercept = T, alpha = 1)})) %>% 
  mutate(myprediction = map(lasso, pred_func))

这很好用。现在有了将来的软件包:

library(future)

plan(multiprocess)
b2 <- a %>% 
  group_by(id) %>% 
  nest(.key = data) %>% 
  mutate(lasso = map(data, function(z){glmnet(x = as.matrix(select(z, x1, x2)), y = z$y,  
                                              intercept = T, alpha = 1)})) %>% 
  mutate(myprediction_future = map(lasso, ~future(pred_func(.x)))) %>% 
  mutate(myprediction = values(myprediction_future))

此操作以错误终止(德语)。基本上,它告诉我不能将预测用于类elnetglmnet的对象。

我首先想到,predict包中可能有一个不同的future函数,但事实并非如此。 由于我不太了解future函数幕后发生的事情,因此我对此感到困惑。

编辑: 这是英文错误消息:

Error in mutate_impl(.data, dots) : 
Evaluation error: no applicable method for 'predict' applied to 
an object of class "c('elnet', 'glmnet')".

1 个答案:

答案 0 :(得分:1)

predict.glmnet()软件包中有一个glmnet

只需定义一个新函数。

pred_func2 <- function(z) predict.glmnet(z, newx = newdata)[,1]

然后运行。

plan(multiprocess)
b2 <- a %>% 
  group_by(id) %>% 
  nest(.key=data) %>% 
  mutate(lasso=map(data, 
                     function(z) {
                       glmnet(x=as.matrix(select(z, x1, x2)), y=z$y,  
                              intercept=TRUE, alpha=1)
                       })) %>% 
  mutate(myprediction_future=map(lasso, ~future(pred_func2(.x)))) %>% 
  mutate(myprediction=values(myprediction_future))

屈服

> b2
# A tibble: 2 x 5
  id    data               lasso       myprediction_future      myprediction
  <chr> <list>             <list>      <list>                   <list>      
1 a     <tibble [100 x 3]> <S3: elnet> <S3: MultisessionFuture> <dbl [200]> 
2 b     <tibble [100 x 3]> <S3: elnet> <S3: MultisessionFuture> <dbl [200]>