2013-07-22 49 views
3

我有一個數據框中的蛋白質 - 蛋白質相互作用數據,標題爲s1m。每個DB和AD對做出的互動,我可以繪製它還有:圖中每個點的高度值

> head(s1m) 
    DB_num AD_num 
[1,]  2 8153 
[2,]  7 3553 
[3,]  8 4812 
[4,]  13 7838 
[5,]  24 3315 
[6,]  24 6012 

圖中的數據的樣子: http://i.imgur.com/RTaeJ5r.jpg

然後我用這個網站的代碼,我發現繪製填充輪廓線:

## compute 2D kernel density, see MASS book, pp. 130-131 
require(MASS) 
z <- kde2d(s1m[,1], s1m[,2], n=50) 
plot(s1m, xlab="X label", ylab="Y label", pch=19, cex=.4) 
filled.contour(z, drawlabels=FALSE, add=TRUE) 

它給了我得到的圖像(減去塗鴉): result

我的問題:我需要用原始s1m數據框中的每一行數據註釋一個數字,這個數字對應於等高線圖上的高度(因此我在上面的圖像上有塗鴉)。我認爲列表z有我正在尋找的值,但我不確定。

最後,我想我的數據,希望是這個樣子,所以我可以研究組蛋白相互作用:

  DB_num AD_num height 
    [1,]  2 8153  1 
    [2,]  7 3553  1 
    [3,]  8 4812  3 
    [4,]  13 7838  6 
    [5,]  24 3315  2 
    [6,]  24 6012  etc. 
+1

當您將值1,2,3等等附加到'DB_num'和'AD_num'的每個組合時,這些虛擬數字是指實際密度或其密度下降到的bin。換句話說,在你的圖上是2是指實際值2還是第二個bin(它取值1e-9到1.5e9? –

+1

自輪廓。plot'似乎不會返回有用的值,我想這涉及到兩個有點棘手的問題:(i)從's1m'中的值映射到等高線圖所使用的點陣座標,並且(ii)再現級別分配在網格的不同位置; (ii)可以通過借用和調用'contour.plot'自己的語法來實現,例如, '水平< - 剪切(as.numeric(z $ z),漂亮(範圍(z $ z),20))',或者自己計算水平並明確設​​置相應參數... – texb

+0

@GavinSimpson虛擬數字將會指的是垃圾桶,但具有實際值的點可能也會起作用。 –

回答

2

這是一個選擇,如果你想要的實際高度不是倉的每個是分配給

## dummy data 
DF <- data.frame(DB_num = rnorm(10000), AD_num = rnorm(10000)) 

require("MASS") 

kde <- kde2d(DF[,1], DF[,2], n = 50) 

注意kde2d返回作爲組分z其爲具有矩陣(在這種情況下)50點的行和列,其中行對應於x數據和列向y數據。作爲基質僅僅是一個矢量,並且將數據按列填充,我們可以利用這一點,(這裏n = 50)堆疊xy值中的每個n次,然後放鬆kde$z

dd <- dim(kde$z) 
res <- data.frame(DB_num = rep(kde$x, times = dd[1]), 
        AD_num = rep(kde$y, times = dd[2]), 
        height = as.numeric(kde$z)) 

這產生

> head(res) 
     DB_num  AD_num         height 
1 -3.582508378 -3.79074271 0.0000000000000000000000000006907447484 
2 -3.429230262 -3.63682706 0.0000000000000000000000002951259863229 
3 -3.275952146 -3.48291141 0.0000000000000000000000558203373144190 
4 -3.122674029 -3.32899576 0.0000000000000000000055565720524140235 
5 -2.969395913 -3.17508011 0.0000000000000000014967010810961022503 
6 -2.816117797 -3.02116446 0.0000000000000008159370528768207499471 

爲了得到垃圾桶,你需要遵循什麼filled.contour做,這是通過

nlevels <- 20 ## default 
brks <- pretty(range(res$height), nlevels) 

> brks 
[1] 0.00 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14 
[16] 0.15 0.16 
形成突破

然後使用cut每個height分配到的brks基礎上斌,像

res <- transform(res, bin = as.numeric(cut(height, brks))) 

其中給出

> head(res) 
     DB_num  AD_num         height bin 
1 -3.582508378 -3.79074271 0.0000000000000000000000000006907447484 1 
2 -3.429230262 -3.63682706 0.0000000000000000000000002951259863229 1 
3 -3.275952146 -3.48291141 0.0000000000000000000000558203373144190 1 
4 -3.122674029 -3.32899576 0.0000000000000000000055565720524140235 1 
5 -2.969395913 -3.17508011 0.0000000000000000014967010810961022503 1 
6 -2.816117797 -3.02116446 0.0000000000000008159370528768207499471 1 

你可能要檢查的?cut細節來確定行爲一個垃圾箱的邊界,但這應該讓你足夠接近。

+0

@texb我認爲這不會奏效。最好使用返回足夠的東西的工具,以便在觀察到的實際值下進行預測。我認爲** kernsmooth **包中的東西會是理想的。讓我看看。 (是的,我錯過了想要將原始數據中的每個觀察數據聯繫在一起的路線)。 –

+0

實際上,從頭開始,** KernSmooth **和'kde2d()'的功能'bkde2D()'做的完全一樣' –

+0

@texb代替這個,我認爲你的加入可能是最簡單的事情階段。 +1 –

相關問題