【问题标题】:How to fix "Error in eval(predvars, data, env) : numeric 'envir' arg not of length one" in purr如何在 purr 中修复“eval 中的错误(predvars,data,env):数字 'envir' arg 长度不为 1”
【发布时间】:2019-05-30 00:03:46
【问题描述】:

我正在引导众所周知的mtcars 数据集并使用glmpurrr::map 应用逻辑回归。但是我得到了

Error in eval(predvars, data, env) : 
  numeric 'envir' arg not of length one

错误

我已经尝试将glm 应用于单个引导数据并且它工作正常,但是当我应用map 函数时它失败了

library(tidyverse)
library(rsample)
library(broom)

sample10 <- 
    bootstraps(mtcars, times=10) %>%  
    rowwise() %>% 
    mutate(data_sample=list(analysis(splits))) %>%
    select(id, data_sample)

sample10

Source: local data frame [10 x 2]
Groups: <by row>

# A tibble: 10 x 2
   id          data_sample        
   <chr>       <list>             
 1 Bootstrap01 <df[,11] [32 × 11]>
 2 Bootstrap02 <df[,11] [32 × 11]>
 3 Bootstrap03 <df[,11] [32 × 11]>
 4 Bootstrap04 <df[,11] [32 × 11]>
 5 Bootstrap05 <df[,11] [32 × 11]>
 6 Bootstrap06 <df[,11] [32 × 11]>
 7 Bootstrap07 <df[,11] [32 × 11]>
 8 Bootstrap08 <df[,11] [32 × 11]>
 9 Bootstrap09 <df[,11] [32 × 11]>
10 Bootstrap10 <df[,11] [32 × 11]>

当我尝试为每个引导数据框拟合模型时:

sample10 %>% 
    mutate(model_fit = map(data_sample, 
                           ~ glm(formula= vs ~ wt + disp,                    
                                 data=., 
                                 family=binomial)))

Error in eval(predvars, data, env) : 
  numeric 'envir' arg not of length one

但是,当我尝试将 glm 拟合到单个 Bootstrap 数据框时,一切都很好

glm(formula= vs ~ wt + disp, data=sample10$data_sample[[1]], family=binomial)


Call:  glm(formula = vs ~ wt + disp, family = binomial, data = sample10$data_sample[[1]])

Coefficients:
(Intercept)           wt         disp  
    5.54313     -1.19918     -0.01472  

Degrees of Freedom: 31 Total (i.e. Null);  29 Residual
Null Deviance:      41.18 
Residual Deviance: 16.97    AIC: 22.97

错误消息没有帮助,我不确定自己做错了什么。我觉得它与purrr::map 功能有关,但我不确定。

感谢任何帮助。

【问题讨论】:

  • map 应该可以工作 map(sample10$data_sample, ~ glm(vs ~ wt + disp, data = .x, family = binomial)) 在上面,您正在尝试创建模型输出而不包含在列表中

标签: r purrr glm broom


【解决方案1】:

我认为问题是小标题仍然按行分组。如果您将ungroup() 添加为链的最后一步,则代码将起作用。

sample10 <- bootstraps(mtcars, times=10) %>%  
  rowwise() %>% 
  mutate(data_sample=(list(analysis(splits)))) %>%
  select(id, data_sample) %>%
  ungroup()

sample10 %>% 
  mutate(model_fit = map(data_sample, 
                         ~ glm(formula= vs ~ wt + disp,                    
                               data=., 
                               family=binomial)))


# A tibble: 10 x 3
   id          data_sample            model_fit
   <chr>       <list>                 <list>   
 1 Bootstrap01 <data.frame [32 x 11]> <S3: glm>
 2 Bootstrap02 <data.frame [32 x 11]> <S3: glm>
 3 Bootstrap03 <data.frame [32 x 11]> <S3: glm>
 4 Bootstrap04 <data.frame [32 x 11]> <S3: glm>
 5 Bootstrap05 <data.frame [32 x 11]> <S3: glm>
 6 Bootstrap06 <data.frame [32 x 11]> <S3: glm>
 7 Bootstrap07 <data.frame [32 x 11]> <S3: glm>
 8 Bootstrap08 <data.frame [32 x 11]> <S3: glm>
 9 Bootstrap09 <data.frame [32 x 11]> <S3: glm>
10 Bootstrap10 <data.frame [32 x 11]> <S3: glm>

【讨论】:

  • 是的,成功了! :) 非常感谢@H 1。我想知道您是如何注意到我需要在此处添加as_tibble() 的。如果我不添加as_tibble(),是否因为数据被分组(Groups: &lt;by row&gt;)?我没有使用as_tibble() 运行,而是添加了ungroup(),它确实也成功地运行了。
  • @MehmetÖnerYalçın - 很高兴听到它有帮助。代码没有任何明显错误,所以我怀疑问题是由rowwise() 引起的。我同意 ungroup()as_tibble() 更合适,即使结果相同 - 已更新帖子。
猜你喜欢
  • 2019-12-17
  • 1970-01-01
  • 2018-11-05
  • 2020-09-21
  • 2020-04-12
  • 1970-01-01
  • 2022-01-11
  • 2020-04-02
  • 2022-11-07
相关资源
最近更新 更多