我有一些光谱数据,在绘制时看起来像多重峰之一: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 是峰值最大值(长度(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]) 进行评估。