2013-10-17 129 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