Modéliser une exponentielle

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 :

Modéliser une exponentielle

Messagepar Christophe Genolini » 26 Jan 2020, 22:33

Bonjour a tous,
J'ai une question triviale, mais comme je n'ai plus fait de R depuis longtemps, je ne me souviens plus... J'ai 4 points, quand je les plotte, ils suivent clairement une exponentielle. Quelle commande R me permet de trouver l'exponentielle qui modélise le mieux ces points ?

Code : Tout sélectionner

 
h <- c(40,10,3.2,1.2)
siecle <- c(1450,1550,1750,1950)/1000
plot(siecle,h,type="b",col="blue",lwd=5,pch=16)


Merci
Christophe
--
Christophe
https://rplusplus.com

Michaël Delorme
Messages : 67
Enregistré le : 04 Avr 2016, 10:21

Re: Modéliser une exponentielle

Messagepar Michaël Delorme » 27 Jan 2020, 10:17

La fonction nls doit répondre à ce besoin.

Le problème est de trouver les valeurs initiales...

Pour ce modèle, il y a : https://stats.stackexchange.com/questions/160552/why-is-nls-giving-me-singular-gradient-matrix-at-initial-parameter-estimates

Code : Tout sélectionner

h <- c(40, 10, 3.2, 1.2)
siecle <- c(1450, 1550, 1750, 1950)/1000
plot(siecle, h, type = "b", col = "blue", lwd = 5, pch = 16)

c.0 <- min(h) * 0.5
model.0 <- lm(log(h - c.0) ~ siecle)
start <- list(a = exp(coef(model.0)[1]), b = coef(model.0)[2], c = c.0)

model <- nls(h ~ a * exp(b * siecle) + c, start = start, control = list(maxiter = 1000))

(p <- coef(model))
 ##           a             b             c
 ##1.884962e+11 -1.539587e+01  1.955795e+00

curve(p["a"] * exp(p["b"] * x) + p["c"], lwd=2, col="red", add = TRUE)


Image

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

Re: Modéliser une exponentielle

Messagepar Eric Wajnberg » 30 Jan 2020, 09:01

SI le modèle est simplement exponentiel, il suffit de faire une régression linéaire sur les données "redressés" c'est à dit de régresser log(h) sur siècle, et de repasser à l'exponentiel ensuite.

Ceci dit:

1) C'est un problème de statistique, pas un problème de l'usage de R. Votre question est sensiblement hors-sujet ici, et

2) Il n'est pas sûr que vos données suivent une fonction exponentielle. Ce n'est pas si clair sur les graphiques. A vérifier avec les résidus de la régression dont je parle ci-dessus.

HTH, Eric.

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

Re: Modéliser une exponentielle

Messagepar Christophe Genolini » 30 Jan 2020, 10:52

Eric, votre réponse est fausse. Si on utilise la fonction log, alors la régression calculée minimisera le log des erreurs. Et donc, une erreur sur un point élevé de la courbe sera moins impactante sur la somme des résidus qu'une erreur sur un point bas. En l’occurrence, j'ai essayé, la courbe trouvé épouse parfaitement les points 3 et 4, mais est complètement à l'ouest sur les points 1 et 2.

Dans mon cas, le mieux est de modéliser par une quasipoisson. Le code est le suivant :

Code : Tout sélectionner

m<-c(40,10,3.2,1.2)
s <- c(1450,1550,1750,1950)
ss <- (1450:1950)
a <- glm(m~s,family=quasipoisson)
a1 <- a$coef[1]
a2 <- a$coef[2]

plot(s,m,pch=16,xlab="Année",ylab="Assassinats pour 100 000 habitants",ylim=c(-0.05,40),type="b")
lines(ss,exp(a2*ss+a1),col="red",lwd=3)


Merci quand même.
--
Christophe
https://rplusplus.com

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

Re: Modéliser une exponentielle

Messagepar Eric Wajnberg » 30 Jan 2020, 12:06

Plusieurs points :

