Vous êtes sur la page 1sur 4

TP Statistique en logiciel R

Régression non linéaire

On veut étudier la liaison éventuelle entre la vitesse de formation d’une protéine (variable Y) et la
concentration du substrat (variable X). En n = 12 expériences indépendantes, on observe les
valeurs (xi , yi)i∈{1,...,n} de (X, Y ) suivantes :

Travail demandé
1. Créer (en logiciel R) les deux vecteurs de données X et Y.
> x = c(0.02, 0.02, 0.06, 0.06, 0.11, 0.11, 0.22, 0.22, 0.56, 0.56, 1.10,
1.10)

> y = c(76, 47, 97, 107, 123, 139, 159, 152, 191, 201, 207, 200)

2. Représenter le nuage de points (xi, yi)i∈{1,...,n}.


> plot(x,y)

3. Calculer le coefficient de corrélation linéaire de X et Y


> cor(x,y)

[1] 0.8310362

4. Est-ce qu’on peut adapter Une liaison linéaire entre Y et X. expliquer pourquoi.
Modèle logarithmique
Le model logarithmique consiste à transformer la variable X à ln(X), puis on considère le modèle de
régression linéaire suivant :
log_model : Y = β0 + β1 ln(X) + ε
Avec : ε ~ 𝒩 (0, σ 2)  ; Les paramètres β0 , β1 et σ ∈ ℝ
5. Calculer le coefficient de corrélation linéaire de Y et ln(X)
> cor(log(x),y)

[1] 0.9824308

6. En utilisant la fonction lm() créer votre modèle de régression log_model, déduire les
valeurs de β0 et β1.
> log_model = lm(y ~ log(x))
> log_model

Call:
lm(formula = y ~ log(x))

Coefficients:
(Intercept) log(x)
209.19 37.11

7. Utiliser la fonction summary() pour afficher plus de détail sur votre model de régression
> summary(log_model)

Call:
lm(formula = y ~ log(x))

Residuals:
Min 1Q Median 3Q Max
-17.0176 -6.2455 0.6039 7.4262 13.3228

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 209.194 5.045 41.47 1.59e-12 ***
log(x) 37.110 2.229 16.65 1.28e-08 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 10.37 on 10 degrees of freedom


Multiple R-squared: 0.9652, Adjusted R-squared: 0.9617
F-statistic: 277.1 on 1 and 10 DF, p-value: 1.28e-08
NB. : il faut bien comprendre ce détail (Pr(>|t|) , *** , Multiple R-squared:, …)
8. Tracer la courbe de régression sur le nuage de points. Est-ce que cette courbe ajuste bien
le nuage de points ?
> beta = coef(log_model)
> curve(beta[1] + beta[2]*log(x), add = T)

9. Donner une estimation ponctuelle de σ.


Autres modèle non linéaire
A. Une solution est de transformer les variables Y∗ = 1/Y et X∗ = 1/X ; puis on considère le modèle
de régression linéaire suivant:
reg_model : Y∗ = β0 + β1X∗ + ε
Avec : ε ~ 𝒩 (0, σ 2)  ; Les paramètres β0 , β1 et σ ∈ ℝ
Refaire le même travail précédant pour ce modèle.
B. Une autre solution est de considérer directement un lien non-linéaire entre Y et X. Dans ce
contexte, on considère le modèle de Michaëlis-Menten : Y = fk,v(X), avec fk,v(x) = (v*x) /(k + x) .
Le modèle de régression non-linéaire associé est : Y = f k,v(X) + ε, Avec : ε ~ 𝒩 (0, σ 2). Les
paramètres v, k et σ sont des réels inconnus.
L’estimation par les moindres carrés ordinaires consiste à trouver k et v qui minimise la somme
des carrés des écarts de Yi et fk,v(xi).
La fonction nls() vous permettra de réaliser cette régression non linéaire et de trouver
directement les coefficients k et v.
> nl_model = nls(y ~ v * x / (k + x) , data = w, start = list(v = 200, k =
0.05))
> nl_model
Nonlinear regression model
model: y ~ v * x/(k + x)
data: w
v k
212.68358 0.06412
residual sum-of-squares: 1195

Number of iterations to convergence: 5


Achieved convergence tolerance: 8.824e-06

Le détail de cette régression :


> summary(nl_model)

Formula: y ~ v * x/(k + x)

Parameters:
Estimate Std. Error t value Pr(>|t|)
v 2.127e+02 6.947e+00 30.615 3.24e-11 ***
k 6.412e-02 8.281e-03 7.743 1.57e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 10.93 on 10 degrees of freedom

Number of iterations to convergence: 5


Achieved convergence tolerance: 8.824e-06

Extraction des coefficients k et v


> beta = coef(nl_model)
> beta
v k
212.68357913 0.06412103

Tracer la courbe de régression de ce modèle


plot(x,y)
curve(beta[1] * x / (beta[2] + x), add = T)
Les valeurs Ý estimés par ce modèle à partir des valeurs de X
> fitted(nl_model)
[1] 50.56609 50.56609 102.81106 102.81106 134.36168 134.36168 164.68471
[8] 164.68471 190.83287 190.83287 200.96874 200.96874
attr(,"label")
[1] "Fitted values"

Les écarts entre les valeurs réelles et les valeurs estimés


> e = residuals(reg)
> e
[1] 25.4339076 -3.5660924 -5.8110639 4.1889361 -11.3616806 4.6383194
[7] -5.6847051 -12.6847051 0.1671337 10.1671337 6.0312590 -0.9687410
attr(,"label")
[1] "Residuals"
> plot(e)
> qqnorm(e)

Représenter les 3 courbes de régression obtenues sur le même nuage de points. Quelle est celle
qui ajuste le mieux le nuage de points de cette distribution statistique ?

Vous aimerez peut-être aussi