Search code examples
rtrendline

How do I add different trend lines in R?


I know how to add a linear trend line using the lm and abline functions, but how do I add other trend lines, such as, logarithmic, exponential, and power trend lines?


Solution

  • Here's one I prepared earlier:

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

    Add a descriptive legend:

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

    Result:

    enter image description here

    A generic and less long-hand way of plotting the curves is to just pass x and the list of coefficients to the curve function, like:

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