### 8.2.20 Régression logistique : `logistic_regression`

Les courbes logistiques sont des courbes dont léquation y=y(x) sont solutions d’une équation différentielle de la forme :
y′/y=a*y+b et y0=y(x0) avec a<0 et b>0.
Les solutions sont de la forme : y(x)=C/(1+exp(−α (x−x0−k) avec C=−b/a, α=−b et y0=(−b/a)/(1+exp(−b*k) soit
k=−1/b*(ln(−((a*y0+b)/(a*y0)))) Pour vérifier, on peut taper :

`normal(desolve(y’/y=a*y+b)`

On obtient :

`(-b*exp(-(b*c_0-b*x)))/(a*exp(-(b*c_0-b*x))-1)`

Puis on peut taper :

`normal(desolve([y’/y=a*y+b,y(x0)=y0],y)`

On obtient :

`[(-b*exp(b*x-b*x0+ln(y0/(a*y0+b))))/(a*exp(b*x-b*x0+ln(y0/(a*y0+b)))-1)]`

On a donc : c0=x0−ln(y0/(a*y0+b))/b Donc, en multipliant le numérateur et dénominateur de y(x) par exp(b*c_0−b*x) on a :
y(x)=(−b/(exp(b*c_0−b*x)*a*exp(−(b*c_0−b*x))−1) soit y(x)=−b/(a−exp(b*(x−c0)))=(−b/(a*(1−exp(b*(x−c0))/a))
On a 1/a=−exp(−ln(−a)) car a<0 donc y(x)=(−b/a)*(1/(1+exp(b*(x−c0)−ln(−a))) qui est bien la forme annoncée.

Lorsque on connait les valeurs de f′ en x=x0,x0+1....x0+n, on cherche une fonction logistique y(x) tel que y′(x) approche au mieux les différentes valeurs de f′(x).

`logistic_regression` a comme paramètres :

- une liste `L` qui contient les valeurs de y′ pour x=x0,x0+1....x0+n,
- la valeur de `x0` de x0
- la valeur `y0` de y(x0) lorsqu’on la connait sinon `Xcas` arrive à l’estimer...

`logistic_regression(L,x0,y0` renvoie les fonctions `y(x)` et `y’(x)`, la constante `C`, `y1M` et `xM` avec `y1M` est la valeur `y’(xM)` qui est le maximum de y′ obtenu en x=xM, et enfin le coefficient de correlation linéaire `R` de Y=y′/y en fonction de y avec la droite Y=a*y+b.
À partir de la liste `L`, `Xcas` calcule la liste `Ly` en utilisant la formule y(t+1)−y(t)=y′(t), donc, on a `Ly=[y0,y0+y0’,y0+y0’+y1’,....]`. Puis `Xcas` fait une régression linéaire de `L/Ly` en fonction de `Ly` pour avoir les valeurs de a et b (y′/y=a*y+b et y0=y(x0)) puis touve la solution de cette équation différentielle On tape :

`logistic_regression([0.0,1.0,2.0,3.0,4.0],0,1)`

On obtient avec écrit en bleu la signification des valeurs renvoyées :

`[(-17.77)/(1+exp(-0.496893925384*x+2.82232341488+3.14159265359*i)), (-2.48542227469)/(1+cosh(-0.496893925384*x+2.82232341488+3.14159265359*i)), -17.77,-1.24271113735,5.67993141131+6.32246138079*i, 0.307024935856]`

On tape :

`evalf(logistic_regression([1,2,4,6,8,7,5],0,2))`

Ou on tape :

`logistic_regression(evalf([1,2,4,6,8,7,5]),0,2.0))`

On obtient :

`[64.8358166583/(1.0+exp(-0.551746244591*x+2.95837880348)), 14.4915280084/(1.0+cosh(-0.551746244591*x+2.95837880348)), 64.8358166583,7.24576400418,5.36184674112,-0.81176431297]`

Pour retouver la valeur -0.81176431297 du coefficient de corrélation, on tape :
`L:=[1,2,4,6,8,7,5];`
`y0:=2.0;`
`Ly:=makelist(y0,1,size(L))+cumSum(L)`
On obtient : `[3,5,9,15,23,30,35]`
puis
`correlation(L/Ly,Ly)` qui renvoie
`-0.81176431297`