计算共现

时间:2012-05-17 21:18:08

标签: perl r perl-data-structures

screenshot

我有一个文件,如附带的截图所示。有61个事件(峰值),我想找到每个峰值与所有可能组合的另一个(共现)出现的频率。该文件具有频率(峰值出现在47个样本中的次数)和概率(峰值出现的次数除以样本总数)。

然后我想找到使用公式p(x,y)/ p(x)* p(y)的互斥峰,其中p(x,y)是x和y共同出现的概率,p (x)是峰值概率(x),p(y)是峰值y的概率。

解决此类问题的最佳方法是什么?我需要编写Perl脚本还是有一些我可以使用的R函数?我是一名试图学习Perl和R的生物学家,所以我很感激一些示例代码来解决这个问题。

2 个答案:

答案 0 :(得分:1)

在下文中,我假设您交替称为p(xy)和p(x,y)的实际上应该是概率(而不是次数< / strong>)xy共同出现。如果这不正确,只需从下面的第2行中删除nrow(X)的除法。

# As an example, create a sub-matrix of your data
X <- cbind(c(0,0,0,0,0,0), c(1,0,0,1,1,1), c(1,1,0,0,0,0))

num <- (t(X) %*% X)/nrow(X)              # The numerator of your expression   
means <- colMeans(X)                     # A vector of means of each column
denom <- outer(colMeans(X), colMeans(X)) # The denominator
out <- num/denom
#      [,1] [,2] [,3]
# [1,]  NaN  NaN  NaN
# [2,]  NaN 1.50 0.75
# [3,]  NaN 0.75 3.00

注意:结果中的NaN是R指示那些单元格是“非数字”的方式(因为它们都是将0除以0的结果)。

答案 1 :(得分:1)

如果没有正确的例子,你的问题就不完全清楚,但我认为这个结果与你想要的结果一致,即“我想知道每个峰值与另一个峰值出现的频率(共现)”

library(igraph)
library(tnet)
library(bipartite)

#if you load your data in as a matrix e.g.

mat<-matrix(c(1,1,0,2,2,2,3,3,3,4,4,0),nrow=4,byrow=TRUE) # e.g.

 #     [,1] [,2] [,3]   #  your top line as columns  e.g.81_05  131_00 and peaks as rows
#[1,]    1    1    0
#[2,]    2    2    2
#[3,]    3    3    3
#[4,]    4    4    0

然后

pairs<-web2edges(mat,return=TRUE)
pairs<- as.tnet(pairs,type="weighted two-mode tnet")
peaktopeak<-projecting_tm(pairs, method="sum")
peaktopeak

#peaktopeak
#   i j w
#1  1 2 2 # top row here says peak1 and peak2 occurred together twice
#2  1 3 2
#3  1 4 2
#4  2 1 4
#5  2 3 6
#6  2 4 4
#7  3 1 6
#8  3 2 9
#9  3 4 6
#10 4 1 8
#11 4 2 8
#12 4 3 8  # peak4 occured with peak3 8 times

编辑:如果没有出现的互斥峰只是那些与原始数据不在同一列中共享1的峰,那么您可以在peaktopeak中看到这一点。例如,如果峰值1和3从未发生,则它们不会在同一行的峰值峰值中找到。

要更容易看到这一点:

peakmat <- tnet_igraph(peaktopeak,type="weighted one-mode tnet")
peakmat<-get.adjacency(peakmat,attr="weight")

e.g:

#     [,1] [,2] [,3] [,4]
#[1,]    0    2    2    2
#[2,]    4    0    6    4
#[3,]    6    9    0    6
#[4,]    8    8    8    0 # zeros would represent peaks that never co occur. 

#In this case everything shares at least 2 co-occurrences 
#diagonals are 0 as saying  peak1 occurs with itself is obviously silly.