1

p値のデータフレームがあります。p値以外にも、いくつかのゼロエントリがあります。

data

     V1          V3          V4          V5          V6          V7        
1  ADAM32       0.001           0           0           0           0      
2  ADAM32       0.001        0.65       0.001       0.001        0.65   
3  ADAM32        0.65           0           0           0           0      
4    CCL5    0.000491    0.000491    0.000491           0           0      
5   CILP2 0.500000024 0.500000024 0.500000024           0           0      
6   EPHB3    0.000562    0.000562    0.000562    0.000562    0.000562      
7   EPHB3    0.000562           0           0           0           0      
8  GUCA1A    0.002006    0.602006    0.002006    0.602006    0.002006      
9  GUCA1A    0.602006           0           0           0           0      
10  HSPA6    0.000322    0.000322    0.000322    0.000322    0.000322      
11  HSPA6    0.000322           0           0           0           0      
12  MAPK1       0.002       0.002       0.002           0           0      

次のコードを使用して、フィッシャーの方法を適用し、各行の p 値を結合します。

    ## Fisher's Method 
    Fisher.test <- function(p) {  
      Xsq <- -2*sum(log(p))
      p.val <- pchisq(Xsq, df = 2*length(p), lower.tail = FALSE)
      return(c(Xsq = Xsq, p.value = p.val))

    }

   for(k in 1 : nrow(data))
   {
     p <- as.numeric(data[j,-1])
     fisher <- Fisher.test(p)
     print(fisher)
   }

p値の対数変換後に無限値になるため、行合計にゼロを追加することをスキップしたいと思います。

4

1 に答える 1

2

applyより簡潔な記述に使用します。

apply(df, 1, function(u) {x=as.numeric(u[-1]);Fisher.test(x[x!=0])})

最初の 4 行で次のように返されます。

#            [,1]         [,2]      [,3]         [,4]
#Xsq     13.81551 4.316966e+01 0.8615658 4.571440e+01
#p.value  0.00100 4.637400e-06 0.6500000 3.374549e-08

0最良の方法は、ベクトルが指定された場合 (および がいっぱいである場合) を関数に処理すること0です。

于 2015-03-24T10:38:26.323 に答える