r - 使用 predictNLS 在 R 中的拟合值周围创建置信区间?

标签 r dplyr nls modelr

我想使用 R 中 propogate 包中的 predictNLS 围绕大量拟合值构建置信区间。作为示例,我将使用它们在函数描述 ( https://rdrr.io/github/anspiess/propagate/man/predictNLS.html )、DNase 中引用的数据集,并构建模型将值 conc 和 density 作为特征:

library(propogate)
library(dplyr)
library(modelr)

DNase <- DNase

modeldna <- DNase %>% group_by(Run) %>% 
  do(run_model = nls(density ~ a * exp(b * conc), 
start = list(a = 1 , b = 0.5), 
data = .)) %>% ungroup()

然后我想给每一行分配它的模型,以便可以添加预测:
DNApredict <- full_join(as_tibble(DNase), modeldna, by = "Run")
加入预测:
DNApredict <- DNApredict %>% 
  group_by(Run) %>% 
  do(add_predictions(., var = "predicted_density", first(.$run_model)))
然后,我想添加 predictNLS 似乎提供的置信区间数据,方法是为其提供相同的数据并要求它为 predict_density 列中的每个拟合点提供置信区间:
confidence_interval <- predictNLS(model = modeldna, newdata = DNApredict$predicted_density, interval = "confidence")
但是,出现以下错误:

Error in as.list(object$call$formula) : argument "object" is missing, with no default


有谁知道这可能是什么原因造成的?我知道对于你们中的一些人来说,它所调用的对象是什么似乎很明显,所以如果这是一个荒谬的问题,我深表歉意。我真的希望能够使用这个函数来围绕一系列拟合值创建置信区间。非常感谢您提前。

最佳答案

由于您正在运行 nls在每个 Run在示例数据集中,通过将每次运行拆分为自己的数据框并运行 nls 很容易获得 nls 模型列表。在每个数据帧上使用 lapply

library(propagate)

DNase <- DNase

modeldna <- DNase %>% split(DNase$Run)

models <- lapply(modeldna, function(d) nls(density ~ a * exp(b * conc), 
                                           start = list(a = 1 , b = 0.5), 
                                           data = d))
现在我们可以通过运行 predictNLS 一样轻松地获得每个模型中每个点的预测。在每个模型上(再次在 lapply 内)
results <- lapply(seq_along(modeldna), function(i) {
 predictNLS(models[[i]], newdata = data.frame(conc = modeldna[[i]]$conc))
})
因为predictNLS的输出结构,我们需要提取每一行的预测并将它们强制转换为数据框:
predictions <- lapply(results, function(x) {
  as.data.frame(do.call(rbind, lapply(x$prop, function(y) y$prop)))})
最后,我们可以将我们的预测(包括置信区间)贴回到原始数据框上:
all_results <- do.call(rbind, lapply(seq_along(modeldna), 
                      function(i) cbind(modeldna[[i]], predictions[[i]])))
这现在为我们提供了原始数据点的完整数据框,以及具有置信区间的相关预测。
为了显示这一点,我们可以在 ggplot 中绘制结果。 .在这里,我们为每次运行显示一个图,包括其原始数据、预测值作为虚线以及 95% 置信限作为淡蓝色丝带:
library(ggplot2)

ggplot(all_results, aes(x = conc, y = density)) +
  geom_ribbon(aes(ymin = `2.5%`, ymax = `97.5%`), 
              fill = "deepskyblue4", alpha = 0.2) +
  geom_point() +
  geom_line(aes(y = Mean.1), linetype = 2) +
  facet_wrap(.~factor(Run, levels = 1:11)) +
  theme_bw()
enter image description here

关于r - 使用 predictNLS 在 R 中的拟合值周围创建置信区间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66620891/

相关文章:

r - 将 mob() 树(partykit 包)与 nls() 模型一起使用

r - 如何使用map函数在r中循环多个自变量

r - 带有 if/else 函数的 mutate()

R通过快捷方式读取RDS文件

从 boxplot 和 plotly 中删除异常值

r - 在另一列中的特定值之前和之后标记观察

r - 如何在 R 中使用季节性虚拟变量运行指数 nls?

r - 2条曲线同时非线性回归

r - 如何在 R 中将绘图保存为黑白(无灰色像素)图像?

r - ggmap mapdist 函数重复计算某些 O-D 对