modèle non linaire

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

safaa NAJLA
Messages : 19
Enregistré le : 02 Sep 2008, 13:34

modèle non linaire

Messagepar safaa NAJLA » 23 Sep 2008, 15:30

bonjour,

j'essaie d'ajuster un modèle non linaire, et toujours j'ai un message d'erreur..
voici :


[> fit<-nls(obs$FDW(a*exp(b*obs$Diameter)),start=list(a=0,b=0),data=obs)

Erreur dans numericDeriv(form[[3]], names(ind), env) :
Valeur manquante ou infinie obtenue au cours du calcul du mod�le
De plus : Warning message:
la longueur de l'objet le plus long
n'est pas un multiple de la longueur de l'objet le plus court in: .swts
* (lhs - rhs)
> >
]

Il s'agit de quoi ??

Merci de me répondre

[/i]

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Messagepar jean lobry » 23 Sep 2008, 17:22

Bonjour,

difficile de répondre sans savoir ce qu'il y a dans l'objet obs. Que donne le résultat de la commande dput(obs) ?

Jean

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

Messagepar Logez Maxime » 24 Sep 2008, 06:37

Bonjour,


Je ne sais pas exactement d'ou vien ton problèmùe maios déjà tu as un souci dans la formule. Su moment que FDW et Diameter sont dans le tableau obs que tu as spécifier en data tu n'as pas besoin de rajouter obs$ dans la formule. Ensuite tu peux aussi changer les valeurs de départ, plutôt que (0,0) tu peux mettre en première approximation les valeurs issues d'une régression linéaires sur le log de FDW :

Code : Tout sélectionner

x <- seq(2, 10, by = 0.1)

y <- 0.15 * exp(0.25 * x)
y <- y+rnorm(length(x), 0, 0.1)
obs <- data.frame(FDW = y, Diameter = x)

lm1 <- lm(log(FDW) ~ Diameter, data = obs)

starts <- coefficients(lm1)
names(starts) <- c("a","b")
starts[1] <- exp(starts[1])

fit<-nls(FDW ~ a * exp(b * Diameter), start = starts, data = obs)


Maxime

safaa NAJLA
Messages : 19
Enregistré le : 02 Sep 2008, 13:34

Messagepar safaa NAJLA » 24 Sep 2008, 06:46

bonjour,

quand je fait dput(obs) j'aurai mes données comme ça :

structure(list(Diameter = c(20.4, 23, 20.1, 18.7, 21.9, 22.9,
21, 20.4, 16.2, 22.8, 29.6, 28.2,........ etc), FDW =c(0.93, 1.19, 0.82, 0.68, 1, 1.25, 1.12, 0.97, 0.53, 1.37, 2.14, 2.03,
1.92, 1.7, 2.17, 2.24, 2.19,...etc)), .Names= c("Diameter", "FDW"), class = "data.frame", row.names = c("1","2", "3", "4","5", "6", "7", "8", "9", "10", "11", "12", "13","14", "15",... "892"))


Merci

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Messagepar jean lobry » 24 Sep 2008, 16:45

Bonjour,

safaa NAJLA a écrit :[...]
quand je fait dput(obs) j'aurai mes données comme ça :
[...]


l'intérêt de la fonction dput() est qu'elle donne une représentation des tes données qui est facilement utilisable par un simple copier/coller dans R par d'autres utilisateurs pour essayer de reproduire tes résultats. Mais ici tu as 892 lignes, ce qui est peut être un peu long pour un message dans ce forum (j'imagine qu'il y a une taille maximum à ne pas dépasser). Mais je peux déjà essayer avec les 12 premières lignes qui sont documentées :

Code : Tout sélectionner

obs.mini <- structure(list(Diameter = c(20.4, 23, 20.1, 18.7, 21.9, 22.9,
 21, 20.4, 16.2, 22.8, 29.6, 28.2), FDW =c(0.93, 1.19, 0.82, 0.68, 1, 1.25, 1.12, 0.97, 0.53, 1.37, 2.14, 2.03)), .Names= c("Diameter", "FDW"), class = "data.frame", row.names = c("1","2", "3", "4","5", "6", "7", "8", "9", "10", "11", "12"))

obs.mini
   Diameter  FDW
1      20.4 0.93
2      23.0 1.19
3      20.1 0.82
4      18.7 0.68
5      21.9 1.00
6      22.9 1.25
7      21.0 1.12
8      20.4 0.97
9      16.2 0.53
10     22.8 1.37
11     29.6 2.14
12     28.2 2.03

fit <- nls(obs.mini$FDW(a*exp(b*obs.mini$Diameter)),start=list(a=0,b=0),data=obs.mini))

#
# Me donne en R version 2.7.2 :
#
# Error in inherits(object, "formula") :
#  tentative d'appliquer un objet qui n'est pas une fonction


Donc je n'arrive pas à reproduire ton message d'erreur. Peut être utilises tu une version de R un peu ancienne (je suis un peu surpris que les row.names de ton data.frame ne soient pas codés de façon plus compacte par 1:892, c'est un point qui a été modifié depuis pas mal de temps il me semble). Quoi qu'il en soit, la solution de Maxime semble a priori très bien marcher ici :

Code : Tout sélectionner

lm1 <- lm(log(FDW) ~ Diameter, data = obs.mini)

starts <- coefficients(lm1)
names(starts) <- c("a","b")
starts[1] <- exp(starts[1])
 
fit <- nls(FDW ~ a * exp(b * Diameter), start = starts, data = obs.mini)
fit

#
# Me donne :
#
# Nonlinear regression model
#  model:  FDW ~ a * exp(b * Diameter)
#   data:  obs.mini
#     a      b
# 0.1363 0.0946
# residual sum-of-squares: 0.1121
#
# Number of iterations to convergence: 4
# Achieved convergence tolerance: 1.305e-06


Essaye la même chose avec ton jeu de données complet tout simplement.

Amicalement,

Jean

safaa NAJLA
Messages : 19
Enregistré le : 02 Sep 2008, 13:34

Messagepar safaa NAJLA » 25 Sep 2008, 07:16

Merci pour votre réponse.

Le probléme était dans le parenthèse, et aussi les valeurs de start.


Merci beaucoup à tous. [/img]


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité