如何使用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