функция подгонки ошибок к данным с использованием 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)

он показывает мне следующую ошибку:

Ошибка в f(x,...): объект 'l' не найден

Разве весь смысл nls() не в том, чтобы подставить разные значения для параметров l и r из пространства параметров, чтобы подогнать функцию за счет минимизации SSR и дать оценки параметров? почему для работы ему нужно значение l? Я определенно пропускаю что-то большое здесь. Пожалуйста помоги!

Заранее спасибо!


person VitalSigns    schedule 19.07.2016    source источник


Ответы (1)


Вы должны передать параметры 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
person Zheyuan Li    schedule 20.07.2016
comment
Привет, спасибо за помощь! вы в значительной степени ответили на большинство моих проблем, связанных с r. из любопытства, могу я узнать, чем вы занимаетесь? - person VitalSigns; 20.07.2016
comment
О, это захватывающе! Сейчас я медленно погружаюсь в мир статистики и нахожу это довольно запутанным. Желаю вам удачи в написании дипломной работы от человека, который недавно сам прошел через самое скучное задание в мире! :) - person VitalSigns; 20.07.2016
comment
Эй, у меня был еще один запрос, который я разместил как вопрос. Это связано с MLE и использованием оптимизации для оценки параметров. Если у вас есть время и вы достаточно взволнованы, чтобы изучить проблему, найдите ее здесь - stackoverflow.com/q/38486139/6533048 Надеюсь, я не навязываюсь. - person VitalSigns; 20.07.2016