2012-04-03 2 views
0

Я пытаюсь построить линию экспоненциального распада (с ошибками) на диаграмму рассеяния в ggplot информации о ценах с течением времени. Сейчас у меня это:Как я могу накладывать модели временных рядов на экспоненциальный распад на графику ggplot2?

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 - дата.)

Есть ли удобный способ установки экспоненциальных моделей временного роста/распада в графиках ggplot в вызове функции geom_smooth (formula = formula)?

+0

может быть 'geom_smooth (метод =«GLM», семья = гауссова (ссылка =" Журнал "))'? –

+0

(воспроизводимый пример будет приятным.) –

+0

Это выглядит многообещающим --- знаете ли вы синтаксис для указания начальных значений? Когда я попытался с настройками по умолчанию, я увидел «Ошибка в eval (expr, envir, enc)): не может найти правильные начальные значения: укажите ' – Mittenchops

ответ

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

Perfect! Оказывается, это совсем не соответствует моим данным, но это, безусловно, правильный ответ. знак равно – Mittenchops

Смежные вопросы