Нелинейная регрессия с вложенными пользовательскими функциями с использованием nls и nlr - PullRequest
0 голосов
/ 15 февраля 2019

Я пытался выполнить нелинейную регрессию, используя пакет fuctions nls и nlr из gnlm, но моя целевая функция имеет много настраиваемых параметров, и ее проще определить, предварительно определив несколько различных уравнений.,Итак, у меня есть данные в ссылке (https://github.com/Shend92/Nonlinear-regression) и следующие уравнения:

#Import data to data.frame called 'DATA'

#Equations:
ws = function (ap,bp,cp,dp,vel) {
         ap*vel+cp*vel^2+dp
}

Fins = function(bs) {
    (X1+X5+bs)/(522.64+bs)
}

alp = function(ap,bp,cp,dp,vel,bs) {
     Fins(bs)*(ws(ap,bp,cp,dp,vel)-Fins(bs))/ws(ap,bp,cp,dp,vel)^2
}

vel.max = function(ep,fp,bs) {
     ep-fp*Fins(bs)
}

del = function(vel,ep,fp,gp,bs) {
     vel*(1-(1-vel.max(ep,fp,bs))*exp(-gp*(vel.max(ep,fp,bs)-vel)))
}
Le = function(hp,L,Ld,bs) {
     L*(1+hp*Fins(bs)*(1-Fins(bs))*Ld/L)
}

E.s = function(ae,be,ce) {
     ae*X1*X2/(100*X1)+be*X1*X3/(100*X1)+ce*(X1*X4)/(100*X1)
}

dens.0 = function(ad,bd,cd){
     ad*X1*X2/(100*X1)+bd*X1*X3/(100*X1)+cd*(X1*X4)/(100*X1)
}

Fb = function(lp,Dmill,L) {
      lp/(pi*Dmill^2*L)
}

dens.b = 8.05

dens.c = function(bs,ad,bd,cd,ae,be,ce,lp,Dmill,L) {
     (Fins(bs)*dens.0(ad,bd,cd)*(1-E.s(ae,be,ce))+Fb(lp,Dmill,L)*
     (dens.b-dens.0(ad,bd,cd))*(1-E.s(ae,be,ce)))/Fins(bs)
}

Pmo.s = function(Dmill,vel,Ld,L,ip,jp,kp) {
     Dmill^ip*(vel*(jp*Ld+L))^kp
} 


##Objective function  
Y.s = function(K,Dmill,vel,Ld,L,ip,jp,kp,bs,ad,bd,cd,ae,be,ce,lp,ap,bp,
                cp,dp,ep,fp,gp,hp) {
     Pmo.s(Dmill,vel,Ld,L,ip,jp,kp)+K*Dmill^2.5*Le(hp,L,Ld,bs)*
     dens.c(bs,ad,bd,cd,ae,be,ce,lp,Dmill,L)*alp(ap,bp,cp,dp,vel,bs)*
     del(vel,ep,fp,gp,bs)
}

Как только все мои уравнения определены (Обратите внимание, что целевая функция Y.s имеет всевключены другие функции, и я проверил, что это окончательное уравнение работает правильно с некоторыми параметрами теста) Я попытался запустить следующий код, чтобы соответствовать всем настраиваемым параметрам (K,Dmill,vel,Ld,L,ip,jp,kp,bs,ad,bd,cd,ae,be,ce,lp,ap,bp,cp,dp,ep,fp,gp,hp)

 nlr.test1 <- nls(Y ~ Y.s(K,Dmill,vel,Ld,L,ip,jp,kp,bs,ad,bd,cd,ae,be,ce,lp,
                          ap,bp,cp,dp,ep,fp,gp,hp),
   start=list(Dmill = 3.526,ap =    2.000,bp =  2.900,cp =  -2.200,
            dp =    -0.500,ep = 0.900,fp =  -0.135,gp = -19.420,
            hp =    12.280,ip = 2.500,jp =  0.600,kp =  0.8,K = 2.000,
            vel =   0.700,bs =  0.187,L  =  15.000,Ld = 3.000,ae =  0.307,
            be =    0.174,ce =  0.279,ad =  3.200,bd =  2.700,
            cd =    2.749,lp=430),
   algorithm = "port", ,lower=list(ap = 0,bp =  0,cp =  -5,dp = -2,ep = 0,
           fp = -5,gp = -100,hp =   0,ip =  0,jp =  0,kp =  0,K =   0,
           Dmill = 1,vel =  0,bs =  0,L  =  8,Ld =  0,ae =  0,be =  0,
           ce = 0,ad =  0,bd =  0,cd =  0,lp=0), upper=list(ap =    5,
           bp = 5,cp =  -1,dp = 0,ep =  2,fp =  0,gp =  0,hp =  20,ip = 5,
           jp = 1,kp =  2,K =   5,Dmill = 5,vel =   2,bs =  5,L  =  20,
           Ld = 8,ae =  1,be =  1,ce =  1,ad =  5,bd =  4,cd =  4,lp=1000), 
           data=DATA)

Запуск этого кода выдает следующее сообщение об ошибке

Error in nlsModel(formula, mf, start, wts, upper) : singular gradient matrix at initial parameter estimates

Насколько я понимаю, эта ошибка говорит о том, что начальные значения не являются хорошими, но я думаю, что это не так, потому что начальные значения кажутсядавать значения Ys, близкие к реальным значениям Y. Поэтому я попробовал другую функцию:

 nlr(Y,mu=Y.s(K,Dmill,vel,Ld,L,ip,jp,kp,bs,ad,bd,cd,ae,be,ce,lp,
                          ap,bp,cp,dp,ep,fp,gp,hp),
   pmu=list(Dmill = 3.526,ap =  2.000,bp =  2.900,cp =  -2.200,
            dp =    -0.500,ep = 0.900,fp =  -0.135,gp = -19.420,
            hp =    12.280,ip = 2.500,jp =  0.600,kp =  0.8,K = 2.000,
            vel =   0.700,bs =  0.187,L  =  15.000,Ld = 3.000,ae =  0.307,
            be =    0.174,ce =  0.279,ad =  3.200,bd =  2.700,
            cd =    2.749,lp=430))

Запуск этого кода дает следующее сообщение об ошибке:

Error in Pmo.s(Dmill, vel, Ld, L, ip, jp, kp) : object 'Dmill' not found

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

Я знаюЭта проблема немного сложна для понимания, поскольку в ней так много параметров и уравнений, но я был бы очень признателен, если бы кто-нибудь хотя бы мог помочь мне, объяснив, почему nlr дает мне ошибку, когда я не нахожу определенные объекты восновная функция.Или, если есть лучшая функция для решения задач нелинейной регрессии.

Заранее большое спасибо!

София

...