【问题标题】:Fit lognormal distribution with R &nls用 R &nls 拟合对数正态分布
【发布时间】:2018-11-03 06:37:33
【问题描述】:

假设我有这样的数据:

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))

非常感谢!

【问题讨论】:

    标签: r nls


    【解决方案1】:

    我不知道为什么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')
    

    【讨论】:

    • @JmO,我还建议考虑一下这是否是解决您问题的最佳方法。您的 df$y 值很可能已经是内核密度估计值,现在您正在拟合对数正态分布,这不是一个好主意。使用原始数据来拟合分布会更好。
    猜你喜欢
    • 2014-07-01
    • 2017-02-19
    • 2015-03-09
    • 2017-11-16
    • 1970-01-01
    • 2023-03-13
    • 2020-03-09
    • 1970-01-01
    • 2015-12-07
    相关资源
    最近更新 更多