2017-03-08 26 views
2

因为我想单独有NLS模型,我做了一个适合我的数据geom_smooth功能外ggplot内:geom_smooth给出不同的配合比单独NLS

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是否使用了一些转换?

+1

是因为秤?如果您删除+ scale_y_log10(),则这些线条看起来更相似。 – user3640617

+0

当然,但结果仍然不相等,尽管输入是相同的。 – c0bra

回答

7

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于预测线时要显示的日志10的规模,你需要使用coord_trans(y = "log10"),而不是scale_y_log10。如果您使用scale_y_log10,则在模型拟合之前会发生尺度转换,因此如果您使用,则将适合log10转换的模型。

+0

只是'coord_trans'和'scale_y_log10'之间的区别是有差别的。谢谢。 – c0bra