Comment se calcule une régression logistique ?

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Christophe Genolini
Messages : 698
Enregistré le : 12 Juin 2006, 21:37
Contact :

Comment se calcule une régression logistique ?

Messagepar Christophe Genolini » 03 Juil 2016, 16:04

Bonjour a tous,

Je continue ma longue route au pays des mécanismes de calcul. Savez-vous comment est calculé la régression logistique ?
En théorie, l'équation est logit(y)=ax+b. Je me suis donc -naïvement- dit "il suffit de calculer le logit(y), puis on fait comme pour la régression linéaire". Plus grave, j'ai enseigné que c'était comme ca qu'il fallait faire, pendant quelques années...

Sauf qu'en pratique, y vaut soit 0, soit 1, donc y/(1-y) vaut soit 0, soit NaN et donc log(y/(1-y)) vaut soit log(0), soit log(NaN). Dans tous les cas, logit(y) vaut NaN. Donc ca ne marche pas.

D'ou ma question : savez-vous comment calculer une regression logistique à la main ?
Genre :

Code : Tout sélectionner

> set.seed(1)
> a <- c(0,0,1,0,0,1,1,1,0,1,1)
> b <- 0:10
> summary(glm(a~b, family="binomial"))

Call:
glm(formula = a ~ b, family = "binomial")

Deviance Residuals:
    Min       1Q   Median       3Q      Max 
-1.8271  -0.8140   0.4442   0.8437   1.6019 

Coefficients:
            Estimate Std. Error z value Pr(>|z|)
(Intercept)  -1.7645     1.4072  -1.254     0.21
b             0.4031     0.2595   1.554     0.12

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 15.158  on 10  degrees of freedom
Residual deviance: 11.894  on  9  degrees of freedom
AIC: 15.894

Number of Fisher Scoring iterations: 4

Comment retrouver le -1.7645, le 0.4031 et les autre coef à la main ?

Christophe
--
Christophe
https://rplusplus.com

Yoan Russac
Messages : 33
Enregistré le : 30 Juin 2016, 09:43

Re: Comment se calcule une régression logistique ?

Messagepar Yoan Russac » 04 Juil 2016, 13:40

Bonjour,

Je sais le faire à la main mais c'est assez long à expliquer, néanmoins je connais un cours vraiment très bien fait, où tout est détaillé,
je pense que les explications seront plus claires que celles que j'arriverai à faire, j'ai passé une 20 d'heures sur le cours tellement je l'ai trouvé intéressant.

Le site dont je te parle :
http://eric.univ-lyon2.fr/~ricco/cours/ ... stique.pdf

Bonne lecture,
Yoan


PS: Si tu n'es pas convaicu dis le moi et je prendrai le temps de faire une explication claire
Yoan Russac

Christophe Genolini
Messages : 698
Enregistré le : 12 Juin 2006, 21:37
Contact :

Re: Comment se calcule une régression logistique ?

Messagepar Christophe Genolini » 04 Juil 2016, 20:58

272 PAGES !!!!!

Je comprends que tu n'aies pas envie de me le raconter la comme ca !
:-)

Merci, je vais m'y pencher.
--
Christophe
https://rplusplus.com

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: Comment se calcule une régression logistique ?

Messagepar Eric Wajnberg » 05 Juil 2016, 04:56

Deux points :

1) Votre question n'est pas une question sur le logiciel R. Vous êtes hors sujet ici.

2) Dans une régression logistique, la loi de la variable dépendante est binomiale. On ne peux donc pas utiliser un modèle classique de régression où les paramètres sont en revanche estimés par la méthode des moindres carrés. Par exemple, Une fréquence de 0.5 peut provenir aussi bien de 1 individu sur 2, ou bien de 500 individus sur 1000. La variance de cette fréquence dans le second cas est bien plus faible que dans le premier. Si on utilise en revanche une simple méthode des moindres carrés dans ce cas, ces deux fréquences seront considérées de la même façon, ce qui est faux. Rapidement, donc, pour estimer les paramètres de la régression, il faut écrire la vraisemblance selon une loi binomiale et trouver les paramètres qui maximisent cette vraisemblance (méthode dite du maximum de vraisemblance). Si on fait ceci sur une régression classique, en calculant une vraisemblance sur une loi normale, on retombe sur du moindre carrés, qui est la signature du cas gaussien. Ce n'est pas si compliqué que cela, sauf que la maximisation d'une vraisemblance se fait numériquement de manière itérative, ce qui rend les choses vraiment fastidieuse si on les fait à la main. Mais tout ceci relève d'un cours de statistique et n'a rien à voir avec l'utilisation et les spécificités du logiciel R..

