r - 用 R &nls 拟合对数正态分布
问题描述
考虑我有这样的数据:
df<-data.frame(x=c(1100,800,600,550,500,350),y=c(0.05,0.17,0.91,0.95,1,0.13))
如何根据对数法线形状/分布拟合曲线
我可以使用 nls 模型,但总是会出错:
fit <-nls(y ~ a*dlnorm(x, mean, sd), data = df,
start = list(mean =0, sd = 10,a=1e4))
非常感谢!
解决方案
我不确定为什么nls
会这样,但您可以直接使用optim
:
opt <- optim(c(1, 1, 1), function(p) sum((dlnorm(df$x, p[1], p[2]) * p[3] - df$y)^2))
opt$par
# [1] 6.3280753 0.2150322 299.3154123
plot(x = df$x, y = df$y, type = 'b', ylim = c(0, 1), xlim = c(0, 1100))
curve(opt$par[3] * dlnorm(x, opt$par[1], opt$par[2]), from = 0, to = 1100, add = TRUE, col = 'red')
推荐阅读
- jsf - p:fileUpload 不适用于同一页面中的 pe:blockUI
- magento - Magento 中缺少购物车信息
- apache-spark - 在 Spark Dataframe 中解码 Base64
- javascript - 如何使用 JavaScript 更改用户代理?
- wpf - 如何在圆形进度条中创建圆形线帽
- hadoop - 如何将 Gobblin 输出分区为 30 分钟分区?
- scala - 为什么案例类要求覆盖equals()?
- c# - 换行表达式
> 使用类型转换 - javascript - 通过 javascript 发送电子邮件
- c# - C# declare class member variable type of itself pointer