R 使用nls将函数拟合到数据时出错

R 使用nls将函数拟合到数据时出错,r,regression,nls,non-linear-regression,model-fitting,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 }) } 当我使用nls()时: nls(y ~ funk2(z1$days.post.bm

我在使用
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 }) }
当我使用
nls()
时:

nls(y ~ funk2(z1$days.post.bmt), data= z1, start=list(l=0.02, r=0.002), trace=T)
它向我显示以下错误:

f(x,…)中出错:未找到对象“l”

nls()
用参数空间中的参数
l
r
替换不同的值,通过最小化SSR来拟合函数,并给出参数估计值,这难道不是其全部目的吗?为什么它需要
l
的值才能工作?我肯定错过了一些重要的东西。请帮忙


提前谢谢

必须将参数
l
r
作为
funk1
funk2
的函数参数传递

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
              })
  }

funk1嗨,谢谢你的帮助!你几乎回答了我大部分与r有关的问题。出于好奇,我可以知道你是做什么的吗?哦,太令人兴奋了!我现在正慢慢地进入统计领域,我发现它相当令人困惑。祝你论文写作好运-来自一个最近亲自经历了世界上最无聊任务的人嘿,我有另一个问题,我已经作为一个问题发布了。它与极大似然估计(MLE)以及使用optim来提取参数有关。如果你有时间并且足够兴奋来研究这个问题,请在这里找到它-希望,我不是强加于人。
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