HTH, Eric.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Comment se calcule une régression logistique ?

Messagepar Logez Maxime » 05 Juil 2016, 07:41

Bonjour,

Pour une fois je ne suis pas d'accord avec toi Eric. Il est bien question de la programmation qui pemet d'estimer les paramètres. Pour moi cette question est pertinente, d'autant plus qu'en cherchant sur le web je suis tombé sur pas mal de docs qui disait que les estimations pouvaient être légèrement différentes selon les logiciels.Il y a la théorie d'une part, que tu as rappelée et la pratique d'autre part, qui est comment tu fais quand tu as une probabilités de 0 ou 1 pour estimer les paramètres parce que dans ces cas la tu as bien au départ un log de valeur infini ou de 0. Il y a donc surement une astuce pour initialiser l'algorithme avant de pouvoir utiliser le critère du maximum de vraisemblance.

Cordialement,
Maxime

Christophe Genolini
Messages : 698
Enregistré le : 12 Juin 2006, 21:37
Contact :

Re: Comment se calcule une régression logistique ?

Messagepar Christophe Genolini » 05 Juil 2016, 07:53

1) Votre question n'est pas une question sur le logiciel R. Vous êtes hors sujet ici.


Oui, mais j'ai tous mes copains ici !
:-)
Plus sérieusement, mon objectif est de décortiquer la régression logistique de R. J'ai donc écris mon code R et ensuite, je vais faire les calculs a la main, sous R. Et si j'ai bien compris, tous les logiciels ne se valent pas.

j'ai passé une 20 d'heures sur le cours tellement je l'ai trouvé intéressant.

Effectivement, c'est un régal. Si je résume :
- je fixe des valeurs aléatoire pour chaque colonne.
- je calcule C(X), puis pi, puis LL pour chaque individu
- Je calcule la déviance

Code : Tout sélectionner

set.seed(1)
y <- c(0,0,1,0,0,1,1,1,0,1,1)
x1 <- 0:10
x2 <- floor(runif(11,0,10))
summary(glm(y~x1+x2, family="binomial"))

X <- cbind(i=1,x1,x2)

a <- c(1,0,1)
Cx <- a[1] + a[2]*x1 + a[3]*x2
Pi <- 1/(1+Cx)
LL <- y*log(Pi)+(1-y)*log(1-Pi)
Dm <- -2*sum(LL)

L'objectif est d'avoir une déviance Dm la plus faible possible.
Ensuite, il utilise un "solver", celui de Newton-Raphson. Dans le cours qu'il donne, ca fait un peu boite noire, mais il donne des liens. Je vais jeter un oeil du coté du solver.

Christophe
--
Christophe
https://rplusplus.com

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: Comment se calcule une régression logistique ?

Messagepar Eric Wajnberg » 05 Juil 2016, 07:55

Je ne vais pas me battre, mais le problème des 0 et des 1 dans une régression logistique est un problème de statistique, vrai sur tout les logiciels, et n'est pas spécifique à l'utilisation de R.

Pour rester hors-sujet, donc :

1) Il y a une montagne d'infos, de cours, etc., sur le web, qui parle de ceci. En gros :

2) Les différentes valeurs 0 & 1 sont regroupées par modalités équivalentes (des variables dépendantes) et c'est leur sommes (leur fréquences) qui sont analysées, pas chaque 0 et 1 séparément. Le logit dans ce cas ne s'envole pas à plus ou moins l'infini.

