R 数据为卷积光谱时的nls(变量数量可变)

R 数据为卷积光谱时的nls(变量数量可变),r,spectrum,nls,R,Spectrum,Nls,我有一些光谱数据,绘制时看起来像一个多重态: 从图中可以看出,所有的峰值彼此非常接近,因此我想使用nls函数进行一些反褶积,就像之前发布的()一样,但使用洛伦兹函数: y <- 1/(pi*a*(1+((x-x0)/a)^2)) y我找到了'as.formula'命令,它允许将任何字符串转换为公式。因此,我设法创建了一个for循环来创建洛伦兹曲线的总和。在我的示例中,参数a[1:5]现在定义为a-e,但对于sprintf,我也可以使用向量命名法 cac<-"abcdefghijk

我有一些光谱数据,绘制时看起来像一个多重态:

从图中可以看出,所有的峰值彼此非常接近,因此我想使用nls函数进行一些反褶积,就像之前发布的()一样,但使用洛伦兹函数:

y <- 1/(pi*a*(1+((x-x0)/a)^2))

y我找到了'as.formula'命令,它允许将任何字符串转换为公式。因此,我设法创建了一个for循环来创建洛伦兹曲线的总和。在我的示例中,参数a[1:5]现在定义为a-e,但对于sprintf,我也可以使用向量命名法

cac<-"abcdefghijklmnopqrstuvwxyz"
for (i in 1:length(x0)) {
    letter<-substr(cac, i,i)
    formulae[i]<-sprintf("1/(pi*%s*(1+((spectra[1,]-%f)/%s)^2))", letter,x0[i],letter)
    coeff[i]<-sprintf("%s=1", letter)
}
formula2<-paste(formulae, collapse="+")
formulo<-paste("spectra[2,] ~", formula2, sep="")
coeffs<-paste(coeff, collapse=",")

fit<-as.formula(paste("nls(",formulo,",start=list(",coeffs,"))", sep=""))

然而,这个公式似乎不起作用,但这不是这个线程的目的,所以我可以说现在它已经关闭了(我打开了一个新的来尝试解决它)。

旁注:
f我知道我的代码写得不好,但我认为发布代码会有助于理解我的请求。当然,不用担心:)这只是一个特定于R的提示。看看参考问题:显然,这只适用于峰分离良好的情况(如瑞利标准)。有鉴于此,我认为您需要向
nls
解释,您已经有了一组适合的变量。也许可以制作
列表
其元素是各种
f[i]
?您能否提供样本数据,比如链接中的光谱数据?
cac<-"abcdefghijklmnopqrstuvwxyz"
for (i in 1:length(x0)) {
    letter<-substr(cac, i,i)
    formulae[i]<-sprintf("1/(pi*%s*(1+((spectra[1,]-%f)/%s)^2))", letter,x0[i],letter)
    coeff[i]<-sprintf("%s=1", letter)
}
formula2<-paste(formulae, collapse="+")
formulo<-paste("spectra[2,] ~", formula2, sep="")
coeffs<-paste(coeff, collapse=",")

fit<-as.formula(paste("nls(",formulo,",start=list(",coeffs,"))", sep=""))
"nls(spectra[2,] ~1/(pi*a*(1+((spectra[1,]-2.156460)/a)^2))+1/(pi*b*(1+((spectra[1,]-2.170150)/b)^2))+1/(pi*c*(1+((spectra[1,]-2.184820)/c)^2))+1/(pi*d*(1+((spectra[1,]-2.163550)/d)^2))+1/(pi*e*(1+((spectra[1,]-2.142040)/e)^2)), start=list(a=1,b=1,c=1,d=1,e=1))