试图用ggplot2的geom_smooth()显示原始数据和拟合数据(nls + dnorm)

时间:2010-12-07 22:03:39

标签: r ggplot2 curve-fitting least-squares model-fitting

我正在探索一些数据,所以我想要做的第一件事是尝试将正态(高斯)分布拟合到它。这是我第一次在R中尝试这个,所以我一步一步。首先,我预先分类了我的数据:

myhist = data.frame(size = 10:27, counts = c(1L, 3L, 5L, 6L, 9L, 14L, 13L, 23L, 31L, 40L, 42L, 22L, 14L, 7L, 4L, 2L, 2L, 1L) )

qplot(x=size, y=counts, data=myhist)

plot1

由于我需要计数,我需要添加一个归一化因子(N)来扩大密度:

fit = nls(counts ~ N * dnorm(size, m, s), data=myhist, start=c(m=20, s=5, N=sum(myhist$counts)) )   

然后我创建适合显示的数据,一切都很好:

x = seq(10,30,0.2)
fitted = data.frame(size = x, counts=predict(fit, data.frame(size=x)) )
ggplot(data=myhist, aes(x=size, y=counts)) + geom_point() + geom_line(data=fitted)

plot2

当我发现这个线程谈到使用geom_smooth()一步完成所有操作时,我很兴奋,但我无法让它工作:

这是我尝试的......以及我得到的:

ggplot(data=myhist, aes(x=size, y=counts)) + geom_point() + geom_smooth(method="nls", formula = counts ~ N * dnorm(size, m, s), se=F, start=list(m=20, s=5, N=300, size=10))

Error in method(formula, data = data, weights = weight, ...) : 
  parameters without starting value in 'data': counts

错误似乎表明它正在尝试适合观察到的变量,计数,但这没有任何意义,如果我指定一个“起始”值,它可以预测会变得怪异重要的是:

fitting parameters ‘m’, ‘s’, ‘N’, ‘size’, ‘counts’ without any variables

Error in eval(expr, envir, enclos) : object 'counts' not found

知道我做错了什么吗?当然,这不是世界末日,但更少的步骤总是更好,你们总是为这些常见任务提出最优雅的解决方案。

提前致谢!

杰弗里

1 个答案:

答案 0 :(得分:16)

第一个错误表明ggplot2无法在数据中找到公式中使用的变量'count'。

统计发生在映射之后,即尺寸 - > x,和计数 - >收率

以下是在geom_smooth中使用nls的示例:

ggplot(data=myhist, aes(x=size, y=counts)) + geom_point() + 
  geom_smooth(method="nls", formula = y ~ N * dnorm(x, m, s), se=F, 
              start=list(m=20, s=5, N=300)) 

关键是在公式规范中使用x和y而不是大小和计数。