添加回归线方程和R2值

时间:2018-01-10 11:16:53

标签: r ggplot2 regression

我试图在数据集中添加回归线方程和R平方值,其中y轴值以对数标度表示,就像在这个excel示例中一样:

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

数据框包含以下数据,包含3个变量和28个障碍物:

          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

运行以下代码后,我只获得回归线,但我无法获得回归方程和R平方值。

R代码:

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

这是生成的情节: plot generated with R

我一直在阅读类似的问题并尝试不同的方法,但经过几个小时的尝试,我无法找到解决方案。

任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

您可以窃取/稍微修改SO提问者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

结果:

enter image description here

答案 1 :(得分:0)

劳尔,@ dukemayr为你原来的问题提供了一个很好的解决方案。他共享的代码按照您的要求执行所有标签。但是现在你问了一个不同的问题。您最初要求y轴处于&#34;对数刻度&#34;。他给了你一个使用log10的解决方案,如果你愿意,可以将答案改为ln(y)。例如:

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

然后你可以拟合回归方程:

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

你的系数当然不会相同......

  

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

     

系数:   (拦截)void.ratio
     -21.993 8.406

你应该改变轴来显示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()

这会产生

R Plot Sample

因此,对于1.0的void.ratio值,我们可以预期8.406 - 21.993 = -13.587,这似乎是图表显示的...转换回原始比例

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

我不清楚为什么你认为它应该是1.34e-6虽然对于初学者你只给了我们前面23个你所说的28个观察