Ошибка при запуске nlsLM, но работает для nls - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь использовать nlsLM для соответствия экспериментальным данным. Но в этом примере я использую аналитические данные из другой программы, чтобы знать правильные значения. Я пытаюсь использовать nls2, чтобы дать мне отправные точки, которые я могу использовать при использовании nlsLM. Мне удалось сделать это с менее сложной функцией, но она не работает с более сложной функцией. Я получаю значения для nls2, но когда я использую nlsLM, я получаю сообщение об ошибке: «оценка функции fn возвращает бессмысленное значение». , что я не могу понять, потому что я использую значения coef из nls2 или фактические значения параметров, которые я ищу.

Ниже я создал образцы данных для времени и x, так что, надеюсь, они будут воспроизводимы для кого-то другого. У меня есть результаты из другой программы, поэтому приведенные ниже вычисления для Y_ex были использованы для проверки правильности настройки функции и соответствия этим результатам. Они используются в регрессионном анализе для этого примера. (Я новичок в r, извините за мой неэффективный код!).

library(nls2)
library(minpack.lm)

## Generate sample data for time and x
time_ex <- seq(from = 0, to = 50, by = 0.02)
strain_ex1 <- time_ex[1:326]*0.0011
strain_ex2 <- time_ex[327:2501]*0+0.0011*6.5
strain_ex <- c(strain_ex1,strain_ex2)
plot(time_ex,strain_ex)
x <- strain_ex 
t <- time_ex

## Generate results with known parameters (eventually use to check results from nls)
Y_ex = c()
K <- 770 #coef(fit1)[1]       # ** Paramter 1 for NLS **
TAU <-  4.5 # coef(fit1)[2]   # ** Paramter 2 for NLS **
dt <- 0.02

for(i in seq(from=1, to=2501, by=1)){
  if (i == 1) {
    yO_ex = 0
    dx_ex = 0
  } else {
    yO_ex = yT_ex
    dx_ex = x[i] - x[i-1] 
  }
  yT_ex = exp(-0.02/TAU)*yO_ex + (K/2) * (1 + exp(-0.02/TAU))*dx_ex
  Y_ex = c(Y_ex,yT_ex)
}

plot(x,Y_ex)
plot(time_ex,Y_ex)

df <- data.frame(t = t, x =  x , y = Y_ex)

Я подбираю параметры k и tau, используя nls. Поскольку мне известны фактические значения для этого примера, я попытался использовать близкие значения в качестве начальных значений. Я попытался использовать их в качестве начальных значений для nlsLM и получил ту же ошибку.

### Define Function for Nonlinear Regression Analysis
Func1 <- function(t, x, k, tau){ 
  for(i in seq(from=1, to=2501, by=1)){
    if (i == 1) {    
      yO = 0 
      dx = 0
      dt = 0
    } else {
      yO = yT       
      dx = x[i] - x[i-1]
      dt = t[i] - t[i-1]
    }
    yT <- exp(-dt/tau)*yO + (k/2) * (1 + exp(-dt/tau))*dx
  } 
return(yT)
}

### Nonlinear Regression Analysis 1
# Start parameters
grd <- data.frame(k=c(0,770),
                  tau=c(0,4.4)
)
## perform nls
set.seed(123)
fit1 <- nls2(
  y ~ Func1(t, x, k, tau),
  data = df,
  start = grd,
  algorithm ="random" 
)
coef(fit1)

## nlsLM with coeff from nls2
fit2 <- nlsLM(
  y ~ Func1(t, x, k, tau),
  data =  df, 
  start = coef(fit1) 
)

Вот где я получаю свою ошибку: «Ошибка в nls.lm (par = start, fn = FCT, ja c = ja c, control = control, lower = lower,: оценка функции fn возвращает нечувствительное значение! "

Эта ошибка сбила меня с толку, так как я использую параметры из nls2 в качестве выходных. Если я использую фактические известные значения в качестве начальных значений (полностью пропуская nls2), я получаю ту же ошибку.

Есть ли причина, по которой nls2 дает ответ, а nlsLM дает Ошибка? Я попытался переопределить функцию после запуска nls2 на случай, если он ее не понял, и это тоже не помогло.

Пожалуйста, дайте мне знать, если вам нужно что-то уточнить. Любая помощь приветствуется!

Обновление:

После добавления return в функцию я получаю следующую ошибку после запуска nlsLM * Ошибка в qr (.swts * attr (rhs, "gradient ")): dims [product 2] не совпадают h длина объекта [2501] Дополнительно: Предупреждение: В .swts * attr (rhs, "gradient"): более длинная длина объекта не кратна более короткой длине объекта *

Я все еще получаю результаты для бно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...