Why the lm_eqn way of adding Regression line function did not work in my case?

by Gary Guo   Last Updated January 09, 2018 20:26 PM

I ran into a problem when I was writing a function in R. I want to compare two variables in this function and I want to draw the regression line of the comparison. I would also want to add the information of the regression line, including the equation and the R^2. The lm_eqn way I have already tried and it did not work on my case, here is my code when I try it. I do not know why, please help!

lm_eqn <- function(df){
    m <- lm(y ~ x, df);
    eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2, 
     list(a = format(coef(m)[1], digits = 2), 
          b = format(coef(m)[2], digits = 2), 
         r2 = format(summary(m)$r.squared, digits = 3)))
     as.character(as.expression(eq));                 
}

compareFunction <- function(my_dataset, var1, var2) {
    ggplot(data = my_dataset, 
           aes(x = my_dataset[[var1]], 
               y = my_dataset[[var2]])) +
      geom_point() +
      geom_smooth(method = 'lm', formula = 'y ~ x') +
      geom_text(x = 100, y = 100, label = lm_eqn(my_dataset), parse = TRUE)
}
Tags : r ggplot2


Answers 1


Ok it becomes a bit tedious in the comment.

So first I recommend adding some useful sample data: x = runif(100) y = runif(100)+x df = data.frame(x,y)

Then update your lm_eqn function as follows - I removed the as.character of your return value.

lm_eqn <- function(df){
  m <- lm(y ~ x, df);
  eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2, 
                   list(a = format(coef(m)[1], digits = 2), 
                        b = format(coef(m)[2], digits = 2), 
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.expression(eq);                 
}

The compareFunction I would change to use ggitle:

compareFunction <- function(my_dataset, var1, var2) {
  ggplot(data = my_dataset, 
         aes(x = my_dataset[[var1]], 
             y = my_dataset[[var2]])) +
    geom_point() +
    geom_smooth(method = 'lm', formula = 'y ~ x') +
    ggtitle(lm_eqn(my_dataset))
}

Then compareFunction(df,"x","y") yields:

enter image description here

CMichael
CMichael
January 09, 2018 20:24 PM

Related Questions


R - How to find points within specific Contour

Updated May 28, 2015 23:11 PM

How to see the code of a stored plot (ggplot)

Updated May 29, 2015 01:11 AM

R ggplot remove certain items from legend

Updated April 03, 2015 23:11 PM

add second axis label

Updated April 10, 2015 23:11 PM

Error in facet_grid in ggplot2

Updated October 09, 2016 09:11 AM