嵌套data.frame中的条件变异映射lm

嵌套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

我正在尝试使用嵌套的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), 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>