使用 nls 对数据进行错误拟合函数
error fitting function to data using nls
我在使用 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)
它向我显示以下错误:
Error in f(x, ...) : object 'l' not found
nls()
的全部意义不是用参数 space 中的参数 l
和 r
的不同值来替换参数 space 以通过最小化 [=34 来拟合函数=]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
})
}
我会生成一些数据来测试:
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
我在使用 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)
它向我显示以下错误:
Error in f(x, ...) : object 'l' not found
nls()
的全部意义不是用参数 space 中的参数 l
和 r
的不同值来替换参数 space 以通过最小化 [=34 来拟合函数=]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
})
}
我会生成一些数据来测试:
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