nls 当数据是卷积光谱时(变量数量可变)

Posted

技术标签:

【中文标题】nls 当数据是卷积光谱时(变量数量可变)【英文标题】:nls when the data is a convoluted spectra (variable number of variables) 【发布时间】:2014-01-27 12:34:47 【问题描述】:

我有一些光谱数据在绘制时看起来像多重峰之一: http://journals.prous.com/journals/dof/19982303/html/df230301/images/keiferf3.gif

如何在图像中看到,所有峰彼此之间非常接近,所以我想使用 nls 函数进行一些反卷积,就像之前发布的 (R: Fitting Gaussian peaks to density plot data using nls) 一样,但使用洛伦兹函数代替:

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

在我的例子中,x0 是峰值最大值(而 length(x0) 是峰值的数量),所以我只需要优化 'a'。

但是,我的问题与执行此操作无关,而是编写一个强大的脚本来对任何光谱进行反卷积,将峰数作为输入信息。

我的第一个想法是编写洛伦兹函数并将“a”作为向量(之后应用所有洛伦兹曲线的总和),但 R 无法识别这种结构:

for (i in 1:length(x0)) 
    f[i]<-function(a)  y <- 1/(pi*a[i]*(1+((x-x0[i])/a[i])^2)) 


fit <- nls(sum(f[1:length(x0)]), start=list(a=rep(1, times=length(x0))))

更新:

这是我的示例,采用 .csv 格式 (https://drive.google.com/file/d/0B66EHLI5AufhbjlWcW9rYXl1UFk/edit?usp=sharing)。数据填充为 2 行。第一个具有频率(以 ppm 为单位),第二个具有强度。对于这个数据,我会选择 5 个峰值,所以我会在 formula=f[1]+f[2]+f[3]+f[4]+f[5] 上做 'nls' 并且我会有 5 个参数(a[1:5]) 进行评估。

【问题讨论】:

旁注:f &lt;- 1/pi*a*(1+(x-x0)/a^2) 是循环的矢量化替换。 我知道我的代码写得不好,但我认为发布代码有助于理解我的要求。 当然,不用担心 :) 这只是 R 特定的提示。 查看引用的问题:显然,这仅在峰分离良好时才有效(例如瑞利标准)。鉴于此,我认为您需要向nls“解释”您有一组适合的变量。也许让list 的元素是各种f[i] 您能否提供样本数据,比如链接中的光谱数据? 【参考方案1】:

我找到了'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=""))

因此,所有这些代码都为我提供了发布示例的以下公式:

"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))

但是,这个公式似乎不起作用,但这不是这个帖子的目的,所以我可以说现在它已经关闭了(我开了一个新的试图解决它)。

【讨论】:

以上是关于nls 当数据是卷积光谱时(变量数量可变)的主要内容,如果未能解决你的问题,请参考以下文章

当输入的数量可变时,如何使用神经网络?

Oracle环境变量NLS_LANG

Java中方法内的可变参数怎么使用

基于光谱-空间残差网络模型的高光谱遥感图像分类

go语言学习笔记 — 基础 — 函数:可变参数

可变数量的集合作为 SQL 数据库表