Les posteurs les plus actifs de la semaine
Eric Wajnberg
 
zezima
 
Nik
 
margotte185
 
c@ssoulet
 
Coco
 
Ayana
 


[Résolu] Je n'arrive pas à faire fitter mes données

Voir le sujet précédent Voir le sujet suivant Aller en bas

[Résolu] Je n'arrive pas à faire fitter mes données

Message par zezima le Mar 24 Oct 2017 - 9:57

Bonjour,

J'ai plusieurs jeux de données que j'aimerais faire fitter sur un modèle.
Il s'agit d'un effet sur le temps.

Mon modèle a du mal à fitter lorsqu'il y a peu de points (temps de mesure).

J'arrive à le faire fitter sur 21 points, sur 6 points également mais pas sur 4 points :

Code:

###Fit our scenarios
#21 time points
par(mfrow=c(2,1))
d=0:20
s0=52
y=c(52,62.5,65.5,66.4,65.5,64.5,63.5,62.7,61.7,60.7,59.7,58.7,57.7,56.9,55.9,54.9,54.1,53.5,52.5,52.2,52)
plot(d,y,ylab="",xlab="",ylim=c(50,70));abline(h=66.4)
a_start=1.02
Ssym_start=15
r_start=0.5
m<-nls(y~52-(a*d-Ssym*(1-exp(-r*d))),start=list(a=a_start,Ssym=Ssym_start,r=r_start))
cor(y,predict(m))
plot(d,y,ylab="",xlab="",ylim=c(50,70));abline(h=66.4)
lines(d,predict(m),col="red",lty=2,lwd=3)

a=summary(m)[11][[1]][1]
Ssym=summary(m)[11][[1]][2]
r=summary(m)[11][[1]][3]


#6 time points
par(mfrow=c(2,1))
d=0:5
s0=52
y=c(52,58.5,62.5,64.5,65.5,66.4)
plot(d,y,ylab="",xlab="",ylim=c(50,70));abline(h=66.4)
a_start=1.02
Ssym_start=15
r_start=0.5
m<-nls(y~52-(a*d-Ssym*(1-exp(-r*d))),start=list(a=a_start,Ssym=Ssym_start,r=r_start), control = list(maxiter = 500),trace = TRUE)
cor(y,predict(m))

d=0:20
a=summary(m)[11][[1]][1]
Ssym=summary(m)[11][[1]][2]
r=summary(m)[11][[1]][3]
y=s0-(a*d-Ssym*(1-exp(-r*d)))
plot(y,ylim=c(50,70));abline(h=66.4)
lines(y,col="red",lty=2,lwd=3)


#4 time points
par(mfrow=c(2,1))
d=0:3
s0=52
y=c(52,62.5,64.5,66.4)
plot(d,y,ylab="",xlab="",ylim=c(50,70));abline(h=66.4)
a_start=1.02
Ssym_start=15
r_start=0.5
m<-nls(y~52-(a*d-Ssym*(1-exp(-r*d))),start=list(a=a_start,Ssym=Ssym_start,r=r_start), control = list(maxiter = 500),trace = TRUE)
###LE MODELE NE FIT PAS
cor(y,predict(m))

d=0:20
a=summary(m)[11][[1]][1]
Ssym=summary(m)[11][[1]][2]
r=summary(m)[11][[1]][3]
y=s0-(a*d-Ssym*(1-exp(-r*d)))
plot(y,ylim=c(50,70));abline(h=66.4)
lines(y,col="red",lty=2,lwd=3)

La fonction nls() tourne en rond et finit par bloquer sur une des itérations.

Sauriez-vous si le problème vient du nombre de points que j'utilise pour fitter mes données, de la paramétrisation de départ de mes paramètres (avant de lancer la fonction nls()) ou bien d'une autre raison que je n'aurais pas identifié ?

Malheureusement je ne peux pas théoriquement augmenter mon nombre de points (4 est le maximum).

Merci d'avance


Dernière édition par zezima le Mar 24 Oct 2017 - 13:09, édité 2 fois (Raison : J'avais écrit "times" au lieu de "time" points, désolé)
avatar
zezima

Nombre de messages : 747
Date d'inscription : 26/02/2013

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: [Résolu] Je n'arrive pas à faire fitter mes données

Message par zezima le Mar 24 Oct 2017 - 12:14

Il semblerait que je n'ai aucun résidus et que c'est cela qui fait buguer le fit.

Le modèle ne fit pas mais j'ai tout de même une liste avec des valeurs pour les paramètres donnés (celle donnée par control=list(maxiter=500) mais je ne sais pas comment récupérer ces valeur automatiquement étant donné que le modèle ne converge pas.
avatar
zezima

Nombre de messages : 747
Date d'inscription : 26/02/2013

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: [Résolu] Je n'arrive pas à faire fitter mes données

Message par zezima le Mar 24 Oct 2017 - 13:07

Solution

La fonction nls() n'aime pas les régression sans erreurs, il faut donc ajouter un aléa (j'ai fait l'erreur de vouloir fitter des données issues de la fonction du modèle... oui, je sais...).

On peut faire :

Code:
#4 time points
par(mfrow=c(2,1))
d=0:3
s0=52
y=c(52,62.5,65.5,66.4)
y=y+rnorm(length(d), sd = 0.01)
plot(d,y,ylab="",xlab="",ylim=c(50,70));abline(h=66.4)
a_start=1
Ssym_start=20
r_start=0.25
m<-nls(y~52-(a*d-Ssym*(1-exp(-r*d))),start=list(a=a_start,Ssym=Ssym_start,r=r_start), control = list(maxiter = 500),trace = TRUE)
cor(y,predict(m))

d=0:20
a=summary(m)[11][[1]][1]
Ssym=summary(m)[11][[1]][2]
r=summary(m)[11][[1]][3]
y=s0-(a*d-Ssym*(1-exp(-r*d)))
plot(y,ylim=c(50,70));abline(h=66.4)
lines(y,col="red",lty=2,lwd=3)

Ici l'aléa est y=y+rnorm(length(d),sd=0.001)

Plus de messages d'erreur de type :
"number of iterations exceeded maximum of 100"
"singular gradient"
avatar
zezima

Nombre de messages : 747
Date d'inscription : 26/02/2013

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: [Résolu] Je n'arrive pas à faire fitter mes données

Message par zezima le Mar 21 Nov 2017 - 14:36

Bonjour, pour ceux ayant toujours des problèmes à faire fitter un modèle car les données semblent trop éloignées des modèles possibles, il y a le package nls2 qui force le fit à l'aide de la méthode du maximum de vraisemblance.
On peut proposer un panel de valeurs pour chaque paramètre et le fit se fait sur le groupe de valeurs de paramètres qui minimise le Residual Sum of Squares.
avatar
zezima

Nombre de messages : 747
Date d'inscription : 26/02/2013

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: [Résolu] Je n'arrive pas à faire fitter mes données

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum