使用'时出错;分段';从tidyverse和#x27的输出中提取lm;地图';在R

使用'时出错;分段';从tidyverse和#x27的输出中提取lm;地图';在R,r,purrr,R,Purrr,我使用“分段”软件包来寻找R中线性回归的断点 library(tidyverse) library(segmented) df <- data.frame(x = c(1:10), y = c(1,1,1,1,1,6:10)) lm_model <- lm(y ~ x, data = df) seg_model <- segmented(obj = lm_model, seg.Z = ~ x) 库(tidyverse) 图书馆(分段) df这基本上是同一个问题 lm()。但

我使用“分段”软件包来寻找R中线性回归的断点

library(tidyverse)
library(segmented)

df <- data.frame(x = c(1:10), y = c(1,1,1,1,1,6:10))
lm_model <- lm(y ~ x, data = df)
seg_model <- segmented(obj = lm_model, seg.Z = ~ x)
库(tidyverse)
图书馆(分段)

df这基本上是同一个问题

lm()。但是,当被
map()
调用时,提供的表达式是
,在该
map()
调用的直接上下文之外没有任何意义,并导致您观察到的错误

与另一个问题一样,一种解决方法是为
lm()
定义一个包装器,该包装器直接在数据集上构成一个自定义调用,然后由
lm()
捕获为一个未计算的表达式

# Composes a custom lm() expression and evaluates it
lm2 <- function(data, ...)
    eval( rlang::expr(lm(data=!!rlang::enexpr(data), !!!list(...))) )

# Now mapping using lm2, instead of lm
map_test <- nest(df, data=everything()) %>% 
    mutate(map_lm       = map(data, lm2, y ~ x),
           param_map_lm = map(map_lm, broom::tidy))

# The data is stored directly inside the lm object
# segmented() now has no problems accessing it
map_lm_model <- map_test[[2]][[1]]
map_seg_model <- segmented(obj = map_lm_model, seg.Z = ~ x)
# Call: segmented.lm(obj = map_lm_model, seg.Z = ~x)
# 
# Meaningful coefficients of the linear terms:
# (Intercept)            x         U1.x  
#   1.000e+00    6.344e-15    1.607e+00  
# 
# Estimated Break-Point(s):
# psi1.x  
#  3.889  

这基本上是同一个问题

lm()。但是,当被
map()
调用时,提供的表达式是
,在该
map()
调用的直接上下文之外没有任何意义,并导致您观察到的错误

与另一个问题一样,一种解决方法是为
lm()
定义一个包装器,该包装器直接在数据集上构成一个自定义调用,然后由
lm()
捕获为一个未计算的表达式

# Composes a custom lm() expression and evaluates it
lm2 <- function(data, ...)
    eval( rlang::expr(lm(data=!!rlang::enexpr(data), !!!list(...))) )

# Now mapping using lm2, instead of lm
map_test <- nest(df, data=everything()) %>% 
    mutate(map_lm       = map(data, lm2, y ~ x),
           param_map_lm = map(map_lm, broom::tidy))

# The data is stored directly inside the lm object
# segmented() now has no problems accessing it
map_lm_model <- map_test[[2]][[1]]
map_seg_model <- segmented(obj = map_lm_model, seg.Z = ~ x)
# Call: segmented.lm(obj = map_lm_model, seg.Z = ~x)
# 
# Meaningful coefficients of the linear terms:
# (Intercept)            x         U1.x  
#   1.000e+00    6.344e-15    1.607e+00  
# 
# Estimated Break-Point(s):
# psi1.x  
#  3.889  
map_test <- nest(df, data=everything()) %>% 
    mutate(map_lm       = map(data, lm2, y ~ x),
           param_map_lm = map(map_lm, broom::tidy),
           seg_lm       = map(map_lm, segmented, seg.Z=~x))
# # A tibble: 1 x 4
#             data map_lm param_map_lm     seg_lm    
#   <list<df[,2]>> <list> <list>           <list>    
# 1       [10 × 2] <lm>   <tibble [2 × 5]> <segmentd>