使用nls对数据进行误差拟合

时间:2016-07-19 23:26:35

标签: r regression nls non-linear-regression model-fitting

我在使用nls()估算参数时遇到了一些问题。我有一组函数来解释手头的一些数据:

funk1 <- function(a,x) { x^2*exp(-(l*(1-exp(-r*a))/r)) }

funk2 <- function(x) { sapply(x, function (s)
{ integrate(funk1, lower = 0, upper = s, x=s)$value }) }

我正在努力使funk2符合y

y <- sort(runif(100, 0, 10^8))

当我使用nls()时:

nls(y ~ funk2(z1$days.post.bmt), data= z1, start=list(l=0.02, r=0.002), trace=T)

它向我显示以下错误:

  

f(x,...)出错:找不到对象'l'

nls()的重点不是从参数空间替换参数lr的不同值,以通过最小化 SSR 来适应函数给出参数估计?为什么它需要l的价值才能发挥作用?我肯定在这里错过了一些大事。请帮忙!

提前致谢!

1 个答案:

答案 0 :(得分:1)

您必须将参数lr作为funk1funk2的函数参数传递。

funk1 <- function(a,x,l,r) {
  x^2*exp(-(l*(1-exp(-r*a))/r))
  }

funk2 <- function(x,l,r) {
  sapply(x, function (s) {
              integrate(funk1, lower = 0, upper = s, x=s, l=l, r=r)$value
              })
  }

我将生成一些数据进行测试:

z <- data.frame(days.post.bmt = 1:100,
                y = funk2(1:100, l = 1, r = 1) + rpois(100, 1:100))

nls(y ~ funk2(days.post.bmt,l,r), data = z, start = list(l = 0.5, r = 0.5))

#Nonlinear regression model
#  model: y ~ funk2(days.post.bmt, l, r)
#   data: z
#     l      r 
#0.9405 0.9400 
# residual sum-of-squares: 6709

#Number of iterations to convergence: 5 
#Achieved convergence tolerance: 2.354e-07

作为反例,请考虑:

bad_funk1 <- function(a,x) {
  x^2*exp(-(l*(1-exp(-r*a))/r))
  }

bad_funk2 <- function(x) {
  sapply(x, function (s) {
              integrate(funk1, lower = 0, upper = s, x=s)$value
              })
  }

nls(y ~ bad_funk2(days.post.bmt), data = z, start = list(l = 0.5, r = 0.5))
# Error in f(x, ...) (from #2) : argument "l" is missing, with no default