【问题标题】:How do I perform stepwise regression analyses with dplyr pipes?如何使用 dplyr 管道执行逐步回归分析?
【发布时间】:2020-07-04 00:29:20
【问题描述】:

为了提高可读性,我想在将数据框导入回归模型之前对其进行过滤。出于某种原因 - 然而 - 这似乎是不可能的。

我可以这样写:

model<-lm(mpg~.,data=mtcars)%>%¨
stepAIC(trace = FALSE)

....而且效果很好,即使在末端有管道。但后来我尝试用占位符替换 data 参数:

model<-df%>%lm(mpg~.,data=.)%>%
stepAIC(trace = FALSE)

....我收到一个错误声明:

Error in as.data.frame.default(data) : 
cannot coerce class ‘"lm"’ to a data.frame

这个问题似乎只在我使用 stepAIC 功能时出现。不幸的是,这是我当前项目的要求。

我可以做这个工作吗?在这种情况下如何做?

【问题讨论】:

    标签: r dplyr regression


    【解决方案1】:

    stepAIC 部分需要从环境中查看数据帧,我尝试通过多种方式传递它,但存在问题。一种选择是您可以尝试并仍然得到结果:

    library(purrr)
    library(dplyr)
    library(MASS)
    
    list(mtcars) %>% map(~stepAIC(lm(mpg~.,data=.),trace=FALSE))
    [[1]]
    
    Call:
    lm(formula = mpg ~ wt + qsec + am, data = .)
    
    Coefficients:
    (Intercept)           wt         qsec           am  
          9.618       -3.917        1.226        2.936  
    

    另一种方法是,如果您想在多个数据集上运行相同的拟合,请执行以下操作:

    # example dataset with bootstraps
    sampledata = lapply(1:3,function(i){
    mtcars[sample(nrow(mtcars),replace=TRUE),]
    })
    
    # nest it in a tibble
    tibble(names=paste0("data",1:3),data=sampledata)
    # A tibble: 3 x 2
      names data               
      <chr> <list>             
    1 data1 <df[,11] [32 × 11]>
    2 data2 <df[,11] [32 × 11]>
    3 data3 <df[,11] [32 × 11]>
    
    res = tibble(names=paste0("data",1:3),data=sampledata) %>% 
    mutate(mdl=map(data,~stepAIC(lm(mpg~.,data=.x),trace=FALSE)))
    
    res$mdl
    [[1]]
    
    Call:
    lm(formula = mpg ~ disp + hp + drat + wt + qsec + am + gear, 
        data = .x)
    
    Coefficients:
    (Intercept)         disp           hp         drat           wt         qsec  
      -73.20988     -0.01714      0.03991      3.12230     -3.80928      4.08125  
             am         gear  
      -11.24742      7.17872  
    
    
    [[2]]
    
    Call:
    lm(formula = mpg ~ disp + vs + am + carb, data = .x)
    
    Coefficients:
    (Intercept)         disp           vs           am         carb  
       26.14918     -0.02344      2.11914      5.17128     -1.25915  
    
    
    [[3]]
    
    Call:
    lm(formula = mpg ~ wt + qsec + am + gear + carb, data = .x)
    
    Coefficients:
    (Intercept)           wt         qsec           am         gear         carb  
        -2.7017      -2.5837       1.4633       2.8117       1.8643      -0.8727  
    

    【讨论】:

    • 好的,但是我们可以更深入地研究一下基本原理吗?出于某种原因,我们将数据框转换为只有一个元素的列表。由于其他未知原因,我们使用 map 函数(相对于 lapply?)到列表,它将我们的函数应用于我们列表的唯一成员。最后,我们将回归模型作为 stepAIC 函数的参数,而不是仅仅通过 dplyr 传递它。
    • 我并不是要刻薄之类的,我只是根据我目前的理解来描述代码:)
    • 没问题,因为您可以看到有问题的部分来自将结果从 lm(mpg~.,data=.) 传递到 stepAIC。您对 stepAIC 所做的是尝试查找删除或添加术语并评估拟合度。
    • 你提供了一个公式,所以stepAIC会改变公式,重新评估lm的调用,并且由于lm不存储实际的data.frame,而只是一个模型矩阵,stepAIC不得不尝试找到所有这些开始的data.frame。这就是为什么当你把它们串在一起时它会起作用的原因
    • 好的,我认为您的问题还有最后一部分,如果您尝试 df%>%lm(mpg~.,data=.) ,这将失败。因为 dplyr %>% 期望每个管道都有一个数据框,而您的 lm 的结果不允许这样做,所以我们使用 purrr 中的 map 来允许灵活地保存列表等作为结果
    猜你喜欢
    • 2021-04-01
    • 1970-01-01
    • 2019-01-05
    • 2014-12-08
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多