【问题标题】:Using predictNLS to create confidence intervals around fitted values in R?使用 predictNLS 围绕 R 中的拟合值创建置信区间?
【发布时间】:2021-03-14 03:44:37
【问题描述】:

我想使用 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")

但是,出现以下错误:

as.list(object$call$formula) 中的错误: 缺少参数“object”,没有默认值

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

【问题讨论】:

  • 我认为您传递给 predictNLS 函数的对象不是它所期望的。第一个变量是 nls 函数返回的直接模型,第二个变量是具有新预测值和与模型相同的列名的数据框。

标签: r dplyr nls modelr


【解决方案1】:

由于您在示例数据集中的每个 Run 上运行 nls,因此通过将每个运行拆分为自己的数据框,并在每个数据上运行 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()

【讨论】:

  • 哇,多么清晰的解释,非常感谢艾伦!只是将 lapply() 作为一个可能的选项进行研究,而您的过程使其更加清晰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 2018-01-16
  • 2020-04-24
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
相关资源
最近更新 更多