0

スクリーンショット

添付のスクリーンショットに示すようなファイルがあります。61 のイベント (ピーク) があり、考えられるすべての組み合わせについて、各ピークが他のピーク (共起) とどのくらいの頻度で発生するかを調べたいと考えています。このファイルには、頻度 (47 個のサンプルでピークが出現する回数) と確率 (ピークが発生する回数をサンプルの総数で割った値) が含まれています。

次に、式 p(x,y) / p(x)*p(y) を使用して、相互に排他的なピークを見つけたいと思います。ここで、p(x,y) は、x と y が同時に発生する確率 p(x) です。はピーク (x) の確率、p(y) はピーク y の確率です。

このような問題を解決する最善の方法は何ですか? Perl スクリプトを作成する必要がありますか? または使用できる R 関数はありますか? 私は Perl と R を学ぼうとしている生物学者なので、この問題を解決するためのコード例を教えていただければ幸いです。

4

2 に答える 2

1

以下では、p(xy) と p(x,y) を交互に呼び出すものは、実際には(回数ではなく)共起する確率であると想定しています。それが正しくない場合は、下の 2 行目から除算を削除してください。xynrow(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

注:結果のNaNs は、これらのセルが「数値ではない」ことを示す R の方法です (それぞれ 0 を 0 で割った結果であるため)。

于 2012-05-17T21:35:36.247 に答える
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 がまったく発生しない場合、それらは同じ行の peaktopeak には見つかりません。

これを簡単に見るには、次のことができます。

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

例えば:

#     [,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.
于 2012-05-17T21:53:42.840 に答える