我正在尝试将非线性函数(从nls()
)中的非线性函数(从f
解析)整合到R中的x = 0到无穷大。但是,R的积分函数需要函数(integrate(my.nls, lower = 0L, upper = Inf)
)。
简而言之,我想做一些近似的事情:
my.nls
但不幸的是,predictNLS
实际上是一个拟合的模型对象,而不是一个函数。我考虑使用平滑样条线进行插值,然后对结果函数进行积分。但我更喜欢使用真正的nls函数而不是近似值。此外,鉴于整合的无限性,我必须非常小心地在正方向上进行外推。
如果可能,理想的技术是能够整合nls和其他函数的结果,例如,根据传播包的as.function
函数计算的模拟97.5%置信区间下的面积。
我对R很陌生,这只是我在SO上的第二篇文章,我想,所以请原谅我,如果这是一个微不足道或愚蠢的问题,或者我犯下了其他一些罪。到目前为止,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)
的不当使用并没有让我到任何地方,我将非常感谢任何帮助。
以下是一个简短的示例,可用于说明我的问题:
integrate
PS:我认识到最后两行中的语法是非常错误的,我只是试图表明如果单独计算函数所代表的值将来自何处。如果对我所得到的内容有任何疑问,请询问,我会尝试重新解释我的问题。
PPS:我很可能完全是从错误的方向开始的(虽然我必须适合的模型类型是真实的,非线性的[不像上面说明的那样],我想得到下面的区域平均函数及其置信区间在某种程度上),如果您对其他方法有任何建议,也欢迎这些。我对样条函数的问题在于,我的真模型渐近,因为它们接近y = 0,并且考虑到我要进入Inf,外推中的小像差会解决曲线下的一些非常不同的值。
主要问题确实是integrate(function(p)
predict(my.nls, data.frame(x = p)),
lower = 0, upper = 10)
# 102.0578 with absolute error < 1.1e-12
需要一个功能,这不是你试图提供的功能。另一个问题,至少在这个例子中,是积分在上升到Inf时是不同的。
限制注意[0,10],对于我们的第一种情况
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
添加为不使用蒙特卡罗,因为这需要更长的时间,但您当然可以调整参数(例如,蒙特卡罗迭代次数qazxswpoi)。