如何在 R 中集成 (AUC) nls 模型和蒙特卡洛置信区间
How to integrate (AUC) nls model and Monte-Carlo confidence interval in R
我正在尝试对 R 中从 x= 0 到无穷大的非线性函数(从 nls()
)进行积分(求解面积)。但是,R 的积分函数调用函数 (f
).
简而言之,我想做一些近似的事情:
integrate(my.nls, lower = 0L, upper = Inf)
但不幸的是,my.nls
实际上是一个拟合模型对象,而不是一个函数。
我考虑过使用平滑样条进行插值,然后对结果函数进行积分。但我更愿意使用真正的 nls 函数而不是近似值。此外,鉴于积分的无限性,我必须非常小心地进行正向外推。
如果可能,理想的技术是能够整合 nls 和其他函数的结果,例如,根据传播包 predictNLS
函数。
我是 R 的新手,这只是我第二次 post 我想,如果这是一个微不足道或愚蠢的问题,或者我犯了其他错误,请原谅我。到目前为止,as.function
或 function(){predict(my.nls()}
的不当使用并没有让我得到任何帮助,我将不胜感激任何帮助。
下面是一个简短的例子,可以用来说明我的问题:
### Make up some data
x <- seq(from = 10, to = 1, length.out = 15)+(rnorm(15)+2)
y <- seq(from = 1, to = 10, length.out = 15)+(rnorm(15)+2)
### Fit an nls model, in this case, just a plain linear one.
my.nls <- nls(y~m*x+b, start = c(m=-1, b=100))
### Get confidence intervals from propagate package, might take a couple
#seconds to run. Only serves to illustrate the type of values, the
#function of which, I'd like to integrate (see my.preds$summary)
library(propagate)
my.preds <- predictNLS(my.nls, newdata = data.frame("x" = x))
### Integrate (totally not right, just (hopefully) illustrating
#the idea of what I'd like to do)
#exact.fn.auc <- integrate(my.nls, lower = 0L, upper = Inf)
#upperCI.fn.auc <- integrate(predictNLS(my.nls)$summary$Sim.97.5%, lower = 0L, upper = Inf)
PS:我认识到最后两行中的语法非常错误,我只是想说明如果单独计算函数所表示的值来自何处。如果对我的意思有任何疑问,请提问,我会尝试重新表述我的问题。
PPS:很可能我完全是从错误的方向开始的(尽管我必须拟合的模型类型实际上是非线性的[与上面所示的不同],我想以某种方式获得均值函数下方的区域及其置信区间),如果您对其他方法有任何建议,也欢迎提出。我对样条曲线的问题是,当它们接近 y = 0 时,我的真实模型会逐渐渐近,并且假设我要去 Inf,外推中的小偏差解决了曲线下一些非常不同的值。
主要问题确实是 integrate
需要一个函数,而这不是您试图提供的。至少在这个例子中,另一个问题是积分在上升到 Inf.
时是发散的
将注意力限制在 [0, 10],对于第一种情况,我们有
integrate(function(p)
predict(my.nls, data.frame(x = p)),
lower = 0, upper = 10)
# 102.0578 with absolute error < 1.1e-12
在第二个
integrate(function(p)
predictNLS(my.nls, newdata = data.frame(x = p), do.sim = FALSE)$summary$`Prop.97.5%`,
lower = 0, upper = 10)
# 113.9549 with absolute error < 1.7e-06
我还添加了 do.sim = FALSE
不使用 Monte Carlo 因为这需要更长的时间,但是您当然可以调整参数(例如 Monte Carlo 的数量迭代 nsim
).
我正在尝试对 R 中从 x= 0 到无穷大的非线性函数(从 nls()
)进行积分(求解面积)。但是,R 的积分函数调用函数 (f
).
简而言之,我想做一些近似的事情:
integrate(my.nls, lower = 0L, upper = Inf)
但不幸的是,my.nls
实际上是一个拟合模型对象,而不是一个函数。
我考虑过使用平滑样条进行插值,然后对结果函数进行积分。但我更愿意使用真正的 nls 函数而不是近似值。此外,鉴于积分的无限性,我必须非常小心地进行正向外推。
如果可能,理想的技术是能够整合 nls 和其他函数的结果,例如,根据传播包 predictNLS
函数。
我是 R 的新手,这只是我第二次 post 我想,如果这是一个微不足道或愚蠢的问题,或者我犯了其他错误,请原谅我。到目前为止,as.function
或 function(){predict(my.nls()}
的不当使用并没有让我得到任何帮助,我将不胜感激任何帮助。
下面是一个简短的例子,可以用来说明我的问题:
### Make up some data
x <- seq(from = 10, to = 1, length.out = 15)+(rnorm(15)+2)
y <- seq(from = 1, to = 10, length.out = 15)+(rnorm(15)+2)
### Fit an nls model, in this case, just a plain linear one.
my.nls <- nls(y~m*x+b, start = c(m=-1, b=100))
### Get confidence intervals from propagate package, might take a couple
#seconds to run. Only serves to illustrate the type of values, the
#function of which, I'd like to integrate (see my.preds$summary)
library(propagate)
my.preds <- predictNLS(my.nls, newdata = data.frame("x" = x))
### Integrate (totally not right, just (hopefully) illustrating
#the idea of what I'd like to do)
#exact.fn.auc <- integrate(my.nls, lower = 0L, upper = Inf)
#upperCI.fn.auc <- integrate(predictNLS(my.nls)$summary$Sim.97.5%, lower = 0L, upper = Inf)
PS:我认识到最后两行中的语法非常错误,我只是想说明如果单独计算函数所表示的值来自何处。如果对我的意思有任何疑问,请提问,我会尝试重新表述我的问题。
PPS:很可能我完全是从错误的方向开始的(尽管我必须拟合的模型类型实际上是非线性的[与上面所示的不同],我想以某种方式获得均值函数下方的区域及其置信区间),如果您对其他方法有任何建议,也欢迎提出。我对样条曲线的问题是,当它们接近 y = 0 时,我的真实模型会逐渐渐近,并且假设我要去 Inf,外推中的小偏差解决了曲线下一些非常不同的值。
主要问题确实是 integrate
需要一个函数,而这不是您试图提供的。至少在这个例子中,另一个问题是积分在上升到 Inf.
将注意力限制在 [0, 10],对于第一种情况,我们有
integrate(function(p)
predict(my.nls, data.frame(x = p)),
lower = 0, upper = 10)
# 102.0578 with absolute error < 1.1e-12
在第二个
integrate(function(p)
predictNLS(my.nls, newdata = data.frame(x = p), do.sim = FALSE)$summary$`Prop.97.5%`,
lower = 0, upper = 10)
# 113.9549 with absolute error < 1.7e-06
我还添加了 do.sim = FALSE
不使用 Monte Carlo 因为这需要更长的时间,但是您当然可以调整参数(例如 Monte Carlo 的数量迭代 nsim
).