在 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]>
我正在尝试在 testData
中拟合许多指数模型,但是,对于 testData$ID
中质量增益模式的变化,该模型对许多人来说不会成功。目标是生成一个 broom::tidy
数据框,其中报告了关于 testData$ID
的所有具有成功模型的统计数据,并且任何没有模型的个人都出现在数据框中,模型统计数据为 NA。以下是无法为任何 ID 建模的数据示例。我查看了 ExpMod_1
.错误是:
Error: The result of .f should be a data frame.
我还查看了 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]>