r - geom_smooth 提供与单独的 nls 不同的拟合

标签 r ggplot2 nls

因为我想单独拥有 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()

enter image description here

我只是想知道为什么这两种方法虽然具有相同的参数,却给出了不同的拟合? geom_smooth 是否使用了一些转换?

最佳答案

geom_smooth 不会根据原始数据集进行预测,而是制作数据集进行预测。默认情况下,此数据集有 80 行,但您可以使用 n 参数进行更改。

要查看通过 geom_smooth 拟合的模型和通过 nls 拟合的模型是否相同,您需要使用相同的数据集进行预测。您可以通过 ggplot_buildgeom_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")

enter image description here

请注意,如果您想在将 geom_smooth 与预测线进行比较时以 log10 比例显示,您需要改用 coord_trans(y = "log10") scale_y_log10。比例变换发生在 模型拟合之前,因此如果您使用 scale_y_log10,您将模型拟合到 log10 变换的 y。

关于r - geom_smooth 提供与单独的 nls 不同的拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42673665/

相关文章:

删除反向重复行

r - 根据 R 中的行差异对行进行分组

r - ggplot2 facet_wrap 带有两个嵌套变量 : use different strip. 每个变量的位置/开关?

R nls 奇异梯度

r - 一张 ggplot 包含多个数据集

R:如何按列值划分数据框?

r - 具有箱线图类型分组的点范围图

r - 在 R 中调整帕累托图上的第二个 y 轴

R - 使用嵌套数据框运行具有不同参数集的函数

r - 2条曲线同时非线性回归