1) Le passage par les logs impliquent évidement que les résidus en log suivent évidement une loi normale de variance égale, etc. C'est un principe de base en régression linéaire. Ceci répond à votre premier point.

2) Effectivement, sur un graphe en log, les points ne sont pas sur une droite, et c'est ça qui me fait dire que le modèle exponentiel n'est probablement pas le bon.

3) Une régression log-linéaire (qu'implique un argument "family=poisson" - ou quasipoisson, ce qui est la même chose sur le calcul de la vraisemblance) implique que la variable à modéliser suive une loi de Poisson, donc un comptage. Vous n'avez jamais précisé ceci dans votre question initiale. Il n'était donc pas possible de vous aider plus que ceci.

4) Accessoirement, passer par une régression log-linéaire implique que la fonction de lien soit la fonction log, et on retombe exactement sur ce que je proposais !

5) Accessoirement (encore), parler de quasipoisson rajoute juste l'estimation d'un coefficient de surdispersion, mais ne change par l'estimation des paramètres de régression (ça ne change que leur SE). Or vous n'êtes intéressé que par ces coefficients. Si vous avez bien un paramètre de comptage à modéliser, un argument "family=poisson" donnera exactement la même chose.

6) Tout ceci est une discussion de statistique, et est complètement hors-sujet sur ce forum.

Cordialement, Eric.

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

Re: Modéliser une exponentielle

Messagepar Logez Maxime » 31 Jan 2020, 13:55

Bonjour,
Eric Wajnberg a écrit :3) Une régression log-linéaire (qu'implique un argument "family=poisson" - ou quasipoisson, ce qui est la même chose sur le calcul de la vraisemblance) implique que la variable à modéliser suive une loi de Poisson, donc un comptage. Vous n'avez jamais précisé ceci dans votre question initiale. Il n'était donc pas possible de vous aider plus que ceci.
Je partage l'avis d'Eric, d'autant plus que certaines valeurs sont décimales.

Eric Wajnberg a écrit :4) Accessoirement, passer par une régression log-linéaire implique que la fonction de lien soit la fonction log, et on retombe exactement sur ce que je proposais !

La je ne suis pas entièrement d'accord. Avec une distribution de poisson le lien est en log, mais l'estimation des paramètres se fait au maximum de vraisemblance et donc les paramètres estimés et les prédictions ne sont pas les mêmes. Il en va de même avec une distribution gaussienne. Tu peux prendre un lien log et tu ne retomberas pas du tout sur la même chose.

Code : Tout sélectionner

g1<-glm(m ~ s, family = gaussian(link ="log"))
l1 <- lm(log(m) ~s)
plot(s,m,pch=16,xlab="Année",ylab="Assassinats pour 100 000 habitants",ylim=c(-0.05,40),type="b")
lines(ss, predict(g1, newdata = data.frame(s =ss), type = "response"), col = "green")
lines(ss, exp(predict(l1, newdata = data.frame(s =ss))), col = "blue")

Eric Wajnberg a écrit :4)5) Accessoirement (encore), parler de quasipoisson rajoute juste l'estimation d'un coefficient de surdispersion, mais ne change par l'estimation des paramètres de régression (ça ne change que leur SE). Or vous n'êtes intéressé que par ces coefficients. Si vous avez bien un paramètre de comptage à modéliser, un argument "family=poisson" donnera exactement la même chose.
Tout a fait d'accord, mais je trouve étonnant que lorsqu'on fait ce modèle avec une loi de poisson on a un warnings sur le fait qu'il n'y ait pas que des entiers alors qu'on a pas ce problème avec quasipoisson.

Cordialement,
Maxime

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

Re: Modéliser une exponentielle

Messagepar Eric Wajnberg » 31 Jan 2020, 15:08

Oohh, je n'avais pas noté qu'il y avait des données décimales. Alors le modèle poissonnien (family=quasipoisson) est clairement faux, et - effectivement - on se demande comment R fait pour calculer la vraisemblance à maximiser pour estimer les paramètres.

Eric.


Retourner vers « Questions en cours »

Qui est en ligne

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