【问题标题】:How to integrate (AUC) nls model and Monte-Carlo confidence interval in R如何在 R 中集成(AUC)nls 模型和蒙特卡罗置信区间
【发布时间】:2019-07-07 21:09:35
【问题描述】:

我正在尝试在 R 中将一个非线性函数(来自nls())从 x= 0 积分(解析下区域)到无穷大。但是,R 的积分函数需要一个函数(f)。

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

integrate(my.nls, lower = 0L, upper = Inf)

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

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

我对 R 比较陌生,我认为这只是我关于 SO 的第二篇文章,所以如果这是一个微不足道或愚蠢的问题,或者我犯了其他罪,请原谅我。到目前为止,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,外推中的小偏差会解决曲线下一些非常不同的值。

【问题讨论】:

    标签: r confidence-interval numerical-integration nls non-linear-regression


    【解决方案1】:

    主要问题确实是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 以不使用蒙特卡洛,因为这需要更长的时间,但您当然可以调整参数(例如,蒙特卡洛迭代次数nsim)。

    【讨论】:

    • 非常有用,应该很容易适应我的“真实”问题。在我的实验中,我很接近从 predict 定义一个函数,但语法不太正确。谢谢!
    猜你喜欢
    • 2020-05-18
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多