Je sais comment ajouter une ligne de tendance linéaire à l'aide des fonctions lm
et abline
, mais comment ajouter d'autres lignes de tendance, telles que les lignes de tendance logarithmique, exponentielle et de puissance?
Voici celui que j'ai préparé plus tôt:
# 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)
Ajoutez une légende descriptive:
# legend
legend("topleft",
legend=c("linear","exponential","logarithmic","polynomial"),
col=c("blue","green","orange","pink"),
lwd=2,
)
Résultat:
Un moyen générique et moins long de tracer les courbes consiste à simplement passer x
et la liste des coefficients à la fonction curve
, comme:
curve(do.call(f,c(list(x),coef(fit))),add=TRUE)
UNE ggplot2
approche utilisant stat_smooth
, en utilisant les mêmes données que le courrier électronique
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, method.args = list(start = list(a = 1, b = 1))) +
stat_smooth(method = 'nls', formula = y ~ a * exp(b * x), aes(colour = 'Exponential'), se = FALSE, method.args = list(start = list(a = 1, b = 1))) +
theme_bw() +
scale_colour_brewer(name = 'Trendline', palette = 'Set2')
Vous pouvez également ajuster la ligne de tendance exponentielle en utilisant glm
avec une fonction de lien de journal
glm(y ~ x, data = DF, family = gaussian(link = 'log'))
Pour un peu de plaisir, vous pouvez utiliser theme_Excel
à partir de 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, method.args = list(start = list(a = 1, b = 1))) +
stat_smooth(method = 'nls', formula = y ~ a * exp(b * x), aes(colour = 'Exponential'), se = FALSE, method.args = list(start = list(a = 1, b = 1))) +
theme_Excel() +
scale_colour_Excel(name = 'Trendline')