2

我有许多数据集,由不同高度的特征计数组成。目前有1-30m的每1m间隔的数据。绘制时,我的许多数据集显示 3-4 个峰值,这些峰值表示高度层。

这是一个示例数据集:

高度 <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 ,24,25,26,27,28,29,30) 计数 <-c(4000,2000,500,300,200,100,0,0,400,700,800,800,500,1000,1500,2000,2500,2200,1700,1100,500,0,0, 1000,1500,2000,3000,4000,4000,2000)

我想为这些数据集拟合某种曲线函数,以确定“峰”的总数、峰中心位置(即高度)和峰宽。前段时间我可以通过使用 fityk 软件手动拟合多个高斯函数来执行这种分析,但是我想知道是否可以通过 R 自动执行这样的过程?

我已经探索了许多其他关于将峰值拟合到直方图的帖子,例如通过 mixtools 包,但是我不知道您是否可以提取单个峰值信息。

您能提供的任何帮助将不胜感激。

4

2 回答 2

4

“我如何将曲线拟合到我的数据”这个问题太宽泛了,因为有无数种方法可以做到这一点。它也可能比这里更适合https://stats.stackexchange.com/ 。但是,ksmooth从基础 R 开始,对于基础平滑器来说是一个很好的起点:

plot(Height,Counts)
smoothCounts<-ksmooth(Height,Counts,kernel="normal",bandwidth=2)
dsmooth<-diff(smoothCounts$y)
locmax<-sign(c(0,dsmooth))>0 & sign(c(dsmooth,0))<0
lines(smoothCounts)
points(smoothCounts$x[locmax],smoothCounts$y[locmax],cex=3,c=2)

在此处输入图像描述

于 2013-10-17T19:27:39.407 回答
1

一个简单的峰识别可以遵循以下思路。看起来合理吗?

library(data.table)

dt <- data.table(
Height = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30),
Counts = c(4000,2000,500,300,200,100,0,0,400,700,800,800,500,1000,1500,2000,2500,2200,1700,1100,500,0,0,1000,1500,2000,3000,4000,4000,2000)
)

# crude dHeights/dCounts
dt[,d1 := c(NA,diff(Counts))]
# previous crude dHeights/dCounts (d2Heights/dCounts2 will be even more crude so comparing change in dHeight/dCounts instead)
dt[,d2 := c(tail(d1,-1),NA)]

# local maxima
dtpeaks <- dt[d1 >=0 & d2 <=0]

我不太确定您将如何计算峰值的 FWHM,如果您能解释该过程,那么我应该能够提供帮助。

于 2013-10-21T18:09:31.420 回答