линейная модель для запуска параметров в nls fit - PullRequest
0 голосов
/ 16 февраля 2019

Я читал об использовании журнала в качестве альтернативы для создания линейного уравнения, чтобы можно было извлечь начальные значения для подгонки nls из линейного уравнения в R;Соответственно,

Для уравнения: Y = q / (1 + bDX) ^ (1 / b) где Y и X - мои данные;q, b, D - мои параметры для оценки.Я создал линейную модель:

  X<-1:45
  Y <- c(35326L, 30339L, 23379L, 21877L, 18629L, 17627L, 15691L, 15435L, 
   14205L, 11732L, 10560L, 10592L, 9939L, 7491L, 4928L, 3427L, 8123L, 
   9027L, 8733L, 9599L, 8737L, 9135L, 8548L, 7279L, 8940L, 8459L, 
   8460L, 7700L, 6817L, 7167L, 7089L, 7091L, 7538L, 9206L, 9680L, 
   5876L, 7799L, 8384L, 10586L, 8623L, 7848L, 5534L, 6610L, 6539L, 
   6650L)
lmodel <- coef(lm(log(Y)~X+I(X^2)))   
q0 <- exp(lmodel[1])
D0 <- -lmodel[2]
b0 <- lmodel[3]*2/D0^2 
Start1=list(q=q0,b=b0,D=D0)
theta_hat2 <- nls(y~q*(1+b*D*x)^(-1/b),start=Start1) 

Это дает мне требуемые результаты каждый раз.Однако я хочу привести nls к некоторым другим уравнениям, упомянутым ниже, которые довольно сложны для меня.Если кто-то может помочь мне сделать линейную модель, чтобы соответствовать этим, я был бы очень признателен.

Уравнение 2:

Y=q*(-D+(b/n)*X^n here q,b,D,n are to be estimated.

Уравнение 3:

Y=q*exp⁡(-(X/D)^b here q,b,D are to be estimated.

Уравнение 4:

Y=q*X^((-b) )*exp⁡(D/((1-b) )*(X^(1-b)-1) here q,b,D are to be estimated.

Я прилагаю пример набора данных для этой задачи здесь

1 Ответ

0 голосов
/ 17 февраля 2019

Основная проблема заключается в том, что уравнения (2) и (4) перепараметризованы, поэтому независимо от используемого алгоритма оптимизации будут возникать проблемы.В случае (3) есть синтаксическая ошибка, и нам нужны лучшие начальные значения.Тестовый ввод должен быть включен в вопрос, и мы предоставили его в примечании в конце.

Уравнение (1)

x и y должно быть X и Y.Мы можем использовать алгоритм plinear, чтобы избежать необходимости указывать начальные значения для линейного параметра q, и в этом случае начальные значения 1 для других параметров кажутся достаточными.

fo1 <- Y ~ (1+b*D*X)^(-1/b)
fm1 <- nls(fo1, start = list(D = 1, b = 1), alg = "plinear")

Уравнение (2)

Уравнение (2) является чрезмерно параметризованным, потому что если вы умножите q на произвольное число a и в то же время разделите D и b на правую часть, то это не изменится.Удаляя q, мы отмечаем, что D и b входят линейно, и только n фактически является нелинейным, поэтому мы можем использовать линейный алгоритм, чтобы избежать начальных значений для линейных параметров:

fo2 <- Y ~ cbind(-1,(1/n)*X^n)
fm2 <- nls(fo2, start = list(n = 1), alg = "plinear")

Уравнение (3)

В формуле, приведенной в вопросе, отсутствует правильная круглая скобка.Если мы исправим это, то проблема в том, что нам нужен лучший начальный валус.Сначала попробуйте это с b, установленным в 1, и затем используйте результат как начальные значения для полного уравнения.Снова используйте plinear, чтобы избежать необходимости вводить начальные значения для линейного параметра.

fo3 <- Y ~ exp(-(X/D)^b)
b <- 1
fm <- nls(fo3, start = list(D = 1), alg = "plinear")
fm3 <- nls(fo3, start = list(D = coef(fm)[["D"]], b = 1), alg = "plinear")

Уравнение (4)

Уравнение (4) также сверхпараметризуется, поэтому установите D на 1-bв этом случае exp (D / (1-b)) является константой exp (1), поэтому:

fo4 <- Y ~ X^((-b))* exp(1) * (X^(1-b)-1)
fm4 <- nls(fo4, start = list(b = .5), alg = "plinear")

Сравнить

Мы можем построить различные решения:

plot(Y ~ X, pch = 20)
lines(fitted(fm1) ~ X)
lines(fitted(fm2) ~ X, col = "red")
lines(fitted(fm3) ~ X, col = "blue")
lines(fitted(fm4) ~ X, col = "green")
legend("topright", legend = 1:4, lty = 1,  col = c("black", "red", "blue", "green"))

screenshot

Примечание

Тестовые данные должны содержаться в вопросе самостоятельно, и поскольку они не были предоставлены в этой форме, мы предоставим их здесьвремя:

X <- 1:45
Y <- c(35326L, 30339L, 23379L, 21877L, 18629L, 17627L, 15691L, 15435L, 
14205L, 11732L, 10560L, 10592L, 9939L, 7491L, 4928L, 3427L, 8123L, 
9027L, 8733L, 9599L, 8737L, 9135L, 8548L, 7279L, 8940L, 8459L, 
8460L, 7700L, 6817L, 7167L, 7089L, 7091L, 7538L, 9206L, 9680L, 
5876L, 7799L, 8384L, 10586L, 8623L, 7848L, 5534L, 6610L, 6539L, 
6650L)
...