2013-02-27 6 views

ответ

38

Вот один я подготовил ранее:

# set the margins 
tmpmar <- par("mar") 
tmpmar[3] <- 0.5 
par(mar=tmpmar) 

# get underlying plot 
x <- 1:10 
y <- jitter(x^2) 
plot(x, y, pch=20) 

# basic straight line of fit 
fit <- glm(y~x) 
co <- coef(fit) 
abline(fit, col="blue", lwd=2) 

# exponential 
f <- function(x,a,b) {a * exp(b * x)} 
fit <- nls(y ~ f(x,a,b), start = c(a=1, b=1)) 
co <- coef(fit) 
curve(f(x, a=co[1], b=co[2]), add = TRUE, col="green", lwd=2) 

# logarithmic 
f <- function(x,a,b) {a * log(x) + b} 
fit <- nls(y ~ f(x,a,b), start = c(a=1, b=1)) 
co <- coef(fit) 
curve(f(x, a=co[1], b=co[2]), add = TRUE, col="orange", lwd=2) 

# polynomial 
f <- function(x,a,b,d) {(a*x^2) + (b*x) + d} 
fit <- nls(y ~ f(x,a,b,d), start = c(a=1, b=1, d=1)) 
co <- coef(fit) 
curve(f(x, a=co[1], b=co[2], d=co[3]), add = TRUE, col="pink", lwd=2) 

Добавить описательную легенду:

# legend 
legend("topleft", 
    legend=c("linear","exponential","logarithmic","polynomial"), 
    col=c("blue","green","orange","pink"), 
    lwd=2, 
    ) 

Результат:

enter image description here

родового и менее длинные руки способа черчения кривые должны просто пройти x и th е список коэффициентов к функции curve, как:

curve(do.call(f,c(list(x),coef(fit))),add=TRUE) 
+0

Это очень полезно. Как я могу использовать этот ответ с осью X x? – pomarc

17

ggplot2 подход с использованием stat_smooth, используя одни и те же данные, как thelatemail

DF <- data.frame(x, y) 



ggplot(DF, aes(x = x, y = y)) + geom_point() + 
    stat_smooth(method = 'lm', aes(colour = 'linear'), se = FALSE) + 
    stat_smooth(method = 'lm', formula = y ~ poly(x,2), aes(colour = 'polynomial'), se= FALSE) + 
    stat_smooth(method = 'nls', formula = y ~ a * log(x) +b, aes(colour = 'logarithmic'), se = FALSE, start = list(a=1,b=1)) + 
    stat_smooth(method = 'nls', formula = y ~ a*exp(b *x), aes(colour = 'Exponential'), se = FALSE, start = list(a=1,b=1)) + 
    theme_bw() + 
    scale_colour_brewer(name = 'Trendline', palette = 'Set2') 

enter image description here

Вы могли бы также соответствовать экспоненциальный линии тренда с использованием glm с функцией связи в журнале

glm(y~x, data = DF, family = gaussian(link = 'log')) 

Для немного удовольствия, вы могли бы использовать theme_excel из ggthemes

library(ggthemes) 
ggplot(DF, aes(x = x, y = y)) + geom_point() + 
    stat_smooth(method = 'lm', aes(colour = 'linear'), se = FALSE) + 
    stat_smooth(method = 'lm', formula = y ~ poly(x,2), aes(colour = 'polynomial'), se= FALSE) + 
    stat_smooth(method = 'nls', formula = y ~ a * log(x) +b, aes(colour = 'logarithmic'), se = FALSE, start = list(a=1,b=1)) + 
    stat_smooth(method = 'nls', formula = y ~ a*exp(b *x), aes(colour = 'Exponential'), se = FALSE, start = list(a=1,b=1)) + 
    theme_excel() + 
    scale_colour_excel(name = 'Trendline', palette = 'Set2') 

enter image description here

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