我有一个文件,如附带的截图所示。有61个事件(峰值),我想找到每个峰值与所有可能组合的另一个(共现)出现的频率。该文件具有频率(峰值出现在47个样本中的次数)和概率(峰值出现的次数除以样本总数)。
然后我想找到使用公式p(x,y)/ p(x)* p(y)的互斥峰,其中p(x,y)是x和y共同出现的概率,p (x)是峰值概率(x),p(y)是峰值y的概率。
解决此类问题的最佳方法是什么?我需要编写Perl脚本还是有一些我可以使用的R函数?我是一名试图学习Perl和R的生物学家,所以我很感激一些示例代码来解决这个问题。
答案 0 :(得分:1)
在下文中,我假设您交替称为p(xy)和p(x,y)的实际上应该是概率(而不是次数< / strong>)x
和y
共同出现。如果这不正确,只需从下面的第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.