0

I am trying to add the regression line equation and the R square value in a dataset with y axe values in logarithmic scale, like in this excel example:

this is what i want to obtain in R, done with excel.

Data frame contains the following data, with 3 variables and 28 obs.:

 Method void.ratio permeability_m.s 1 Constant load 1.360 1.82e-05 2 Constant load 1.360 1.79e-05 3 Constant load 1.190 7.74e-06 4 Constant load 1.190 5.15e-06 5 Variable load 1.040 1.57e-06 6 Variable load 1.040 1.71e-06 7 Variable load 1.040 1.57e-06 8 Variable load 1.040 1.71e-06 9 Triaxial test 0.780 3.00e-07 10 Triaxial test 0.780 2.70e-07 11 Oedometric test 1 0.690 1.33e-07 12 Oedometric test 1 0.685 5.84e-08 13 Oedometric test 2 0.697 3.35e-07 14 Oedometric test 2 0.629 2.85e-07 15 Oedometric test 2 0.554 7.75e-08 16 Oedometric test 2 0.526 3.27e-09 17 Oedometric test 2 0.528 4.71e-09 18 Oedometric test 2 0.530 4.72e-09 19 Oedometric test 2 0.534 6.70e-09 20 Oedometric test 3 0.705 1.34e-07 21 Oedometric test 3 0.648 1.23e-07 22 Oedometric test 3 0.574 8.29e-08 23 Oedometric test 3 0.530 8.77e-08 

After running the following code I only obtain the regression line, but I am not able to obtain the regression equation and the R square value.

R code:

plot_lab_permeability2<- ggplot(Lab_permeability2,aes(void.ratio, permeability_m.s))+ geom_point(size=3,aes(shape = Method, colour = Method))+ geom_smooth(method="lm",formula= (y ~ x), se=FALSE, linetype = 8,color="grey") + scale_shape_manual("",breaks = c("Constant load","Variable load","Triaxial test","Oedometric test 1","Oedometric test 2","Oedometric test 3"), values=c("Constant load"=15,"Variable load"=17,"Triaxial test"=18,"Oedometric test 1"=16,"Oedometric test 2"=16,"Oedometric test 3"=16))+ scale_colour_manual("",breaks = c("Constant load","Variable load","Triaxial test","Oedometric test 1","Oedometric test 2","Oedometric test 3"), values = c("Constant load"="darkblue","Variable load"="blue","Triaxial test"="darkgreen","Oedometric test 1"="darkred","Oedometric test 2"="red","Oedometric test 3"="orange"))+ scale_y_continuous(limits = c((1e-9),(1e-4)), trans="log10") + labs(x=expression ("Void ratio (-)"),y = expression ("Saturated hydraulic conductivity (m/s)"),title="") + theme_bw() 

This is the generated plot: plot generated with R

I have been reading similar questions and trying differents approaches, but after hours trying, I am not able to find the solution.

Any help will be highly appreciated.

2 Answers 2

1

You can steal/slightly modify a function used by a SO question asker here:

library(ggplot2) lm_eqn <- function(df, model_fit){ # From a past Stack Overflow question eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2, list(a = format(coef(model_fit)[1], digits = 2), b = format(coef(model_fit)[2], digits = 2), r2 = format(summary(model_fit)$r.squared, digits = 3))) as.character(as.expression(eq)); } # I think you intend to log transform here? model_fit <- lm(log10(permeability_m.s) ~ void.ratio, Lab_permeability2) plot_lab_permeability2 <- ggplot(Lab_permeability2, aes(void.ratio, permeability_m.s)) + geom_point(size=3,aes(shape = Method, colour = Method))+ geom_smooth(method="lm",formula= (y ~ x), se=FALSE, linetype = 8,color="grey") + scale_shape_manual("",breaks = c("Constant load","Variable load","Triaxial test","Oedometric test 1","Oedometric test 2","Oedometric test 3"), values=c("Constant load"=15,"Variable load"=17,"Triaxial test"=18,"Oedometric test 1"=16,"Oedometric test 2"=16,"Oedometric test 3"=16))+ scale_colour_manual("",breaks = c("Constant load","Variable load","Triaxial test","Oedometric test 1","Oedometric test 2","Oedometric test 3"), values = c("Constant load"="darkblue","Variable load"="blue","Triaxial test"="darkgreen","Oedometric test 1"="darkred","Oedometric test 2"="red","Oedometric test 3"="orange"))+ scale_y_continuous(limits = c((1e-9),(1e-4)), trans="log10") + labs(x=expression ("Void ratio (-)"),y = expression ("Saturated hydraulic conductivity (m/s)"),title="") + geom_text(aes(x = 0.55, y = 0.5e-4, label = lm_eqn(Lab_permeability2, model_fit)), size=5, hjust=0, parse = TRUE, check_overlap = TRUE) + theme_bw() plot_lab_permeability2 

Result:

enter image description here

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks man. The R square value fits well, like in excel, but I was searching for another type of equation.When I use your given equation y=-9.6+3.7x, for example with void ratio 1, I am getting a value of -5.9, instead of 1.34e-6 as it should be. How can I get an equation that fits with the expected result? Thanks in advance
0

Raul, @duckmayr has given you a nice solution to your original ask. The code he shared does all the labelling as you requested. But now you're asking a different question. You originally asked for the y axis to be in "logarithmic scale". He gave you a solution that used log10, trivial to change the answer to ln(y) if you prefer. For example:

Lab_permeability2$lnperm <- log(Lab_permeability2$permeability_m.s) 

Then you can fit the regression equation:

model_fit <- lm(lnperm ~ void.ratio, Lab_permeability2) 

Your coefficients will of course not be the same...

Call: lm(formula = lnperm ~ void.ratio, data = Lab_permeability2)

Coefficients: (Intercept) void.ratio
-21.993 8.406

and you should change the axis to show ln

ggplot(Lab_permeability2, aes(void.ratio, lnperm)) + geom_point(size=3,aes(shape = Method, colour = Method))+ geom_smooth(method="lm",formula= (y ~ x), se=FALSE, linetype = 8,color="grey") + scale_shape_manual("",breaks = c("Constant load","Variable load","Triaxial test","Oedometric test 1","Oedometric test 2","Oedometric test 3"), values=c("Constant load"=15,"Variable load"=17,"Triaxial test"=18,"Oedometric test 1"=16,"Oedometric test 2"=16,"Oedometric test 3"=16)) + scale_colour_manual("",breaks = c("Constant load","Variable load","Triaxial test","Oedometric test 1","Oedometric test 2","Oedometric test 3"), values = c("Constant load"="darkblue","Variable load"="blue","Triaxial test"="darkgreen","Oedometric test 1"="darkred","Oedometric test 2"="red","Oedometric test 3"="orange")) + # scale_y_continuous(limits = c((1e-9),(1e-4)), trans="log") + labs(x=expression ("Void ratio (-)"),y = expression ("Natural Log Saturated hydraulic conductivity (m/s)"),title="") + geom_text(aes(x = 0.55, y = -12, label = lm_eqn(Lab_permeability2, model_fit)), size=5, hjust=0, parse = TRUE, check_overlap = TRUE) + theme_bw() 

This produces

R Plot Sample

So for a void.ratio value of 1.0 we would expect 8.406 - 21.993 = -13.587 which appears to be what the graph shows... to convert back to the original scale

exp(8.406 - 21.993) [1] 1.256727e-06 

I'm not clear on why you think it should be 1.34e-6 although for starters you only gave us the first 23 observations of what you said were 28

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.