2016-12-12 1 views
0

J'ai essayé d'adapter une courbe exponentielle à mes données en utilisant ggplot et geom_smooth. Je suis en train de reproduire la réponse à un problème similaire (geom_smooth and exponential fits) mais continuer à obtenir message d'erreur suivant:ajustement exponentiel dans ggplot R

> exp.model <-lm(y ~ exp(x), df) 
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
    NA/NaN/Inf in 'x' 

Je ne comprends pas l'erreur, car il n'y a pas des valeurs NA/NaN/Inf dans la ensemble de données:

>df 
     x   y 
1 1981 3.262897 
2 1990 2.570096 
3 2000 7.098903 
4 2001 5.428424 
5 2002 6.056302 
6 2003 5.593942 
7 2004 10.869635 
8 2005 12.425793 
9 2006 5.601889 
10 2007 6.498187 
11 2008 6.967503 
12 2009 5.358961 
13 2010 3.519295 
14 2011 7.137202 
15 2012 19.121631 
16 2013 6.479928 
+0

Je l'ai vu ce poste et a essayé de reproduire l'intrigue, mais a reçu le message d'erreur à nouveau .. – Rabea

+0

@nrussell vous avez marqué ce poste comme doublon, mais j'obtiens un message d'erreur en essayant de répliquer la réponse dans le message visé. J'ai clarifié ci-dessus. – Rabea

+0

L'exponentiation de nombres aussi grands entraînera des débordements à virgule flottante. indice: essayez 'exp.model <-lm (y ~ exp (x-1981), df)' –

Répondre

1

Configurer les données:

dd <- data.frame(x=c(1981,1990,2000:2013), 
    y = c(3.262897,2.570096,7.098903,5.428424,6.056302,5.593942, 
    10.869635,12.425793,5.601889,6.498187,6.967503,5.358961,3.519295, 
    7.137202,19.121631,6.479928)) 

le problème est que exponentiation un nombre supérieur à environ 709 donne un nombre supérieur à la maxime La valeur um peut être enregistrée en tant que valeur à virgule flottante double précision (env. 1e308), et conduit donc à un débordement numérique. Vous pouvez facilement y remédier en changeant votre variable x:

lm(y~exp(x),data=dd) ## error 
lm(y~exp(x-1981),data=dd) ## fine 

Cependant, vous pouvez tracer la valeur ajustée pour ce modèle plus facilement comme suit:

library(ggplot2); theme_set(theme_bw()) 
ggplot(dd,aes(x,y))+geom_point()+ 
    geom_smooth(method="glm", 
      method.args=list(family=gaussian(link="log"))) 
+0

Merci, c'est à peu près ce que je cherchais! – Rabea