【问题标题】:Fit Exponentially modified Gaussian to 2D data将指数修改的高斯拟合到 2D 数据
【发布时间】:2019-06-16 06:42:03
【问题描述】:

我正在尝试将指数修改的高斯(如https://en.wikipedia.org/wiki/Exponentially_modified_Gaussian_distribution 等式 (1))拟合到我在 R 中的 2D (x, y) 数据。

我的数据是:

x <- c(1.13669371604919, 1.14107275009155, 1.14545404911041, 1.14983117580414, 
1.15421032905579, 1.15859162807465, 1.16296875476837, 1.16734790802002, 
1.17172694206238, 1.17610621452332, 1.18048334121704, 1.18486452102661, 
1.18924164772034, 1.19362080097198, 1.19800209999084, 1.20237922668457, 
1.20675826072693, 1.21113955974579, 1.21551668643951, 1.21989583969116, 
1.22427713871002, 1.22865414619446, 1.2330334186554, 1.23741245269775, 
1.24178957939148, 1.24616885185242, 1.25055003166199, 1.25492715835571, 
1.25930631160736, 1.26368761062622, 1.26806473731995, 1.2724437713623
)
y <- c(42384.03125, 65262.62890625, 235535.828125, 758616, 1691651.75, 
    3956937.25, 8939261, 20311304, 41061724, 65143896, 72517440, 
    96397368, 93956264, 87773568, 82922064, 67289832, 52540768, 50410896, 
    35995212, 27459486, 14173627, 12645145, 10069048, 4290783.5, 
    2999174.5, 2759047.5, 1610762.625, 1514802, 958150.6875, 593638.6875, 
    368925.8125, 172826.921875)

我试图拟合的函数和我试图最小化以进行优化的值:

EMGCurve <- function(x, par)
{
  ta <- 1/par[1]
  mu <- par[2]
  si <- par[3]
  h <- par[4]
  Fct.V <- (h * si / ta) * (pi/2)^0.5 * exp(0.5 * (si / ta)^2 - (x - mu)/ta)
  Fct.V
}

RMSE <- function(par)
{ 
  Fct.V <- EMGCurve(x,par)
  sqrt(sum((signal - Fct.V)^2)/length(signal))
}

result <- optim(c(1, x[which.max(y)], unname(quantile(x)[4]-quantile(x)[2]), max(y)), 
                lower = c(1, min(x), 0.0001, 0.1*max(y)),
                upper = c(Inf, max(x), 0.5*(max(x) - min(x)), max(y)),
                RMSE, method="L-BFGS-B", control=list(factr=1e7))

但是,当我最终尝试将结果可视化时,似乎没有任何有用的事情发生,..

plot(x,y,xlab="RT/min",ylab="I")
lines(seq(min(x),max(x),length=1000),GaussCurve(seq(min(x),max(x),length=1000),result$par),col=2)

但是,由于某种原因,它根本不起作用,尽管 a 设法为具有类似代码的正态分布做到这一点。如果有人有想法会很棒吗?

【问题讨论】:

    标签: r curve-fitting gaussian


    【解决方案1】:

    如果它可能有用,我可以使用 X 位移对数正态类型峰值方程拟合您的数据,“y = a * exp(-0.5 * pow((log(xd)-b ) / c, 2.0))" 参数 a = 9.4159743234392539E+07, b = -2.7516932481669185E+00, c = -2.4343893243720971E-01, d = 1.1251623071481867E+00 产生 R-squared = 2。 E06.我个人无法使用您帖子中的方程式进行拟合。当值看起来很大时,缩放相关数据可能有价值,但这个等式似乎适合数据。

    【讨论】:

    • 非常感谢,我会试试这个合身的!问题可能是我没有使用误差函数(如维基百科中给出的方程)。我把它留给了我们,因为我不明白它是什么,也不知道如何处理它......
    • 嗯 - 我只是拟合数据,没什么特别的,并且使用了大多数人在曲线拟合时使用的通常的最小平方和误差。
    • 感谢工作:) 有没有一种有效的方法可以从行数据中估计此函数的参数?我知道“a”和“d”的来源,..但不是其他两个...
    • 我使用了我的开源 Python 在线曲线和曲面拟合器 zunzun.com,它有一个名为差分进化的遗传算法来估计初始参数值。具体来说,我只是将数据粘贴到zunzun.com/Equation/2/Peak/Log-Normal%20Peak%20A%20Shifted 的“文本数据编辑器”中,然后点击提交按钮。
    猜你喜欢
    • 2016-08-22
    • 2021-06-14
    • 1970-01-01
    • 2019-01-17
    • 2015-10-10
    • 1970-01-01
    • 2014-10-10
    • 2023-03-19
    • 2017-06-20
    相关资源
    最近更新 更多