首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >geom_smooth与单纯的nls不同

geom_smooth与单纯的nls不同
EN

Stack Overflow用户
提问于 2017-03-08 14:14:43
回答 1查看 683关注 0票数 3

因为我想单独使用nls模型,所以我对geom_smooth函数中的数据进行了拟合,并在ggplot之外进行了拟合:

代码语言:javascript
复制
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是否使用某种转换?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-08 16:13:01

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

要确保通过geom_smoothnls匹配的模型是相同的,您需要使用相同的数据集进行预测。您可以通过geom_smooth通过ggplot_build将其提取出来。用于预测的数据集是列表中的第二个。

代码语言:javascript
复制
dat2 = ggplot_build(plot)$data[[2]]

现在使用dat2从nls模型中进行预测并重新绘制图。

代码语言:javascript
复制
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")

请注意,如果您希望在将log10与预测行进行比较时显示geom_smooth,则需要使用coord_trans(y = "log10")而不是scale_y_log10。尺度转换发生在模型拟合之前,因此,如果使用scale_y_log10,则将模型拟合到日志10转换的y中。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42673665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档