geom_smooth 与 nls 单独给出不同的拟合
geom_smooth gives different fit than nls alone
因为我想单独拥有 nls 模型,所以我在 geom_smooth 函数内部和 ggplot 外部对我的数据进行了拟合:
library(ggplot2)
set.seed(1)
data <- data.frame(x=rnorm(100))
a <- 4
b <- -2
data$y <- with(data, exp(a + b * x) + rnorm(100) + 100)
mod <- nls(formula = y ~ (exp(a + b * x)), data = data, start = list(a = a, b = b))
data$fit <- predict(mod, newdata=data)
plot <- ggplot(data, aes(x=x, y=y)) +
geom_point() +
geom_smooth(method = "nls", colour = "red", formula=y ~ exp(a + b * x),
method.args = list(start = c(a = a, b = b)), se=F, span=0) +
geom_line(aes(x=x, y=fit), colour="blue") +
scale_y_log10()
我只是想知道为什么这两种方法虽然具有相同的参数,但却给出不同的拟合? geom_smooth 是否使用了一些转换?
geom_smooth
不根据原始数据集进行预测,而是制作一个数据集进行预测。默认情况下,此数据集有 80 行,但您可以使用 n
参数更改它。
要查看通过geom_smooth
拟合的模型和通过nls
拟合的模型相同,您需要使用相同的数据集进行预测。你可以通过ggplot_build
拉出geom_smooth
使用的那个。用于预测的数据集是列表中的第二个。
dat2 = ggplot_build(plot)$data[[2]]
现在使用 dat2
从 nls 模型进行预测并重新制作绘图。
dat2$fit2 = predict(mod, newdata = dat2)
ggplot(data, aes(x=x, y=y)) +
geom_point() +
geom_smooth(method = "nls", colour = "red", formula=y ~ exp(a + b * x),
method.args = list(start = c(a = 4, b = -2)), se = FALSE) +
geom_line(data = dat2, aes(x=x, y=fit2), colour="blue")
请注意,如果您想在将 geom_smooth
与预测线进行比较时以 log10 比例显示,您需要使用 coord_trans(y = "log10")
而不是 scale_y_log10
。比例转换发生在 之前 模型拟合,因此如果您使用 scale_y_log10
.
,您会将模型拟合到 log10 转换后的 y
因为我想单独拥有 nls 模型,所以我在 geom_smooth 函数内部和 ggplot 外部对我的数据进行了拟合:
library(ggplot2)
set.seed(1)
data <- data.frame(x=rnorm(100))
a <- 4
b <- -2
data$y <- with(data, exp(a + b * x) + rnorm(100) + 100)
mod <- nls(formula = y ~ (exp(a + b * x)), data = data, start = list(a = a, b = b))
data$fit <- predict(mod, newdata=data)
plot <- ggplot(data, aes(x=x, y=y)) +
geom_point() +
geom_smooth(method = "nls", colour = "red", formula=y ~ exp(a + b * x),
method.args = list(start = c(a = a, b = b)), se=F, span=0) +
geom_line(aes(x=x, y=fit), colour="blue") +
scale_y_log10()
我只是想知道为什么这两种方法虽然具有相同的参数,但却给出不同的拟合? geom_smooth 是否使用了一些转换?
geom_smooth
不根据原始数据集进行预测,而是制作一个数据集进行预测。默认情况下,此数据集有 80 行,但您可以使用 n
参数更改它。
要查看通过geom_smooth
拟合的模型和通过nls
拟合的模型相同,您需要使用相同的数据集进行预测。你可以通过ggplot_build
拉出geom_smooth
使用的那个。用于预测的数据集是列表中的第二个。
dat2 = ggplot_build(plot)$data[[2]]
现在使用 dat2
从 nls 模型进行预测并重新制作绘图。
dat2$fit2 = predict(mod, newdata = dat2)
ggplot(data, aes(x=x, y=y)) +
geom_point() +
geom_smooth(method = "nls", colour = "red", formula=y ~ exp(a + b * x),
method.args = list(start = c(a = 4, b = -2)), se = FALSE) +
geom_line(data = dat2, aes(x=x, y=fit2), colour="blue")
请注意,如果您想在将 geom_smooth
与预测线进行比较时以 log10 比例显示,您需要使用 coord_trans(y = "log10")
而不是 scale_y_log10
。比例转换发生在 之前 模型拟合,因此如果您使用 scale_y_log10
.