3) Si, après ce regroupement, on continue à avoir une fréquence à 0 ou 1, alors là oui, le lien logit ne va plus. McCullagh et Nelder, dans leur bouquin fondateur, propose dans ce cas d'ajuster une régression quasi-logistique, en remplacant la fonction de lien logit par une autre. C'est faisable dans R (j'ai expliqué ça dans d'autres forums; il faut écrire la fonction de lien correspondante), mais également dans n'importe quel logiciel.

4) Enfin, le fait qu'on ne trouve pas exactement les mêmes résultats sur différents logiciels est également bien connu. Il est du au fait qu'il n'y a pas de forme canonique du calcul des paramètres (contrairement au cas gaussien par les moindres carrés), ce qui nécessite un calcul itératif, numérique, qui peut différer d'une architecture à une autre.

On s'éloigne de la question de calculer ceci à la main, et on n'est toujours pas sur une question concernant l'utilisation du logiciel R.

Eric.

Christophe Genolini
Messages : 698
Enregistré le : 12 Juin 2006, 21:37
Contact :

Re: Comment se calcule une régression logistique ?

Messagepar Christophe Genolini » 05 Juil 2016, 08:26

mais il donne des liens.

Argh, c'est que des liens payants.
--
Christophe
https://rplusplus.com

Yoan Russac
Messages : 33
Enregistré le : 30 Juin 2016, 09:43

Re: Comment se calcule une régression logistique ?

Messagepar Yoan Russac » 05 Juil 2016, 08:39

C'est vrai que je ne me suis pas penché sur les solver... Il me semble quand même que c'est compréhensible en admettant certains points un peu obscure
J'avais écrit plusieurs mails à celui qui a fait le cours, il était vraiment gentil, je pense que si vraiment tu veux des détails sur un point théorique, il saura t'aider.


Yoan
Yoan Russac

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Comment se calcule une régression logistique ?

Messagepar Logez Maxime » 05 Juil 2016, 09:07

Eric Wajnberg a écrit :Je ne vais pas me battre, mais le problème des 0 et des 1 dans une régression logistique est un problème de statistique, vrai sur tout les logiciels, et n'est pas spécifique à l'utilisation de R.

On s'éloigne de la question de calculer ceci à la main, et on n'est toujours pas sur une question concernant l'utilisation du logiciel R.
Certes mais la question est bien de programmer cette régression qui n'a rien d'anormale "à la main" sous R :-) et donc de comment ce logiciel en particulier (qui se soucie des autres :-)) gère ces cas de figures.

Pour revenir à la question de départ tu peux aussi décortiquer le code des fonctions, glm, glm.fit et de binomial().

Maxime

Pierre Bady
Messages : 405
Enregistré le : 02 Mai 2006, 07:46

Re: Comment se calcule une régression logistique ?

Messagepar Pierre Bady » 05 Juil 2016, 09:41

Bien le bonjour,

un petit doc intéressant (mon premier contacte avec R et la régression logistique :D):
- http://pbil.univ-lyon1.fr/R/pdf/br5.pdf

quelques traces de notre passé ... version à la paluche ... la convergence est assez rapide :D

Code : Tout sélectionner

#-----------------------------
# course on glm
# from esteves 2006
#-----------------------------
age <- c(25,32.5,37.5,42.5,47.5,52.5,57.5,65)
n <- c(100,150,120,150,130,80,170,100)
y <- c(10,20,30,50,60,50,130,80)
# proportions
f <- y/n
f
# link-transformation
g <- log(f/(1-f))
# weighting
w <- n*f*(1-f)
# weighted regression
r <- predict(lm(g~age,weights=w))
p <- exp(r)/(1+exp(r))
p
plot(age,f,ylim=c(0,1))
lines(age,p,col="green")
symbols(age,f,circles=w,add=TRUE,inc=0.5,col="darkgreen",lwd=2)
# after iterations
for(i in 1:5){
w <- n*p*(1-p)
gu <- r+(f-p)/p/(1-p)
r <- predict(lm(gu~age,weights=w))
r
p <- exp(r)/(1+exp(r))
p
}
coefficients(lm(gu~age,weights=w))
coefficients(glm(cbind(y,n-y)~age,family=binomial(link="logit")))

