如何在R中集成(AUC)nls模型和蒙特卡罗置信区间

如何在R中集成(AUC)nls模型和蒙特卡罗置信区间,r,confidence-interval,numerical-integration,nls,non-linear-regression,R,Confidence Interval,Numerical Integration,Nls,Non Linear Regression,我试图将非线性函数(从nls())从x=0到R中的无穷大进行积分(解析下的区域)。但是,R的积分函数调用函数(f) 简而言之,我想做一些近似的事情: integrate(my.nls, lower = 0L, upper = Inf) 但不幸的是,my.nls实际上是一个合适的模型对象,而不是一个函数。 我考虑使用平滑样条插值,然后对结果函数进行积分。但我更喜欢使用真正的nls函数,而不是近似值。此外,考虑到积分的无限性,我必须非常小心正向外推 如果可能,理想的技术是能够整合nls和其他函数的

我试图将非线性函数(从
nls()
)从x=0到R中的无穷大进行积分(解析下的区域)。但是,R的积分函数调用函数(
f

简而言之,我想做一些近似的事情:

integrate(my.nls, lower = 0L, upper = Inf)
但不幸的是,
my.nls
实际上是一个合适的模型对象,而不是一个函数。 我考虑使用平滑样条插值,然后对结果函数进行积分。但我更喜欢使用真正的nls函数,而不是近似值。此外,考虑到积分的无限性,我必须非常小心正向外推

如果可能,理想的技术是能够整合nls和其他函数的结果,例如,根据传播包的
predictNLS
函数计算的模拟97.5%置信区间下的面积

我对R比较陌生,这只是我的第二篇文章,所以,我想,如果这是一个琐碎或愚蠢的问题,或者我犯了其他罪,请原谅我。到目前为止,
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)
####组成一些数据

x主要的问题确实是
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
集成(函数(p)
预测(my.nls,data.frame(x=p)),
下=0,上=10)
#102.0578,绝对误差<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
集成(函数(p)
predictNLS(my.nls,newdata=data.frame(x=p),do.sim=FALSE)$summary$`Prop.97.5%`,
下=0,上=10)
#113.9549,绝对误差<1.7e-06

其中,我还添加了
do.sim=FALSE
以避免使用蒙特卡罗,因为这需要花费较长的时间,但您当然可以调整参数(例如,蒙特卡罗迭代次数
nsim
)。

非常有用,应该很容易适应我的“真实”问题。在我的实验中,我差点就从predict定义了一个函数,但语法不太正确。谢谢!