R nls(); Ошибка в nlsModel: сингулярная градиентная матрица при начальных оценках параметров

#r #nls

#r #nls

Вопрос:

Я получаю ошибку от функции nls в R. Я ищу несколько похожих вопросов, но не решаю эту проблему. Например, я пытаюсь использовать nlsLM из библиотеки ‘minpack.lm’, это также не удается. Поэтому я должен обратиться за помощью здесь. Ниже приведен код:

 tt = c(10, 30, 50, 90, 180, 360, 720, 1440, 2880, 4320, 8640, 12960)
x = c(
  1.53901e-06,
  1.22765e-06,
  1.11200e-06,
  9.25185e-07,
  8.71809e-07,
  8.80705e-07,
  8.36225e-07,
  7.82849e-07,
  8.18433e-07,
  6.04928e-07,
  3.46944e-07,
  4.44800e-07
)
y = c(
  3.81639e-06,
  5.00623e-06,
  4.62815e-06,
  5.10631e-06,
  4.48359e-06,
  3.30487e-06,
  2.64879e-06,
  2.13727e-06,
  8.02865e-07,
  1.91487e-06,
  3.73855e-06,
  2.32631e-06
)

nt = length(tt)
L0 = 0.005
y0 = 0.000267681

model = function(K, Kd, k1) {
  
  eta = 5 / (4 * Kd   40)
  eta1 = 1 - eta
  eta1_seq = eta1 ^ c(0:(nt - 1))
  Lt = L0 * eta * cumsum(eta1_seq)
  
  b = K * x - K * Lt   1
  L = (-b   sqrt(b ^ 2.0   4 * K * Lt)) / (2 * K)
  
  cx = x * K * L / (K * L   1)
  qx = Kd * cx
  
  q1 = y0 * (1 - k1 * sqrt(tt))
  
  y = qx   q1
  
  return(y)
  
}

fit <- nls(
  y ~ model(K, Kd, k1),
  start = list(K = 1e 15,
               Kd = 10,
               k1 = 1e-5),
  lower = c(1e 13, 1, 1e-10),
  upper = c(1e 20, 200, 1e-3),
  algorithm = "port"
)
  

Заранее спасибо за вашу помощь!

Комментарии:

1. Вам нужны лучшие начальные значения (будут работать, только если ваши данные вообще поддерживают модель).

2. Трудно определить начальные значения. Я выбираю 3000 строк значений и выбираю значение с минимальной ошибкой в качестве начальных значений, но я все равно получаю ту же ошибку.

3. alpha В вашем model и в start этом ничего не делает. Везде градиент равен 0, поэтому выдается ошибка. Если вы удалите ее и установите K = 1e3 в качестве начального значения, по крайней мере, модель подходит.

4. Начальное значение K слишком мало для реальной проблемы. Я редактирую код с нижним и верхним пределами.

5. попробуйте plot(y ~ tt); lines(yy ~ tt, col = "red") использовать различные комбинации параметров с подобранными значениями, где yy — это подобранные значения из определенного набора параметров. Если вы не можете найти какие-либо наборы параметров, подогнанные значения yy выглядят разумно, тогда может не быть значения параметров, которые представляют ваши данные. Кроме того, практически все алгоритмы нелинейной оптимизации требуют, чтобы параметры были одинакового порядка величины, поэтому вам нужно будет масштабировать свои параметры для достижения этого, если на первом шаге вы смогли найти несколько разумных комбинаций.