如何强制 'stat_poly_line()' 使用特定的非零 y 截距?

How to force `stat_poly_line()` to use a specific non-zero y-intercept?

提问人:Gage R. Coon 提问时间:10/13/2023 最后编辑:Pedro J. AphaloGage R. Coon 更新时间:10/14/2023 访问量:65

问:

使用包“ggpmisc”,默认情况下可以使用 as 方法将多项式拟合到数据。您可以使用以下任一方法强制拟合通过零: 或 。对于我的线性模型,我无法强制它通过特定的非零 y 轴截距。在这种情况下,我需要强制它通过 5.05。stat_poly_line()lm()formula = y ~ x + 0formula = y ~ x - 1

注意:我承认线性模型在强制 y 截距时很少在统计上有用,但就我而言,我相信这很好。

这是我的数据:

mydata <- structure(list(y = c(20.2, 29.74, 22.37, 24.51, 
37.2, 31.43, 43.05, 54.36, 65.44, 67.28, 46.02), x = c(0.422014140000002, 
1.09152966, 1.3195521, 3.54231348, 2.79431778, 3.40756002, 5.58845772, 
7.10762298, 9.70041246, 11.7199653, 15.89668266)), row.names = c(NA, 
-11L), class = c("tbl_df", "tbl", "data.frame"))

这是我的绘图的简化版本:

myplot <- ggplot(mydata, aes(x = x, y = y)) +
  stat_poly_line(se = FALSE, 
                 linetype = "dashed", 
                 na.rm = TRUE, 
                 formula = y ~ x + 0) +
  stat_poly_eq(use_label(c("eq", "R2", "adj.R2")), 
               na.rm = TRUE, 
               formula = y ~ x + 0) +
  geom_point(size = 2.5) 

变量的 x 值为 0,但我尝试在该位置使用 5.05 来表示线性模型在 5.05 处的 y 截距(x + 0 来自有关如何将抛物线截距置于 0 的包指南)。这种方法行不通,在公式的 y 端使用它也行不通。

我可以相对较快地使用另一个包,但我觉得我可以在这里实现一个简单的解决方案。

有什么帮助吗?

r ggplot2 lm ggpmisc

评论


答:

1赞 Pedro J. Aphalo 10/14/2023 #1

有趣的问题!你是对的,因为在“ggpmisc”中有一个解决方案。然而,可能需要一点熟悉才能感觉简单......

stat_poly_line()默认情况下使用 AS 方法。因此,与做您想要的直接方法一样,是从所有 y 值中减去 5.05,与 .拟合的斜率将是您想要的斜率,截距为 5.05。因此,您可以用作 .要绘制正确的线,需要将减去的值加回预测值,这些预测值由统计数据返回。对于方程,需要使用一些技巧来编辑统计量返回的方程标签。lm()lm()formula = y ~ x + 0formula = I(y - 5.05) ~ x + 0yplotmath

对于下面的示例,我使用了 20 而不是 5.05,因为对于您提供的示例数据来说,感觉更合理。(顺便说一句:可以使用并且有效,但需要在我的示例中添加截距 20,添加到和补充。se=TRUEymaxyminy

library(ggpmisc)
#> Loading required package: ggpp
#> Loading required package: ggplot2

mydata <- structure(list(Y = c(20.2, 29.74, 22.37, 24.51, 
                               37.2, 31.43, 43.05, 54.36, 65.44, 67.28, 46.02), 
                         X = c(0.422014140000002, 
                               1.09152966, 1.3195521, 3.54231348, 2.79431778, 
                               3.40756002, 5.58845772, 
                               7.10762298, 9.70041246, 11.7199653, 15.89668266)), 
                    row.names = c(NA, -11L), 
                    class = c("tbl_df", "tbl", "data.frame"))

myplot <- ggplot(mydata) +
  stat_poly_line(se = FALSE, 
                 linetype = "dashed",
                 na.rm = TRUE, 
                 mapping = aes(x = X, y = stage(start = Y, after_stat = y + 20)),
                 formula = I(y - 20) ~ x + 0) +
  stat_poly_eq(mapping = aes(X, Y, 
                    label = after_stat(paste(eq.label, "~+~20*\", \"*", rr.label))), 
               na.rm = TRUE, 
               orientation = "x", 
               formula = I(y - 20) ~ x + 0) +
  geom_point(mapping = aes(X, Y), size = 2.5) +
  ylab("y") +
  expand_limits(y = 0)

myplot

创建于 2023-10-13 with reprex v2.0.2

评论

0赞 Gage R. Coon 10/15/2023
谢谢!这效果很好,再加上教我了解expand_limits功能的额外好处。