2013-10-17 133 views
2

的数据集,并提取个别峰值信息我有一些在不同高度的特征计数组成的数据集。目前有1-30米每1米间隔的数据。绘制时,我的许多数据集都显示3-4个峰值,这些峰值表示高度层。拟合多个峰到作为R

下面是一个示例数据集:

身高< - 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)

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

我已经探索了一些关于装修峰直方图,比如通过mixtools包其他职位,但我不知道你是否可以提取单个峰值信息。

您可以提供任何帮助将不胜感激。

+0

'diff(Counts)'和'diff(diff(Counts))'应该有助于识别峰值。峰宽是一个简单的定义? – TheComeOnMan

+0

感谢您的建议。我应该更好地定义峰宽。我指的是各个峰值的半峰全宽(FWHM)。 –

回答

3

“我怎么曲线拟合我的数据”的方式过于宽泛的一个问题,因为有数不清的方法可以做到这一点。它也可能比这里更适合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) 

enter image description here

+0

非常感谢! –

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为峰,如果你能解释这个过程那么我应该能够提供帮助。

+0

一旦钟形函数或峰值拟合到数据,例如高斯。然后每个峰值被视为一个独立的实体。 半最大值(FWHM)的全宽可以概括为:在中间值(计数)的钟形曲线(高度),这是与在曲线的上半部分的最大值的宽度。这可以形象化为http://upload.wikimedia.org/wikipedia/commons/c/cb/FWHM.svg –

+0

哈哈,我不是指一个维基链接,我在这个例子中特别要求。那么你如何计算29点的峰值宽度呢? – TheComeOnMan