#-----------------------------
# binary data
#-----------------------------
age <- sort(rnorm(100,45,10))
y <- rbinom(100,1,1/(1+exp(-(-5+0.1*age))))
n <- length(y)
# proportions
f <- y
# link-transformation
g <- log(f/(1-f))
# weighting
w <- n*f*(1-f)
# weighted regression
r <- predict(lm(g~age,weights=w))
p <- exp(r)/(1+exp(r))
plot(age,f,ylim=c(0,1))
lines(age,p,col="green")
cols1 <- rainbow(5)
for(i in 1:5){
w <- p*(1-p)
gu <- r+(f-p)/p/(1-p)
r <- predict(lm(gu~age,weights=w))
p <- exp(r)/(1+exp(r))
lines(age,p,col=cols1[i])
}
glm1 <- glm(f~age, family=binomial(link="logit"))
lines(age,predict(glm1,type="response"),col="red",lty=2,lwd=2)
coefficients(lm(gu~age,weights=w))
coefficients(glm1)
####


On peut aussi s'amuser à jouer avec d'autres moteurs d'optimisation ...

Code : Tout sélectionner

#----------------------------------------------
# regression logistique (05/05/07 11:21:23)
# avec donn?es binaires sans consid?ration
# des poids
#----------------------------------------------
y <- c(0,0,0,1,0,1,1,1,1,1)
x <- sort(rnorm(10)+runif(10))
plot(x,y)
f <- function (y, x, par)
{
  eta <- par[1] + x * par[2]
  mu <- 1/(1+exp(-eta))
  ll <- sum(y*log(mu)+(1-y)*log(1-mu))
  return(-ll)
}
nlm(f, y=y,x=x,p=c(0,0))
glm1 <- glm(y~x,family=binomial)
glm1
logLik(glm1)

# regression logistic avec algorithme génétique
require(gafit)
invlogit <- function(eta) 1/(1+exp(-eta))
e <- expression( - sum(y*log(invlogit(a+b*x))+(1-y)*log(1-invlogit(a+b*x))))
gafit( e, list( a=0, b=0 ), step=0.0001, maxiter=1000)


approche similaire pour régression de poisson ...

Code : Tout sélectionner

#------------------------------------------------
# regression poissonienne (05/05/07 11:41:54)
#----------------------------------------------
y <- sort(rpois(10,1))
x <- sort(rnorm(10)+runif(10))
plot(x,y)
f <- function (y, x, par)
{
  eta <- par[1] + x * par[2]
  mu <- exp(eta)
# sum(w * (-mu + y * log(mu) - lgamma(y + 1))) avec w = poids
  ll <- sum(y*log(mu)-mu-lgamma(y+1))
  return(-ll)
}
nlm(f, y=y,x=x,p=c(0,0),steptol = 1e-09,gradtol = 1e-09)
glm1 <- glm(y~x,family=poisson)
glm1
logLik(glm1)
optim(par=c(0,0), f,x=x,y=y)
nlminb(c(0,0), f,x=x,y=y)

# regression de poisson avec algorithme génétique
require(gafit)
e <- expression( - sum(y*log(exp(a+b*x))-exp(a+b*x)-lgamma(y+1)))
gafit( e, list( a=0, b=0 ), step=0.0001, maxiter=1000)


je dois aussi avoir des versions en mode BUGS/JAGS quelques parts qui traînent sur un des mes disques :D

