【发布时间】: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