【问题标题】:Adding regression line equation and R2 value添加回归线方程和 R2 值
【发布时间】:2018-06-19 13:17:37
【问题描述】:

我正在尝试在数据集中添加回归线方程和 R 平方值,其中 y 轴值采用对数刻度,就像在这个 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()

这是生成的图:

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

我们将不胜感激。

【问题讨论】:

    标签: r ggplot2 regression


    【解决方案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
    

    结果:

    【讨论】:

    • 谢谢哥们。 R 平方值非常适合,就像在 excel 中一样,但我正在寻找另一种类型的方程。当我使用你给定的方程 y=-9.6+3.7x 时,例如空隙率为 1,我得到的值为 -5.9 ,而不是应有的 1.34e-6。我怎样才能得到一个符合预期结果的方程?提前致谢
    【解决方案2】:

    Raul,@duckmayr 为您的原始问题提供了一个很好的解决方案。他共享的代码按照您的要求进行了所有标记。但现在你问了一个不同的问题。您最初要求 y 轴采用“对数刻度”。他为您提供了一个使用 log10 的解决方案,如果您愿意,可以轻松地将答案更改为 ln(y)。例如:

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

    那么就可以拟合回归方程了:

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

    你的系数当然不会一样...

    调用: lm(公式 = 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()
    

    这会产生

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

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

    我不清楚你为什么认为它应该是 1.34e-6,尽管对于初学者来说,你只给了我们前 23 个观察结果,你所说的是 28

    【讨论】:

      猜你喜欢
      • 2018-08-31
      • 2013-11-11
      • 2015-07-06
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2016-09-26
      相关资源
      最近更新 更多