嵌套data.frame中的条件变异映射lm
我正在尝试使用嵌套的data.frame和map mutate方法在特定地层中运行分层分析,以拟合稍微不同的模型:嵌套data.frame中的条件变异映射lm,r,dplyr,tidyr,purrr,R,Dplyr,Tidyr,Purrr,我正在尝试使用嵌套的data.frame和map mutate方法在特定地层中运行分层分析,以拟合稍微不同的模型: cars_nest <- mtcars %>% group_by(cyl) %>% nest() model1 <- function(df) { lm(mpg ~ disp + wt, data = df) } model2 <- function(df) { lm(mpg ~ disp + wt + factor(vs), da
cars_nest <- mtcars %>%
group_by(cyl) %>%
nest()
model1 <- function(df) {
lm(mpg ~ disp + wt, data = df)
}
model2 <- function(df) {
lm(mpg ~ disp + wt + factor(vs), data = df)
}
cars_nest %>%
mutate(
model = case_when(
cyl == 8 ~ map(data, model1),
cyl %in% c(4, 6) ~ map(data, model2)
)
)
有没有办法使用case_when()实现这一点
注意:模型2中的因素是复制问题所必需的。在实际模型中,这是一个系数,在第一层中只有一个标高,在第二层中有多个标高。只需从
模型2
中删除系数即可:
model2 <- function(df) {
lm(mpg ~ disp + wt + vs, data = df)
}
导致
# A tibble: 3 x 3
# Groups: cyl [3]
cyl data model
<dbl> <list> <list>
1 6 <tibble[,10] [7 x 10]> <lm>
2 4 <tibble[,10] [11 x 10]> <lm>
3 8 <tibble[,10] [14 x 10]> <lm>
#一个tible:3 x 3
#组别:共青团[3]
共青团数据模型
1 6
2 4
3 8
我们可以使用if/else
library(dplyr)
mtcars %>%
nest_by(cyl) %>%
mutate(model = if(cur_group() == 8) list(model1(data)) else
list(model2(data))) %>%
ungroup
-输出
# A tibble: 3 x 3
# cyl data model
# <dbl> <list<tibble>> <list>
#1 4 [11 × 10] <lm>
#2 6 [7 × 10] <lm>
#3 8 [14 × 10] <lm>
#一个tible:3 x 3
#共青团数据模型
#
#1 4 [11 × 10]
#2 6 [7 × 10]
#3 8 [14 × 10]
或者使用OP的代码
library(purrr)
cars_nest %>%
mutate(
model =
if(cur_group() == 8) map(data, model1)
else map(data, model2)
)
# A tibble: 3 x 3
# Groups: cyl [3]
# cyl data model
# <dbl> <list> <list>
#1 6 <tibble [7 × 10]> <lm>
#2 4 <tibble [11 × 10]> <lm>
#3 8 <tibble [14 × 10]> <lm>
库(purrr)
汽车巢%>%
变异(
型号=
if(cur_group()==8)映射(数据,模型1)
else映射(数据,模型2)
)
#一个tibble:3x3
#组别:共青团[3]
#共青团数据模型
#
#1 6
#2 4
#3 8
您也可以使用以下解决方案,但这两者之间没有太大区别:
library(dplyr)
library(purrr)
library(broom)
cars_nest %>%
mutate(model = ifelse(cyl %in% c(4, 6), map(data, ~ model2(.)),
map(data, ~ model1(.))),
glance = map(model, ~ glance(.x))) %>%
unnest(glance) %>%
select(-data)
# A tibble: 3 x 14
# Groups: cyl [3]
cyl model r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance
<dbl> <lis> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 6 <lm> 0.702 0.403 1.12 2.35 0.251 3 -7.78 25.6 25.3 3.78
2 4 <lm> 0.659 0.513 3.15 4.51 0.0461 3 -25.7 61.5 63.5 69.3
3 8 <lm> 0.425 0.320 2.11 4.06 0.0477 2 -28.6 65.3 67.8 49.0
# ... with 2 more variables: df.residual <int>, nobs <int>
库(dplyr)
图书馆(purrr)
图书馆(扫帚)
汽车巢%>%
变异(model=ifelse)(cyl%在%c(4,6)中),映射(数据,~model2(),
地图(数据,~model1(),
浏览=地图(型号,~glance(.x)))%>%
最新(浏览)%>%
选择(-数据)
#一个tibble:3x14
#组别:共青团[3]
cyl模型r平方调整r平方西格玛统计p值df logLik AIC BIC偏差
1 6 0.702 0.403 1.12 2.35 0.251 3 -7.78 25.6 25.3 3.78
2 4 0.659 0.513 3.15 4.51 0.0461 3 -25.7 61.5 63.5 69.3
3 8 0.425 0.320 2.11 4.06 0.0477 2 -28.6 65.3 67.8 49.0
# ... 还有两个变量:df.残差,nobs
这与您的模型2有关。系数声明是再现问题条件所必需的(请参见编辑)。我没有意识到您故意使用系数来创建错误。也许这应该在原始帖子中解释。@RaoulDuke与case\u一起使用时,
,默认选项为NA,并且有一个类型检查和结构check@AnoushiravanR这是一个嵌套列表,但是如果你将模型cars\u nest%>%进行变异(model=map2(cyl,data,~ifelse(.x%in%c(4,6),model2(.y),我会在那里得到lm结果,model1(.y)))%%>%pull(model)
@akrun我知道了,非常感谢。@akrun哦,完全可以,我理解。事实上,你不必回答任何评论或问题,因为我们都有自己的想法,我不希望得到快速的回应。我完全理解你的处境,我已经欠你的债了&感谢你教给我的一切。只要你有可能,就慢慢来。@akrun,我再次很抱歉问这么多问题。我希望有一天我能报答你。正如dear@akrun刚才提到的,我个人从不在我可以使用ifelse
或ifelse
时使用case\u,因为它们更灵活。不过,这是个人的选择,这只是我的意见。如果你有其他选择
也会进行一些类型检查<当
或
如果其他时,代码>案例是很好的选择。只是当返回的对象很复杂,并且我们的logicall条件长度是针对单个row@akrun你完全正确。我只需要体验更多的选择。我就是找不出map2
选项出了什么问题。
library(purrr)
cars_nest %>%
mutate(
model =
if(cur_group() == 8) map(data, model1)
else map(data, model2)
)
# A tibble: 3 x 3
# Groups: cyl [3]
# cyl data model
# <dbl> <list> <list>
#1 6 <tibble [7 × 10]> <lm>
#2 4 <tibble [11 × 10]> <lm>
#3 8 <tibble [14 × 10]> <lm>
library(dplyr)
library(purrr)
library(broom)
cars_nest %>%
mutate(model = ifelse(cyl %in% c(4, 6), map(data, ~ model2(.)),
map(data, ~ model1(.))),
glance = map(model, ~ glance(.x))) %>%
unnest(glance) %>%
select(-data)
# A tibble: 3 x 14
# Groups: cyl [3]
cyl model r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance
<dbl> <lis> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 6 <lm> 0.702 0.403 1.12 2.35 0.251 3 -7.78 25.6 25.3 3.78
2 4 <lm> 0.659 0.513 3.15 4.51 0.0461 3 -25.7 61.5 63.5 69.3
3 8 <lm> 0.425 0.320 2.11 4.06 0.0477 2 -28.6 65.3 67.8 49.0
# ... with 2 more variables: df.residual <int>, nobs <int>