Programmer en R/Estimer un modèle de régression circulaire

Nous allons effectuer une régression circulaire en utilisant la méthode directe de Kåsa et Coope, qui est une méthode de régression linéaire (voir sur Wikipédia Régression circulaire > Méthode de Kåsa et Coope). Pour le calcul, nous utilisons l'équation cartésienne du cercle de centre (xc, yc) et de rayon r :

Wikipédia propose un article sur : « Régression circulaire ».

Régression circulaire par la méthode de Kåsa et Coope avec GNU R.
 ;

soit en développant :

.

Pour le tracé, nous utilisons l'équation paramétrique :

Nous utilisons les données proposées par D. Gruntz[1]

Données pour la régression circulaire
x y
0.7 4.0
3.3 4.7
5.6 4.0
7.5 1.3
6.4 -1.1
4.4 -3.0
0.3 -2.5
-1.1 1.3
data.entry('x', 'y') # copier les données ci-dessus
# cliquer sur l'en-tête des colonnes pour sélectionner "numeric"
# puis fermer la table
plot(x, y, col='blue')

Puis, nous effectuons la régression

donnees <- data.frame(x, y)
cercle <- lm(I(x^2 + y^2) ~ x + y, donnees)
print(cercle)

ce qui donne

Call:
lm(formula = I(x^2 + y^2) ~ x + y, data = donnees)

Coefficients:
(Intercept)            x            y  
      6.967        6.121        1.487

Le modèle obtenu par régression est donc :

(x2 + y2) = 6,121·x + 1,487·x + 6,967.

Enfin, nous déterminons les caractéristiques du cercle

xc <- coef(cercle)[2]/2
yc <- coef(cercle)[3]/2
r <- sqrt(coef(cercle)[1] + xc^2 + yc^2)
print(xc) ; print(yc) ; print(r);

ce qui donne

       x 
3.060304 
        y 
0.7436073 
(Intercept) 
   4.109137

soit un cercle de centre (3,060,304 ; 0,743,607,3) et de rayon 4,109,137. Puis nous traçons le modèle

theta <- seq(0, 2*pi, len = 40)
xmodcercle <- xc + r*cos(theta)
ymodcercle <- yc + r*sin(theta)
lines(xmodcercle, ymodcercle, col='red')

Notes et références

modifier
  1. anglais D. Gruntz, « Finding the Best Fit Circle », dans The MathWorks Newsletter, vol. 1, 1990, p. 5