Il faut faire attention aux paramètres de contrôle, tolérance, d’itération,epsilon, ... (voir par exemple glm.control()).
Ces différentes fonctions utilisent rarement les mêmes options par défaut. On avait même eu quelques surprises entre l'implémentation
des GLM de S et de R pendant le projet EFI+ (clin d'oeil pour max :P).

pour le détail du fonctionnement de la function "glm", le manuel de GLIM (qui est quelques parts sur mon bureau ...mais où??? :'( ) est très informatif. Sinon voir aussi Le McCullagh and Nelder (Generalized linear model, 1989, cf post de Eric) ainsi que l'article fondateur (?) de Nelder and Wedderburn(1972). "Generalized Linear Models" (http://www.jstor.org/stable/2344614?ori ... b_contents).

en espérant ne pas être trop hors sujet et en espérant avoir aidé un peu :)

@++

pierre
=@===--------¬-------¬------¬-----¬
liens utiles :
http://www.gnurou.org/Writing/SmartQuestionsFr
http://neogrifter.free.fr/welcomeOnInternet.jpg
]<((((*< -------------------------------

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Comment se calcule une régression logistique ?

Messagepar Logez Maxime » 05 Juil 2016, 12:05

En tout cas l'initialisation des paramètres pour l'algorithme de la fonction glm se fait via la fonction binomial()$initialize

Code : Tout sélectionner

binomial()$initialize
expression({
    if (NCOL(y) == 1) {
        if (is.factor(y))
            y <- y != levels(y)[1L]
        n <- rep.int(1, nobs)
        y[weights == 0] <- 0
        if (any(y < 0 | y > 1))
            stop("y values must be 0 <= y <= 1")
        mustart <- (weights * y + 0.5)/(weights + 1)
        m <- weights * y
        if (any(abs(m - round(m)) > 0.001))
            warning("non-integer #successes in a binomial glm!")
    }
    else if (NCOL(y) == 2) {
        if (any(abs(y - round(y)) > 0.001))
            warning("non-integer counts in a binomial glm!")
        n <- y[, 1] + y[, 2]
        y <- ifelse(n == 0, 0, y[, 1]/n)
        weights <- weights * n
        mustart <- (n * y + 0.5)/(n + 1)
    }
    else stop("for the 'binomial' family, y must be a vector of 0 and 1's\nor a 2 column matrix where col 1 is no. successes and col 2 is no. failures")
})

Lorsque y est juste composé de 0 et 1 (donc non groupé), il va générer des valeurs de départ de mu (mustart) qui vont être de 0.25 pour Y = 0 et 0.75 pour Y =1.
Les poids étant initialisés à 1, et les valeurs de eta à g(mustart) (g fonction de lien, ici logit).

Cordialement,
Maxime

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Comment se calcule une régression logistique ?

Messagepar Logez Maxime » 06 Juil 2016, 09:24

voila ce que ça donne sous R.

Code : Tout sélectionner

tab <- structure(list(Hours = c(0.5, 0.75, 1, 1.25, 1.5, 1.75, 1.75,
2, 2.25, 2.5, 2.75, 3, 3.25, 3.5, 4, 4.25, 4.5, 4.75, 5, 5.5),
    Pass = c(0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1,
    1, 1, 1, 1)), .Names = c("Hours", "Pass"), row.names = c("V2",
"V3", "V4", "V5", "V6", "V7", "V8", "V9", "V10", "V11", "V12",
"V13", "V14", "V15", "V16", "V17", "V18", "V19", "V20", "V21"
), class = "data.frame")

y <- structure(c(0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1,
1, 1, 1), .Names = c("V2", "V3", "V4", "V5", "V6", "V7", "V8",
"V9", "V10", "V11", "V12", "V13", "V14", "V15", "V16", "V17",
"V18", "V19", "V20", "V21"))

x <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 1.75, 2, 2.25, 2.5, 2.75,
3, 3.25, 3.5, 4, 4.25, 4.5, 4.75, 5, 5.5), .Dim = c(20L, 2L), .Dimnames = list(
    c("V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9", "V10",
    "V11", "V12", "V13", "V14", "V15", "V16", "V17", "V18", "V19",
    "V20", "V21"), c("(Intercept)", "Hours")), assign = 0:1)


lien <- binomial()$linkfun # logit
lieninv <- binomial()$linkinv # inverse logit
variance <- binomial()$variance # mu * (1-mu)
unless.null <- function(x, if.null) { if (is.null(x))
        if.null
    else x
  }
valideta <- unless.null(binomial()$valideta, function(eta) TRUE)
validmu <- unless.null(binomial()$validmu, function(mu) TRUE)

bob <- function (x, z, w)
{
    fit <- .Call(C_Cdqrls, x * w, z * w, min(1e-07, glm.control()$epsilon/1000),
        check = FALSE)
    fit
}
environment(bob) <- environment(glm.fit)

# dérivé de la fonction de lien :
mu.eta <- binomial()$mu.eta

# equivalente à
# f1 <- function(eta) (1/(1+exp(-eta))) *(exp(-eta)/(1+exp(-eta)))

# calcul de la déviance résiduelle
dev.resids <- binomial()$dev.resids

# initialisation  par défaut
coefold <- NULL # pas de coefficients
nobs <- nrow(tab)
weights <- rep(1, nobs)
mustart <- ifelse(y==1, 0.75, 0.25)
etastart <- lien(mustart)


# mise en place de l'agorithme
eta <- etastart
mu <- lieninv(eta)

# devold <- deviance résiduelle
devold <- sum(dev.resids(y, mu, weights))


# le processus itératif
for (iter in 1L:25L) {

# variance
varmu <- variance(mu)

# la dérivé :
mu.eta.val <- mu.eta(eta)

z <- eta + (y-mu)/mu.eta.val
w <- sqrt((weights * mu.eta.val^2)/variance(mu))

fit <- bob(x, z, w)

# les coefficients de départ :
start <- fit$coefficients

# les nouvelles valeurs de eta --> produit matriciel de x et des coeffs
eta <- drop(x %*% start)

# les nouvelles valeurs de mu
mu <- lieninv(eta)

# la nouvelle deviance residuelle
dev <- sum(dev.resids(y, mu, weights))

cat("Deviance = ", dev, " Iterations - ", iter,
                  "\n", sep = "")

if (abs(dev - devold)/(0.1 + abs(dev)) < 1e-8) {
  coef <- start
  break
   }

else {
  devold <- dev
  coef <- coefold <- start
  }
}
Deviance = 16.46613 Iterations - 1
Deviance = 16.07585 Iterations - 2
Deviance = 16.0598 Iterations - 3
Deviance = 16.05976 Iterations - 4
Deviance = 16.05976 Iterations - 5
coef
[1] -4.077713  1.504645

coef(glm(Pass ~Hours, data = tab, family =binomial()))
(Intercept)       Hours
  -4.077713    1.504645
La seule difficulté est de comprendre ce qui se passe dans la fonction C "C_Cdqrls". J'ai essayé de la remplacer par ul lm.wfit mais sans succès.

Cordialement,
Maxime

Pierre Bady
Messages : 405
Enregistré le : 02 Mai 2006, 07:46

Re: Comment se calcule une régression logistique ?

Messagepar Pierre Bady » 07 Juil 2016, 07:58

hello,

il s'agit d'une fonction wrapper qui fait appel à dqrls (en fortran) qui fait appel à des routines linpack (dqrdc et dqrsl) pour utiliser la décomposition QR pour résoudre x * b = y ... (voir: https://svn.r-project.org/R/trunk/src/appl/dqrls.f et lm.c dans le include du package stats). Mais là, on rentre vraiment dans des problèmes de cuisine interne (??).

HTH et bonne journée,


pierre
=@===--------¬-------¬------¬-----¬

liens utiles :

http://www.gnurou.org/Writing/SmartQuestionsFr

http://neogrifter.free.fr/welcomeOnInternet.jpg

]<((((*< -------------------------------

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Comment se calcule une régression logistique ?

Messagepar Logez Maxime » 07 Juil 2016, 09:01

salut,

yep c'est de la cuisine, mais ce que je ne comprends pas c'est pourquoi en utilisant cette routine, on arrive à ces coefficients au bout de 5 itérations dans l'exemple, alors que si tu la remplaces par une régression linéaire pondérée, tu obtiens la même chose à la première itération mais pas aux suivantes et tu ne tombes pas sur les mêmes coefs.

bref ...

Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité