我有以下数据表。我已经使用 ggplot2 对其进行了可视化。 我想知道当 y = 1 时,标准误差(se)和回归曲线的下边界对应的 x 轴值分别是多少?
library(tidyverse)
set.seed(114)
tableInput <- tibble(
x = sample(60:270,100,replace = T) %>% sort(decreasing = F),
y = rnorm(100,1,1) %>% abs(),
)
ggplot(tableInput, aes(x,y)) +
geom_smooth(method = lm) +
geom_hline(yintercept = 1) +
scale_x_continuous(n.breaks = 10) +
coord_cartesian(ylim = c(.5,2),xlim = c(50,280)) +
theme_classic()
基础 R 中的解决方案是使用
optimize
来查找 x
的值,从而给出所需的 y
值。
我们首先编写一个函数,当回归线位于
y = 1
时,该函数将达到最小值。
f1 <- function(val) {
mod <- lm(y ~ x, tableInput)
pred <- predict(mod, newdata = data.frame(x = val), se = TRUE)
(1 - pred$fit)^2
}
我们可以对 SE 功能区的下边框执行相同的操作,如下所示:
f2 <- function(val) {
mod <- lm(y ~ x, tableInput)
pred <- predict(mod, newdata = data.frame(x = val), se = TRUE)
(1 - (pred$fit + qnorm(0.025) * pred$se.fit))^2
}
现在我们可以使用
optimize
自动找到正确的 x 值:
x_regress <- optimize(f1, c(50, 275))$minimum
x_lower <- optimize(f2, c(50, 275))$minimum
x_regress
#> [1] 208.0677
x_lower
#> [1] 157.8854
我们可以通过将它们添加为绘图注释来确认这些是否正确:
ggplot(tableInput, aes(x,y)) +
geom_smooth(method = lm) +
geom_hline(yintercept = 1) +
scale_x_continuous(n.breaks = 10) +
annotate('point', x = c(x_regress, x_lower), y = 1, col = 'red') +
coord_cartesian(ylim = c(.5,2),xlim = c(50,280)) +
theme_classic()