4

私のデータフレームは次のようになります。

595.00000    18696      984.00200     32185    Group1  
935.00000    18356      1589.00000    31580    Group2            
40.00010     19251      73.00000      33096    Group3            
1058.00000   18233      1930.00000    31239    Group4                
19.00000     19272      27.00000      33142    Group5            
1225.00000   18066      2149.00000    31020    Group6  
....                 

すべてのグループについて、フィッシャーの正確確率検定を実行します。

table <- matrix(c(595.00000, 984.00200, 18696, 32185), ncol=2, byrow=T)  
Group1 <- Fisher.test(table, alternative="greater")

次を使用してデータフレームをループしようとしました:

for (i in 1:nrow(data.frame))  
 {  
 table= matrix(c(data.frame$V1, data.frame$V2, data.frame$V3, data.frame$V4), ncol=2, byrow=T)    
fisher.test(table, alternative="greater")  
}

しかし、エラーメッセージが表示されました

Error in fisher.test(table, alternative = "greater") :  
FEXACT error 40.  
Out of workspace.  
In addition: Warning message:  
In fisher.test(table, alternative = "greater")  :  
'x' has been rounded to integer: Mean relative difference: 2.123828e-06

どうすればこの問題を解決できますか、またはデータをループする別の方法を実行できますか?

4

1 に答える 1

5

最初のエラーは次のとおりです。Out of workspace

?fisher.test
fisher.test(x, y = NULL, workspace = 200000, hybrid = FALSE,
        control = list(), or = 1, alternative = "two.sided",
        conf.int = TRUE, conf.level = 0.95,
        simulate.p.value = FALSE, B = 2000)

workspace(デフォルト = 2e5)を増やしてみてください。

ただし、これはあなたの場合に発生します。これは、非常に大きな値があるためです。経験則として、行列のすべての要素が > 5 (または df = 1 であるため、この場合は 10) の場合、を使用して独立性のカイ 2 乗検定でchisq.test安全に近似できます。あなたの場合は、むしろ a を使用する必要があると思いますchisq.test

そして、warning message値が整数(595.000)などではないために発生します。したがって、本当にfisher.testa を再帰的に使用したい場合は、これを行います(データが にdfあり、 aであると仮定しますdata.frame

# fisher.test with bigger workspace
apply(as.matrix(df[,1:4]), 1, function(x) 
         fisher.test(matrix(round(x), ncol=2), workspace=1e9)$p.value)

または、代わりに a を使用する場合chisq.test(p 値に大きな違いがなく、パフォーマンスを向上させるためにこれらの巨大な値を使用する必要があると思います):

apply(as.matrix(df[,1:4]), 1, function(x) 
         chisq.test(matrix(round(x), ncol=2))$p.value)

これにより、p 値が抽出されます。

編集 1:を使用していることに気付きましたone-sided Fisher's exact test。確率からすでに計算されているため、独立性の片側カイ二乗検定があるかどうかわからないため、より大きなワークスペースでフィッシャーの検定を使用し続ける必要があるかもしれませんright-tail(また、p 値を 2 で割ることはできません)。非対称)。

編集 2: p 値を含むグループ名が必要であり、既に data.frame があるため、data.table次のようにパッケージを使用することをお勧めします。

# example data
set.seed(45)
df <- as.data.frame(matrix(sample(10:200, 20), ncol=4))
df$grp <- paste0("group", 1:nrow(df))
# load package
require(data.table)
dt <- data.table(df, key="grp")
dt[, p.val := fisher.test(matrix(c(V1, V2, V3, V4), ncol=2), 
                workspace=1e9)$p.value, by=grp]
> dt
#     V1  V2  V3  V4    grp        p.val
# 1: 130  65  76  82 group1 5.086256e-04
# 2:  70  52 168 178 group2 1.139934e-01
# 3:  55 112 195  34 group3 7.161604e-27
# 4:  81  43  91  80 group4 4.229546e-02
# 5:  75  10  86  50 group5 4.212769e-05
于 2013-01-24T10:13:22.443 に答える