You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中复现多模态对数正态分布拟合,求类似lmfit.Models的工具

R中类似Python lmfit.Models的工具推荐及多模态对数正态拟合示例

当然有啦!在R生态里,有不少工具能实现类似Python中lmfit.Models的功能——也就是方便定义自定义模型、设置参数约束、执行拟合并分析结果。结合你要拟合多模态对数正态分布的需求,下面给你推荐几个最实用的工具,还附上适配你现有数据的代码示例:

1. flexmix:专门处理混合模型的利器

如果你要拟合多模态分布,flexmix绝对是首选——它就是为混合模型设计的,能直接拟合混合对数正态分布,不用手动写复杂的模型公式,非常贴合你的场景。

示例代码:

# 先安装并加载包
install.packages("flexmix")
library(flexmix)

# 把你的数据整理成数据框
df <- data.frame(x = x_plot, y = y)

# 拟合混合对数正态模型(这里假设2个模态,你可以根据实际调整k值)
fit_mix <- flexmix(y ~ 1, data = df, 
                   model = FLXMRglm(family = Gamma(link = "log")),
                   k = 2)

# 查看拟合结果
summary(fit_mix)

# 提取参数并预测拟合曲线
x_seq <- seq(min(x_plot), max(x_plot), length.out = 100)
pred <- predict(fit_mix, newdata = data.frame(x = x_seq))

# 可视化拟合结果(和你的原始图对比)
plot(x, y, log = 'xy', type = 'l', main = "混合对数正态分布拟合")
lines(x_seq, pred, col = "red", lwd = 2)

2. minpack.lm的nlsLM():增强版非线性最小二乘

如果你更习惯手动定义模型(类似lmfit里自定义模型的方式),nlsLM是基础nls()的升级版本,稳定性更高,支持参数上下限约束,完美匹配lmfit的参数控制能力。

示例代码(自定义双模态对数正态模型):

install.packages("minpack.lm")
library(minpack.lm)

# 定义双模态对数正态的拟合函数
mix_lognorm <- function(x, mu1, sigma1, mu2, sigma2, w1) {
  w2 <- 1 - w1  # 第二个模态的权重
  w1 * dlnorm(x, meanlog = mu1, sdlog = sigma1) + 
    w2 * dlnorm(x, meanlog = mu2, sdlog = sigma2)
}

# 初始参数猜测(需要根据数据大致估计)
start_params <- list(mu1 = log(0.5), sigma1 = 0.5,
                     mu2 = log(3), sigma2 = 0.5,
                     w1 = 0.5)

# 执行拟合,设置参数约束(比如权重w1在0到1之间)
fit_nls <- nlsLM(y ~ mix_lognorm(x, mu1, sigma1, mu2, sigma2, w1),
                 data = df,
                 start = start_params,
                 lower = list(mu1 = -Inf, sigma1 = 0.1,
                              mu2 = -Inf, sigma2 = 0.1,
                              w1 = 0.01),
                 upper = list(mu1 = Inf, sigma1 = Inf,
                              mu2 = Inf, sigma2 = Inf,
                              w1 = 0.99))

# 查看拟合结果
summary(fit_nls)

# 预测并绘图
pred_nls <- predict(fit_nls, newdata = data.frame(x = x_seq))
lines(x_seq, pred_nls, col = "blue", lwd = 2, lty = 2)
legend("topright", legend = c("原始数据", "flexmix拟合", "nlsLM拟合"),
       col = c("black", "red", "blue"), lwd = 2)

3. bbmle的mle2():灵活的最大似然估计

如果你想基于似然函数自定义模型,bbmle的mle2()提供了极强的灵活性,支持多种优化方法和参数约束,和lmfit的自定义似然功能非常相似。

简单示例:

install.packages("bbmle")
library(bbmle)

# 定义负对数似然函数
nll <- function(mu1, sigma1, mu2, sigma2, w1) {
  w2 <- 1 - w1
  -sum(y * log(w1 * dlnorm(x, mu1, sigma1) + w2 * dlnorm(x, mu2, sigma2)))
}

# 拟合模型
fit_mle <- mle2(nll, start = start_params,
                lower = list(mu1 = -Inf, sigma1 = 0.1, mu2 = -Inf, sigma2 = 0.1, w1 = 0.01),
                upper = list(mu1 = Inf, sigma1 = Inf, mu2 = Inf, sigma2 = Inf, w1 = 0.99),
                method = "L-BFGS-B")

summary(fit_mle)

内容的提问来源于stack exchange,提问作者dnem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 18:02:25