在 dplyr::group_modify 中使用 purrr::possibly() 生成整齐的模型统计信息

Generating tidy model statistics using purrr::possibly() within dplyr::group_modify

我正在尝试在 testData 中拟合许多指数模型,但是,对于 testData$ID 中质量增益模式的变化,该模型对许多人来说不会成功。目标是生成一个 broom::tidy 数据框,其中报告了关于 testData$ID 的所有具有成功模型的统计数据,并且任何没有模型的个人都出现在数据框中,模型统计数据为 NA。以下是无法为任何 ID 建模的数据示例。我查看了 ,它告诉我必须将 purrr::possibly() 包裹在抛出错误的函数周围,而不是 broom::tidy(),所以我废弃了 ExpMod_1 .错误是:

Error: The result of .f should be a data frame.

我还查看了 ,它告诉我可能确实返回了一个函数,该函数“接受与其输入相同的参数”(- user3603486),而不仅仅是 [=19 指定的值=] 论点...这让我感到困惑,因为在那个答案中,NA_character_ 似乎只是一个静态值。这个 运行 抛出的错误是:

Error: No tidy method for objects of class function

我附上了一些示例数据和代码来演示我的问题。

require(tidyverse)
require(broom)

testDat<- tibble(Mass = rnorm(n = 100, mean = 3.5, sd = 0.5),
                 Days_to_Departure = sample(x = (c(1:14)),size = 100, replace = T),
                 ID = sample(x = c(1:4), size = 100, replace = T))
ExpMod_1<-testDat %>% 
  group_by(ID) %>%
  group_modify(.f = ~possibly(~tidy(nls(Mass_Visit ~ a*exp(-b*Days_to_Departure) + c, data = .x,
                                        start = list(a=1.2, b=0.5, c = 3.5),
                                        control = list(maxiter = 500),
                                        trace = T)),otherwise = ~tibble(estimate    = c(NA_real_),
                                                                       p.value      = c(NA_real_),
                                                                       statistic    = c(NA_real_),
                                                                       std.error    = c(NA_real_),
                                                                       term = c(NA_character_))))
ExpMod_2<-testDat %>% 
  group_by(ID) %>%
  group_modify(.f = ~tidy(possibly(~nls(Mass_Visit ~ a*exp(-b*Days_to_Departure) + c, data = .x,
                                        start = list(a=1.2, b=0.5, c = 3.5),
                                        control = list(maxiter = 500),
                                        trace = T),otherwise = ~list(m = NA_character_))))

这两个错误对我来说都很有意义。我想知道是否可以在打包这些函数时嵌套它们,或者我想要做的事情是否需要编写不同的函数。问题是我试图适应很多模型,我预计会有很多失败,我将用不同的模型来解决这些问题……nls、lm、nlme、lmer 等等。但我想适应并比较所有这些,所以我需要知道成功的原因、地点和时间。

在此先致谢,如有任何建议或反馈,我们将不胜感激。

我发现 possibly 的语法非常混乱。这是使用 tryCatch 执行此操作的一种方法:

library(tidyverse)

testDat %>% 
  group_by(ID) %>%
  summarise(data = list(tryCatch({
    tidy(nls(Mass_Visit ~ a*exp(-b*Days_to_Departure) + c, data = .x,
            start = list(a=1.2, b=0.5, c = 3.5),
            control = list(maxiter = 500),
            trace = T))
    }, error = function(e) {
      tibble(estimate    = c(NA_real_),
             p.value      = c(NA_real_),
             statistic    = c(NA_real_),
             std.error    = c(NA_real_),
            term = c(NA_character_))
      })))

#     ID data            
#  <int> <list>          
#1     1 <tibble [1 × 5]>
#2     2 <tibble [1 × 5]>
#3     3 <tibble [1 × 5]>
#4     4 <tibble [1 × 5]>