2016-07-27 11 views
0

次は表形式です。 各行には、コンティンジェンシー2X2テーブルの情報が含まれています。 オッズ比と対応するp値をフィッシャーの正確な検定で計算したいと思います。 その後、オッズ比とp値をテーブルの別の列として追加する必要があります。例えばRフィッシャーの正確な計算

A B C D 
1 1 10 77 
2 6 9 72 

入力表は次のようになり

A B C D OR 95CI Pvalue 
1 1 10 77 7.39 0.09;608.46 0.23 
2 6 9 72 2.62 0.23;17.97 0.26 

1|10 
---- 
1|77 

に等しい

A|C 
--- 
B|D 

出力テーブルのようなものでなければなりません

答えて

1

これでよく遊びます:新しい列を作成し、すべての行にfunction(x)を適用するために行数を取得します。行スルー

df <- data.frame(A = 1:2, B=c(1,6), C=c(10,9), D=c(77,72)) 

df$OR  <- NA 
df$`95CI` <- NA 
df$Palue <- NA 
N <- nrow(df) 

sapply(1:N, function(x) { 
    tmp <- fisher.test(matrix(unlist(df[x, 1:4]), nrow=2, ncol=2, byrow=T)) 
    df[x,5:7] <<- c(round(tmp$estimate, 2), paste(round(tmp$conf.int,2), collapse = ";"), round(tmp$p.value, 2)) 
}) 



> df 
    A B C D OR  95CI Palue 
1 1 1 10 77 7.39 0.09;608.46 0.23 
2 2 6 9 72 2.63 0.23;17.97 0.26 
1

ループは、マトリックスに変換フィッシャーに渡し、次に飾り立てる出力:

cbind(df1, 
     do.call(rbind, 
       apply(df1, 1, function(i) { 
       ft <- fisher.test(matrix(i, nrow = 2, ncol = 2)) 
       cbind.data.frame(
        OR = round(ft$estimate, 2), 
        CI95 = paste(round(ft$conf[1], 2), 
           round(ft$conf[2], 2), sep = ";"), 
        Pvalue = ft$p.value) 

       })) 
    ) 

#    A B C D OR  CI95 Pvalue 
# odds ratio 1 1 10 77 7.39 0.09;608.46 0.2331461 
# odds ratio1 2 6 9 72 2.63 0.23;17.97 0.2565293 
関連する問題