使用 predictNLS 围绕 R 中的拟合值创建置信区间?
Using predictNLS to create confidence intervals around fitted values in R?
我想使用 R 中传播包中的 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 似乎提供的置信区间数据,方法是给它相同的数据并要求它为 predicted_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
有谁知道这可能是什么原因造成的?我知道对于你们中的一些人来说,它调用的对象是什么似乎很明显,所以如果这是一个荒谬的问题,我深表歉意。我真的希望能够使用此函数围绕一系列拟合值创建置信区间。非常感谢您。
由于您在样本数据集中的每个 Run
上 运行ning 一个 nls
,因此通过拆分每个 [=38= 很容易获得 nls 模型列表] 到它自己的数据帧中,并使用 lapply
在每个数据帧上 运行ning nls
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))
现在我们可以通过 运行ning 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()
我想使用 R 中传播包中的 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 似乎提供的置信区间数据,方法是给它相同的数据并要求它为 predicted_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
有谁知道这可能是什么原因造成的?我知道对于你们中的一些人来说,它调用的对象是什么似乎很明显,所以如果这是一个荒谬的问题,我深表歉意。我真的希望能够使用此函数围绕一系列拟合值创建置信区间。非常感谢您。
由于您在样本数据集中的每个 Run
上 运行ning 一个 nls
,因此通过拆分每个 [=38= 很容易获得 nls 模型列表] 到它自己的数据帧中,并使用 lapply
nls
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))
现在我们可以通过 运行ning 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()