如何使用dplyr管道执行逐步回归分析?

如何使用dplyr管道执行逐步回归分析?,r,dplyr,regression,R,Dplyr,Regression,为了增加可读性,我想在将数据帧导入回归模型之前对其进行过滤。然而,出于某种原因,这似乎是不可能的 我可以这样写: model<-lm(mpg~.,data=mtcars)%>%¨ stepAIC(trace = FALSE) 这个问题似乎只有在我使用stepAIC函数时才会出现。不幸的是,这是我当前项目的一个要求 我能做到这一点吗?在这种情况下,如何做到这一点?stepAIC部分需要从环境中查看数据帧,我尝试了多种方式传递数据帧,但存在问题。一种选择是,您可以尝试,但仍然可以得到以

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

我可以这样写:

model<-lm(mpg~.,data=mtcars)%>%¨
stepAIC(trace = FALSE)
这个问题似乎只有在我使用stepAIC函数时才会出现。不幸的是,这是我当前项目的一个要求


我能做到这一点吗?在这种情况下,如何做到这一点?

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  
#带引导的示例数据集
sampledata=Lappy(1:3,函数(i){
mtcars[样本(nrow(mtcars),替换=真),]
})
#把它藏在一个小盒子里
TIBLE(名称=粘贴0(“数据”,1:3),数据=样本数据)
#一个tibble:3x2
名称数据
1数据1
2数据2
3数据3
res=tibble(name=paste0(“数据”,1:3),data=sampledata)%>%
突变(mdl=map(数据,~stepAIC(lm(mpg~,数据=.x),trace=FALSE)))
res$mdl
[[1]]
电话:
lm(公式=mpg~disp+hp+drat+wt+qsec+am+档位,
数据=.x)
系数:
(截距)显示hp drat wt qsec
-73.20988     -0.01714      0.03991      3.12230     -3.80928      4.08125  
调幅齿轮
-11.24742      7.17872  
[[2]]
电话:
lm(公式=mpg~disp+vs+am+carb,数据=0.x)
系数:
(截距)显示与调幅carb
26.14918     -0.02344      2.11914      5.17128     -1.25915  
[[3]]
电话:
lm(公式=mpg~wt+qsec+am+gear+carb,数据=0.x)
系数:
(截距)wt qsec am齿轮carb
-2.7017      -2.5837       1.4633       2.8117       1.8643      -0.8727  

好的,但是我们能深入研究一下基本原则吗?出于某种原因,我们将数据帧转换为只有一个元素的列表。出于其他未知原因,我们对列表使用map函数(相对于lappy?),它将我们的函数应用于列表中唯一的成员。最后,我们将回归模型作为stepAIC函数的一个参数,而不是仅仅通过dplyr传递它。我并不是故意装腔作势,我只是根据我目前的理解来描述代码:)没问题,正如您所看到的,将结果从lm(mpg~,data=)传递给stepAIC会带来问题。您使用stepAIC所做的是,您正在尝试查找删除或添加项并评估拟合度。您提供了一个公式,因此stepAIC将更改公式,通过lm重新评估调用,并且由于lm不存储实际的data.frame,而只存储模型矩阵,stepAIC必须尝试查找所有这些操作都是从哪个data.frame开始的。这就是为什么当你把它们串在一起时,它会起作用。好吧,我想你的问题还有最后一个部分,如果你尝试df%>%lm(mpg~,data=),它会失败。因为dplyr%>%希望在每个管道上都有一个数据帧,而lm的结果不允许这样做,所以我们使用来自purrr的映射来允许将列表等作为结果保存的灵活性
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