web-dev-qa-db-fra.com

Comment ajouter différentes lignes de tendance dans R?

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?

22
clementine

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:

enter image description here

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

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

enter image description here

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

enter image description here

21
mnel