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

如何在R中为偏移对数正态分布数据拟合曲线并获取方程

拟合偏移对数正态分布并实现区间预测

数据准备

你提供的数据集可通过以下R代码重建:

df = data.frame(
  x = c(400.0000, 410.3448, 420.6897, 431.0345, 441.3793, 451.7241, 462.0690, 472.4138, 482.7586, 493.1034, 503.4483, 513.7931, 524.1379, 534.4828, 544.8276, 555.1724, 565.5172, 575.8621, 586.2069, 596.5517, 606.8966, 617.2414, 627.5862, 637.9310, 648.2759, 658.6207, 668.9655, 679.3103, 689.6552, 700.0000),
  y = c(0.0158, 0.0373, 0.0379, 0.0303, 0.0250, 0.0212, 0.0234, 0.0295, 0.0329, 0.0364, 0.0469, 0.0678, 0.0851, 0.0693, 0.0508, 0.0482, 0.0617, 0.2510, 0.6570, 0.7360, 0.6690, 0.5810, 0.5060, 0.4390, 0.3640, 0.2980, 0.2390, 0.1480, 0.0496, 0.0122)
)

拟合偏移对数正态分布

偏移对数正态分布的核心拟合公式为(适配你的数据量级,加入缩放系数):
$$y = \frac{A}{(x - \xi)\sigma\sqrt{2\pi}} e^{-\frac{(\ln(x - \xi) - \mu)2}{2\sigma2}}$$
参数说明:

  • $A$:缩放系数,匹配你的y值范围
  • $\xi$:偏移参数,控制分布的位置偏移
  • $\mu$:对数均值,对应分布峰值的对数位置
  • $\sigma$:对数标准差,控制分布的宽窄

步骤1:安装并加载工具包

使用nls2自动搜索初始参数(避免手动猜测的麻烦):

# 首次运行需安装包
install.packages("nls2")
library(nls2)

步骤2:定义模型函数

shifted_lognormal <- function(x, A, xi, mu, sigma) {
  term1 <- A / ((x - xi) * sigma * sqrt(2 * pi))
  term2 <- exp(-(log(x - xi) - mu)^2 / (2 * sigma^2))
  term1 * term2
}

步骤3:拟合模型

先通过网格搜索获取初始参数,再用非线性最小二乘法优化:

# 设置参数搜索范围
param_grid <- expand.grid(
  A = seq(10, 100, by = 10),
  xi = seq(350, 400, by = 10),
  mu = seq(5, 7, by = 0.5),
  sigma = seq(0.1, 1, by = 0.1)
)

# 网格搜索找初始值
nls_start <- nls2(y ~ shifted_lognormal(x, A, xi, mu, sigma),
                  data = df,
                  start = param_grid,
                  algorithm = "brute-force")

# 拟合最终模型
final_model <- nls(y ~ shifted_lognormal(x, A, xi, mu, sigma),
                   data = df,
                   start = as.list(coef(nls_start)))

# 查看拟合参数与统计结果
summary(final_model)

步骤4:验证拟合效果

将拟合曲线与原始数据可视化,检查匹配度:

plot(df$x, df$y, pch = 16, col = "blue", main = "偏移对数正态分布拟合", xlab = "x", ylab = "y")
x_seq <- seq(400, 700, by = 1)
y_pred <- predict(final_model, newdata = data.frame(x = x_seq))
lines(x_seq, y_pred, col = "red", lwd = 2)
legend("topright", legend = c("原始数据", "拟合曲线"), col = c("blue", "red"), pch = c(16, NA), lty = c(NA, 1))

步骤5:估算任意x值的y值

直接用拟合模型预测400-700区间内的任意x值,例如估算x=550的y值:

predict(final_model, newdata = data.frame(x = 550))

替代方案:无nls2时的手动初始参数

如果nls2安装有问题,可根据数据特征手动设置初始参数,再拟合:

final_model <- nls(y ~ shifted_lognormal(x, A, xi, mu, sigma),
                   data = df,
                   start = list(A=60, xi=390, mu=5.3, sigma=0.2))

后续步骤与上述一致。

内容的提问来源于stack exchange,提问作者dark-walrus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:25:39