Что вызывает неправильные входные параметры при использовании nlsLM из minpack.lm? - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь подогнать нелинейную кривую к трем точкам данных. Позже мне нужно будет интегрировать этот фрагмент в более крупное программное обеспечение, которое попыталось бы автоматически подогнать кривую к этим трем точкам. Как видно ниже, я пытаюсь оценить кривую в виде a*x^power1 + b*x^power2. Я знаю, что следующая функция удовлетворяет условию 0.666*x^(-0.18) - 0.016*x^0.36. Однако я по какой-то причине вообще не могу воспроизвести его, используя nlsLM() из minpack.lm. Независимо от того, какую комбинацию я пытаюсь добавить в параметре start, я получаю одно и то же предупреждающее сообщение Warning message: In nls.lm(par = start, fn = FCT, jac = jac, control = control, lower = lower, : lmdif: info = 0. Improper input parameters.

. И хотя это «только» предупреждающее сообщение, оно кажется полностьюиспортить мой код. Из-за неправильных входных параметров моя переменная m, которой я передаю результаты, повреждается, и после этого ничего не работает, включая переменную m.

Вот воспроизводимый пример:

library(ggplot2)
library(minpack.lm)

dataset <- read.table(text='
                      x   y
                      1   0.1 1
                      2   30 0.3
                      3  1000 0', header=T)

ds <- data.frame(dataset)
str(ds)
plot(ds, main = "bla")
nlmInitial <- c(a = 0.5, power1 = -0.2, b = -0.02, power2 = 0.3)
m <- nlsLM(y ~ a*I(x^power1) + b*I(x^power2), 
           data = ds, 
           start = nlmInitial, 
           trace = T)
summary(m)$coefficients

1 Ответ

1 голос
/ 30 сентября 2019

Вы хотите оценить по многим коэффициентам с меньшим количеством наблюдений. Вы говорите, что 0.666*x^(-0.18) - 0.016*x^0.36 будет решением. R приходит к:

m <- nlsLM(y ~ 0.666*I(x^power1) + b*I(x^power2), data = ds, trace = T
           , start = c(power1 = -0.2, b = -0.02, power2 = 0.3))

0.666*x^(-0.18053) - 0.01975*x^0.32879. Но также

m <- nlsLM(y ~ 0.7*I(x^power1) + b*I(x^power2), data = ds, trace = T
           , start = c(power1 = -0.2, b = -0.02, power2 = 0.3))

0.7*x^(-0.16599) - 0.04428*x^0.23363 будет решением.

Таким образом, вам нужно либо увеличить количество наблюдений, либо уменьшить количество коэффициентов для оценки.

...