glm 预测与使用相同 glm 的 geom_smooth() 之间的差异
Differences between glm predictions and geom_smooth() using same glm
我正在尝试使用 probit 模型重现其他人的工作。不幸的是,我没有太多关于他们方法的信息,只有他们的起始数据和他们的模型图。
当我在 ggplot 中绘制数据并使用 geom_smooth(method = "glm", ...)
拟合一条线时,我能够重现之前的工作。但是,当我尝试使用 glm()
在 ggplot 之外拟合(我认为是)相同的模型时,我得到了不同的预测。我觉得我犯了一些愚蠢的错误,但我不能完全确定。
这是一个可重现的例子:
library(tidyverse)
set.seed(123)
df <- tibble(x = c(0.006, 0.014, 0.025, 0.05, 0.15, 0.3, 0.5),
y = c(0.4, 0.733, 0.875, 1, 1, 1, 1))
probit_model <- glm(y ~ x, data = df, family = quasibinomial(link = "probit"))
df <- df %>%
add_row(x = 0.001, y = NA) %>% # To underline that these models are different
mutate(y_pred = predict(probit_model, newdata = ., type = "response"))
df %>%
ggplot(aes(x, y)) +
geom_point(size = 4) +
geom_line(aes(y = y_pred), color = "red", lwd = 1) +
geom_smooth(formula = y ~ x, color = "blue",
method = "glm", fullrange = TRUE,
method.args = list(family = quasibinomial(link = "probit"))) +
scale_x_log10(limits = c(0.001, 1))
这是它产生的情节。请注意,蓝线和红线描述了不同的拟合。我相信他们应该相同(忽略红线的分段性质),因为他们使用相同的模型和数据。
我在故障排除过程中阅读了很多主题,许多回复表明 geom_smooth()
不能替代建模。大体上,我同意。也就是说,我明确地试图弄清楚 geom_smooth()
在这里做什么,然后在 ggplot 之外重现它。
我的问题是:
为什么这两个模型不同? geom_smooth()
如何调用 glm()
?我怎样才能自己调用 glm()
来重现 geom_smooth()
正在使用的模型?
模型其实是一样的。如果您设置 xlim(0, 0.1)
并删除 scale_x_log10
,就可以看到这一点。然后你会看到拟合重合。
我认为您看到的行为是因为 scale_x_log10
在 任何统计摘要(例如 geom_smooth
)之前 执行轴变换。因此,当您 运行 scale_x_log10
时,geom_smooth
有效地拟合了模型 y ~ log10(x)
,而不是 y ~ x
。如果您使用 coord_trans(x="log10")
而不是 scale_x_log10
,您还会看到模型一致,因为 coord_trans
在 任何统计摘要之后进行转换 。
我正在尝试使用 probit 模型重现其他人的工作。不幸的是,我没有太多关于他们方法的信息,只有他们的起始数据和他们的模型图。
当我在 ggplot 中绘制数据并使用 geom_smooth(method = "glm", ...)
拟合一条线时,我能够重现之前的工作。但是,当我尝试使用 glm()
在 ggplot 之外拟合(我认为是)相同的模型时,我得到了不同的预测。我觉得我犯了一些愚蠢的错误,但我不能完全确定。
这是一个可重现的例子:
library(tidyverse)
set.seed(123)
df <- tibble(x = c(0.006, 0.014, 0.025, 0.05, 0.15, 0.3, 0.5),
y = c(0.4, 0.733, 0.875, 1, 1, 1, 1))
probit_model <- glm(y ~ x, data = df, family = quasibinomial(link = "probit"))
df <- df %>%
add_row(x = 0.001, y = NA) %>% # To underline that these models are different
mutate(y_pred = predict(probit_model, newdata = ., type = "response"))
df %>%
ggplot(aes(x, y)) +
geom_point(size = 4) +
geom_line(aes(y = y_pred), color = "red", lwd = 1) +
geom_smooth(formula = y ~ x, color = "blue",
method = "glm", fullrange = TRUE,
method.args = list(family = quasibinomial(link = "probit"))) +
scale_x_log10(limits = c(0.001, 1))
这是它产生的情节。请注意,蓝线和红线描述了不同的拟合。我相信他们应该相同(忽略红线的分段性质),因为他们使用相同的模型和数据。
我在故障排除过程中阅读了很多主题,许多回复表明 geom_smooth()
不能替代建模。大体上,我同意。也就是说,我明确地试图弄清楚 geom_smooth()
在这里做什么,然后在 ggplot 之外重现它。
我的问题是:
为什么这两个模型不同? geom_smooth()
如何调用 glm()
?我怎样才能自己调用 glm()
来重现 geom_smooth()
正在使用的模型?
模型其实是一样的。如果您设置 xlim(0, 0.1)
并删除 scale_x_log10
,就可以看到这一点。然后你会看到拟合重合。
我认为您看到的行为是因为 scale_x_log10
在 任何统计摘要(例如 geom_smooth
)之前 执行轴变换。因此,当您 运行 scale_x_log10
时,geom_smooth
有效地拟合了模型 y ~ log10(x)
,而不是 y ~ x
。如果您使用 coord_trans(x="log10")
而不是 scale_x_log10
,您还会看到模型一致,因为 coord_trans
在 任何统计摘要之后进行转换 。