Подгонка модели с помощью nls.lm в R, ошибка: неиспользуемый аргумент

Я пытаюсь использовать функцию nls.lm в файле minpack.lm, чтобы подогнать нелинейную модель к некоторым данным психофизического эксперимента.

Я провел поиск и не смог найти много информации о пакете, поэтому по существу скопировал формат примера, приведенного на странице справки nls.lm. К сожалению, мой скрипт все еще не запускается, и R выдает эту ошибку:

Error in fn(par, ...) : 
unused argument (observed = c(0.1429, 0.2857, 0.375, 0.3846, 0.4667, 0.6154))

Похоже, скрипт считает, что данные, которые я хочу подогнать под модель, не имеют значения, что определенно неверно.

Я ожидаю, что он будет соответствовать модели и даст значение 0,5403 для запасного параметра (w).

Любая помощь приветствуется. Я делаю перенос с Matlab на R, поэтому прошу прощения, если мой код выглядит неаккуратно.

Вот сценарий.

  install.packages("pracma")
  require(pracma)
  install.packages("minpack.lm")
  require(minpack.lm)

  # Residual function, uses parameter w (e.g. .23) to predict accuracy error at a given ratio [e.g. 2:1]
  residFun=function(w,n) .5 * erfc( abs(n[,1]-n[,2])/ ((sqrt(2)*w) * sqrt( (n[,1]^2) + (n[,2]^2) ) ) )

  # example for residFun
  # calculates an error rate of 2.59%
  a=matrix(c(2,1),1,byrow=TRUE)
  residFun(.23,a)

  # Initial guess for parameter to be fitted (w)
  parStart=list(w=0.2)

  # Recorded accuracies in matrix, 1- gives errors to input into residFun
  # i.e. the y-values I want to fit the model
  Acc=1-(matrix(c(0.8571,0.7143,0.6250,0.6154,0.5333,0.3846),ncol=6))

  # Ratios (converted to proportions) used in testing
  # i.e. the points along the x-axis to fit the above data to
  Ratios=matrix(c(0.3,0.7,0.4,0.6,0.42,0.58,0.45,0.55,0.47,0.53,0.49,0.51),nrow=6,byrow=TRUE)

  # non-linear model fitting, attempting to calculate the value of w using the Levenberg-Marquardt nonlinear least-squares algorithm 
  output=nls.lm(par=parStart,fn=residFun,observed=Acc,n=Ratios)

  # Error message shown after running
  # Error in fn(par, ...) : 
  #   unused argument (observed = c(0.1429, 0.2857, 0.375, 0.3846, 0.4667, 0.6154))

person ash_sak    schedule 01.05.2015    source источник


Ответы (1)


Ошибка означает, что вы передали функции аргумент, которого она не ожидала. ?nls.lm не имеет аргумента observed, поэтому он передается функции, переданной fn, в вашем случае residFun. Однако residFun также не ожидает этого аргумента, отсюда и ошибка. Вам нужно переопределить эту функцию следующим образом:

# Residual function, uses parameter w (e.g. .23) to predict accuracy error at a given ratio [e.g. 2:1]
residFun=function(par,observed, n) {
  w <- par$w
  r <- observed - (.5 * erfc( abs(n[,1]-n[,2])/ ((sqrt(2)*w) * sqrt( (n[,1]^2) + (n[,2]^2) ) ) ))
  return(r)
}

Это дает следующий результат:

> output = nls.lm(par=parStart,fn=residFun,observed=Acc,n=Ratios)
> output
Nonlinear regression via the Levenberg-Marquardt algorithm
parameter estimates: 0.540285874836135 
residual sum-of-squares: 0.02166
reason terminated: Relative error in the sum of squares is at most `ftol'.

Почему это произошло:

Кажется, вас вдохновил этот пример в его документации< /а> :

## residual function
residFun <- function(p, observed, xx) observed - getPred(p,xx)
## starting values for parameters
parStart <- list(a=3,b=-.001, c=1)
## perform fit
nls.out <- nls.lm(par=parStart, fn = residFun, observed = simDNoisy,
xx = x, control = nls.lm.control(nprint=1))

Обратите внимание, что observed здесь является аргументом residFun.

person scoa    schedule 01.05.2015
comment
Ах! Благодарю вас! Я знал, что это будет что-то очевидное. Так это должно работать (по крайней мере, до следующей ошибки)? residFun=function(w,observed, n) observed= .5 * erfc( abs(n[,1]-n[,2])/ ((sqrt(2)*w) * sqrt( (n[,1]^2) + (n[,2]^2) ) ) ) - person ash_sak; 01.05.2015
comment
нет, не получится, потому что observed это не параметр вашей функции, а ее вывод. Я обновил свой ответ функцией, которая работает - person scoa; 01.05.2015
comment
Спасибо, очень признателен. - person ash_sak; 06.05.2015