【问题标题】:Generating tidy model statistics using purrr::possibly() within dplyr::group_modify在 dplyr::group_modify 中使用 purrr::possibly() 生成整洁的模型统计信息
【发布时间】:2021-03-26 15:19:13
【问题描述】:

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

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

我还查看了this post,它告诉我可能确实返回了一个“接受与其输入相同的参数”的函数(- user3603486),而不仅仅是otherwise 参数指定的值......这让我感到困惑,因为在那个答案中,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 等。但我想拟合和比较所有这些,所以我需要知道成功的方法、地点和时间。

在此先感谢,任何建议或反馈将不胜感激。

【问题讨论】:

    标签: r dplyr purrr broom


    【解决方案1】:

    我发现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]>
    

    【讨论】:

    • 太棒了!通过一些小的调整,这正是我想要的。作为参考,调整如下:group_modify(~tryCatch({tidy(nls(Mass_Visit ~ a*exp(-b*Days_to_Departure) + c, data = .x, 调用后对数据进行分组。由于 tibble-in/tibble-out 行为(无需嵌套和取消嵌套),因此首选组修改功能。此外,summary 看起来对使用“.”处理哪些数据感到困惑。很高兴能有这个工作——谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2014-10-18
    • 2015-07-10
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多