0

我正在尝试将指数衰减线(带有误差线)绘制到价格信息随时间推移的 ggplot 散点图上。我目前有这个:

f2 <- ggplot(data, aes(x=date, y=cost) ) +
    geom_point(aes(y = cost), colour="red", size=2) +
    geom_smooth(se=T, method="lm", formula=y~x) +
#   geom_smooth(se=T) +
    theme_bw() +
    xlab("Time") + 
    scale_y_log10("Price over time") +
    opts(title="The Falling Price over time")
print(f2)

关键行在 geom_smooth 命令中,formula=y~x 虽然这看起来像一个线性模型,但 ggplot 似乎会自动检测我的 scale_y_log10 并记录它。

现在,我的问题是日期是日期数据类型。我想我需要将它转换为秒,因为 t=0 才能应用形式的指数衰减模型y = Ae^-(bx)

我相信这一点,因为当我尝试 y = exp(x) 之类的东西时,我收到一条消息,我认为 (?) 告诉我我不能取日期的指数。上面写着:

Error in lm.wfit(x, y, w, offset = offset, singular.ok = singular.ok, : NA/NaN/Inf in foreign function call (arg 1)

但是,log(y) = x可以正常工作。(y 是数字数据类型,x 是日期。)

是否有一种方便的方法可以在 geom_smooth(formula=formula) 函数调用中的 ggplot 图中拟合指数增长/衰减时间序列模型?

4

1 回答 1

5

这似乎可行,尽管我不知道真实/混乱的数据会有多挑剔:

set.seed(101)
dat <- data.frame(d=seq.Date(as.Date("2010-01-01"),
                         as.Date("2010-12-31"),by="1 day"),
                y=rnorm(365,mean=exp(5-(1:365)/100),sd=5))

library(ggplot2)
g1 <- ggplot(dat,aes(x=d,y=y))+geom_point()+expand_limits(y=0)
g1+geom_smooth(method="glm",family=gaussian(link="log"),
               start=c(5,0))
于 2012-04-03T20:48:38.620 回答