geom_smooth比nls单独给出不同的拟合

c0b*_*bra 3 r nls ggplot2

因为我想分别使用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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

aos*_*ith 8

geom_smooth不会从原始数据集进行预测,而是生成用于预测的数据集.默认情况下,此数据集有80行,但您可以使用n参数更改此行.

要查看模型拟合geom_smooth并且模型拟合nls相同,您需要使用相同的数据集进行预测.你可以拉出geom_smoothout经过的那个ggplot_build.用于预测的数据集是列表中的第二个.

dat2 = ggplot_build(plot)$data[[2]]
Run Code Online (Sandbox Code Playgroud)

现在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")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请注意,如果要在比较geom_smooth预测线时显示log10比例,coord_trans(y = "log10")而不是使用scale_y_log10.缩放变换发生模型拟合之前,因此如果使用的话,您可以将模型拟合到log10变换的y scale_y_log10.