指数拟合ggplot R [英] exponential fit in ggplot R

查看:779
本文介绍了指数拟合ggplot R的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直试图使用ggplot和geom_smooth将指数曲线拟合到我的数据。我试图复制类似问题的答案( geom_smooth和指数拟合
,但不断收到以下错误消息:

 > (x,y,offset = offset,singular.ok = singular.ok,...):
NA / NaN / Inf in'x'

我不明白错误,因为那里在数据集中不是NA / NaN / Inf值:

 > df 
xy
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
2008 2008 6.967503
12 2009 5.358961
13 2010 3.519295
14 2011 7.137202
15 2012 19.121631
16 2013 6.479928


解决方案

设置数据: (x = c(1981,1990,2000:2013),
y = c(x,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.121 631,6.479928))

问题是,大于约709的任何数的幂给出的数大于最大值可作为双精度浮点值存储(约。 1e308),并因此导致数字溢出。您可以通过移动您的x变量来轻松地进行补救:

  lm(y〜exp(x),data = dd)##错误
lm(y〜exp(x-1981),data = dd)## fine



<但是,您可以更容易地绘制该模型的拟合值,如下所示:

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


I've been trying to fit an exponential curve to my data using ggplot and geom_smooth. I'm trying to replicate the answer to a similar problem (geom_smooth and exponential fits) but keep getting following error message:

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

I don't understand the error, as there is not NA/NaN/Inf values in the dataset:

>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

解决方案

Set up data:

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))

The problem is that exponentiating any number larger than about 709 gives a number greater than the maximum value storeable as a double-precision floating-point value (approx. 1e308), and hence leads to a numeric overflow. You can easily remedy this by shifting your x variable:

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

However, you can plot the fitted value for this model more easily as follows:

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

这篇关于指数拟合ggplot R的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