【问题标题】:NlS multiple Gaussian, automatically generate formulasNlS多重高斯,自动生成公式
【发布时间】:2014-07-24 08:34:07
【问题描述】:

我已经使用 NLS 来拟合激光雷达波形数据。它似乎适用于 3 或 4 个峰值。 对于(我在 1:3){ 均值

sd=runif(3,6,20)
c=runif(3,100,250)
df<-data.frame(x=seq_along(y),y)
fit<-nls(y ~(c1 * exp(-(x - mean1)**2/(2 * sigma1**2)) +
         c2 * exp(-(x - mean2)**2/(2 * sigma2**2))+
         c3 * exp(-(x - mean3)**2/(2 * sigma3**2))), data=df,
         start=list(c1=c[1], mean1=mean[1], sigma1=sd[1],
                    c2=c[2], mean2=mean[2], sigma2=sd[2],
                    c3=c[3], mean3=mean[3], sigma3=sd[3]), algorithm="port")

但问题是每次你都要手动写下这么长的公式和参数启动。所以我想知道如何通过循环自动生成函数,然后可以通过循环生成公式=y~f(x,c,mean,sd) 和 start pars。并确保这些可以在 nls 中工作。另外希望大家能给我一些关于多峰高斯拟合的建议,我试过GPfit,GMM。

在这个网站上也和我有同样问题的人,但没有得到令人满意的答案。可以通过nls when the data is a convoluted spectra (variable number of variables)参考

【问题讨论】:

    标签: r gaussian nls


    【解决方案1】:

    你在这里塞了很多问题。我会回答似乎主要的问题。您可以将公式构建为字符串。然后,您可以将其转换为公式。用你想要的初始参数建立一个列表并不难。就是这样一个函数

    gennls <- function(c, mean, sd) {
        n <- seq_along(c)
        fs <- paste("y ~", 
            paste(
                paste0("c",n, " * exp(-(x-mean",n,")**2/(2 * sigma",n,"**2))"),
            collapse=" + ")
        )
        names(c)<-paste0("c",seq_along(c))
        names(mean)<-paste0("mean",seq_along(c))
        names(sd)<-paste0("sigma",seq_along(sd))
        list(
            formula=as.formula(fs),
            start=c(as.list(c), as.list(mean), as.list(sd))
        )
    }
    

    然后你可以运行它

    init <- gennls(runif(3), runif(3), runif(3))
    

    这将返回一个带有公式的列表

    init$formula
    # y ~ c1 * exp(-(x - mean1)^2/(2 * sigma1^2)) + c2 * exp(-(x - 
    #     mean2)^2/(2 * sigma2^2)) + c3 * exp(-(x - mean3)^2/(2 * sigma3^2))
    

    和初始参数

    str(iniy$start)
    # List of 9
    #  $ c1    : num 0.883
    #  $ c2    : num 0.0521
    #  $ c3    : num 0.664
    #  $ mean1 : num 0.665
    #  $ mean2 : num 0.902
    #  $ mean3 : num 0.449
    #  $ sigma1: num 0.672
    #  $ sigma2: num 0.429
    #  $ sigma3: num 0.865
    

    【讨论】:

    • 非常感谢您的回答。但它似乎在 nls 中不起作用。我的代码是这样的。 init
    • @user3701176 我的gennls 函数中的一个起始参数列表名称有错字。我已经更新了代码。再试一次。
    猜你喜欢
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2011-05-10
    • 2017-06-10
    • 2010-11-09
    • 1970-01-01
    • 2014-04-15
    相关资源
    最近更新 更多