使用 purrr 和 modelr 从剂量反应模型 (drm) 进行预测
Using purrr and modelr to make predictions from dose-response models (drm)
我有一个数据集,缩写形式如下所示:
library(tidyverse)
dat_s<-tibble(
type=c(rep("A", 9), rep("B", 8), rep("C", 10)),
ref=c("ref3", "ref3", "ref1", "ref2", "ref2", "ref1", "ref2", "ref2", "ref2", "ref2",
"ref1", "ref2", "ref2", "ref3", "ref2", "ref3", "ref1", "ref3",
"ref2", "ref3", "ref1", "ref1", "ref3", "ref1", "ref1", "ref2", "ref2"),
info=as.character(sample(100, 27)),
liv=c(3.0e-05, 2.9e-07, 2.2e-07, 2.7e-07, 2.6e-06, 4.8e-07, 1.4e-05, 2.6e-06, 7.7e-06, 2.2e-06,
1.5e-07, 1.6e-07, 1.8e-06, 6.1e-08, 4.9e-06, 4.9e-06, 1.8e-06, 1.5e-07,
4.3e-08, 1.8e-06, 1.0e-07, 1.6e-07, 9.7e-07, 1.0e-06, 6.4e-07, 1.2e-07, 5.7e-06),
prod=c(0.00, 2, 3, 4.80, 2.10, 5.10, 0.00, 0.13, 2.00, 0.13, 0.00, 4.10, 4.60, 2.10, 0.26, 0.00,
4.60, 0.00, 4.60, 2.10, 4.80, 0.00, 0.00, 1.80, 3.60, 4.10, 0.00)
)%>%
mutate(livp1=liv+1)
我想为 type
和 ref
的每个组合计算剂量反应关系,进行预测以绘制曲线,并计算残差。 info
列是为了反映我在这个数据框中有额外的列需要保留,但在剂量反应分析中并不重要。
我首先使用函数和嵌套数据框创建模型:
dr_s<-function(df){drc::drm(data=df, prod~log(livp1), fct=drc::LL.3())}
dat_mods<-
dat_s%>%
group_by(type, ref)%>%
nest() %>%
mutate(dr_mod=map(data, dr_s))
这可以创建模型并将它们放入数据框中。要将 add_predictions
与 drm
类型的模型一起使用,输入必须是 data.frame
(而不是 tibble
)。当我尝试为每个 livp1
变量添加预测时(根据下面的评论):
dat_mods%>%
mutate(mod_preds=map2(data, dr_mod, ~add_predictions(data=as.data.frame(.x), model=.y))))
我收到 non-numeric argument to binary operator
错误消息。当 info
列不是 character
class 时,此代码工作正常。但是,我需要将此信息与预测数据一起保留,并希望尽可能避免将其从数据框中拉出。
感谢任何指导!
这个非常愚蠢,class drm
模型的 predict
方法不适用于 class tibble
的对象。所以你必须将 .x
转换为 data.frame
.
dat_s%>%
group_by(type, ref)%>%
nest() %>%
mutate(dr_mod=map(data, dr_s),
mod_preds=map2(data, dr_mod,
~modelr::add_predictions(data = as.data.frame(.x[,"livp1"]),
model = .y)))
## A tibble: 9 x 5
## Groups: type, ref [9]
# type ref data dr_mod mod_preds
# <chr> <chr> <list> <list> <list>
#1 A ref3 <tibble [2 × 4]> <drc> <df[,2] [2 × 2]>
#2 A ref1 <tibble [2 × 4]> <drc> <df[,2] [2 × 2]>
#3 A ref2 <tibble [5 × 4]> <drc> <df[,2] [5 × 2]>
#4 B ref2 <tibble [4 × 4]> <drc> <df[,2] [4 × 2]>
#5 B ref1 <tibble [2 × 4]> <drc> <df[,2] [2 × 2]>
#6 B ref3 <tibble [2 × 4]> <drc> <df[,2] [2 × 2]>
#7 C ref3 <tibble [3 × 4]> <drc> <df[,2] [3 × 2]>
#8 C ref2 <tibble [3 × 4]> <drc> <df[,2] [3 × 2]>
#9 C ref1 <tibble [4 × 4]> <drc> <df[,2] [4 × 2]>
我有一个数据集,缩写形式如下所示:
library(tidyverse)
dat_s<-tibble(
type=c(rep("A", 9), rep("B", 8), rep("C", 10)),
ref=c("ref3", "ref3", "ref1", "ref2", "ref2", "ref1", "ref2", "ref2", "ref2", "ref2",
"ref1", "ref2", "ref2", "ref3", "ref2", "ref3", "ref1", "ref3",
"ref2", "ref3", "ref1", "ref1", "ref3", "ref1", "ref1", "ref2", "ref2"),
info=as.character(sample(100, 27)),
liv=c(3.0e-05, 2.9e-07, 2.2e-07, 2.7e-07, 2.6e-06, 4.8e-07, 1.4e-05, 2.6e-06, 7.7e-06, 2.2e-06,
1.5e-07, 1.6e-07, 1.8e-06, 6.1e-08, 4.9e-06, 4.9e-06, 1.8e-06, 1.5e-07,
4.3e-08, 1.8e-06, 1.0e-07, 1.6e-07, 9.7e-07, 1.0e-06, 6.4e-07, 1.2e-07, 5.7e-06),
prod=c(0.00, 2, 3, 4.80, 2.10, 5.10, 0.00, 0.13, 2.00, 0.13, 0.00, 4.10, 4.60, 2.10, 0.26, 0.00,
4.60, 0.00, 4.60, 2.10, 4.80, 0.00, 0.00, 1.80, 3.60, 4.10, 0.00)
)%>%
mutate(livp1=liv+1)
我想为 type
和 ref
的每个组合计算剂量反应关系,进行预测以绘制曲线,并计算残差。 info
列是为了反映我在这个数据框中有额外的列需要保留,但在剂量反应分析中并不重要。
我首先使用函数和嵌套数据框创建模型:
dr_s<-function(df){drc::drm(data=df, prod~log(livp1), fct=drc::LL.3())}
dat_mods<-
dat_s%>%
group_by(type, ref)%>%
nest() %>%
mutate(dr_mod=map(data, dr_s))
这可以创建模型并将它们放入数据框中。要将 add_predictions
与 drm
类型的模型一起使用,输入必须是 data.frame
(而不是 tibble
)。当我尝试为每个 livp1
变量添加预测时(根据下面的评论):
dat_mods%>%
mutate(mod_preds=map2(data, dr_mod, ~add_predictions(data=as.data.frame(.x), model=.y))))
我收到 non-numeric argument to binary operator
错误消息。当 info
列不是 character
class 时,此代码工作正常。但是,我需要将此信息与预测数据一起保留,并希望尽可能避免将其从数据框中拉出。
感谢任何指导!
这个非常愚蠢,class drm
模型的 predict
方法不适用于 class tibble
的对象。所以你必须将 .x
转换为 data.frame
.
dat_s%>%
group_by(type, ref)%>%
nest() %>%
mutate(dr_mod=map(data, dr_s),
mod_preds=map2(data, dr_mod,
~modelr::add_predictions(data = as.data.frame(.x[,"livp1"]),
model = .y)))
## A tibble: 9 x 5
## Groups: type, ref [9]
# type ref data dr_mod mod_preds
# <chr> <chr> <list> <list> <list>
#1 A ref3 <tibble [2 × 4]> <drc> <df[,2] [2 × 2]>
#2 A ref1 <tibble [2 × 4]> <drc> <df[,2] [2 × 2]>
#3 A ref2 <tibble [5 × 4]> <drc> <df[,2] [5 × 2]>
#4 B ref2 <tibble [4 × 4]> <drc> <df[,2] [4 × 2]>
#5 B ref1 <tibble [2 × 4]> <drc> <df[,2] [2 × 2]>
#6 B ref3 <tibble [2 × 4]> <drc> <df[,2] [2 × 2]>
#7 C ref3 <tibble [3 × 4]> <drc> <df[,2] [3 × 2]>
#8 C ref2 <tibble [3 × 4]> <drc> <df[,2] [3 × 2]>
#9 C ref1 <tibble [4 × 4]> <drc> <df[,2] [4 × 2]>