提问人:Gage R. Coon 提问时间:10/13/2023 最后编辑:Pedro J. AphaloGage R. Coon 更新时间:10/14/2023 访问量:65
如何强制 'stat_poly_line()' 使用特定的非零 y 截距?
How to force `stat_poly_line()` to use a specific non-zero y-intercept?
问:
使用包“ggpmisc”,默认情况下可以使用 as 方法将多项式拟合到数据。您可以使用以下任一方法强制拟合通过零: 或 。对于我的线性模型,我无法强制它通过特定的非零 y 轴截距。在这种情况下,我需要强制它通过 5.05。stat_poly_line()
lm()
formula = y ~ x + 0
formula = 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 端使用它也行不通。
我可以相对较快地使用另一个包,但我觉得我可以在这里实现一个简单的解决方案。
有什么帮助吗?
答:
有趣的问题!你是对的,因为在“ggpmisc”中有一个解决方案。然而,可能需要一点熟悉才能感觉简单......
stat_poly_line()
默认情况下使用 AS 方法。因此,与做您想要的直接方法一样,是从所有 y 值中减去 5.05,与 .拟合的斜率将是您想要的斜率,截距为 5.05。因此,您可以用作 .要绘制正确的线,需要将减去的值加回预测值,这些预测值由统计数据返回。对于方程,需要使用一些技巧来编辑统计量返回的方程标签。lm()
lm()
formula = y ~ x + 0
formula = I(y - 5.05) ~ x + 0
y
plotmath
对于下面的示例,我使用了 20 而不是 5.05,因为对于您提供的示例数据来说,感觉更合理。(顺便说一句:可以使用并且有效,但需要在我的示例中添加截距 20,添加到和补充。se=TRUE
ymax
ymin
y
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
评论