Me encuentro con el mismo problema. He buscado y rebuscado en stackExchange y en Google, y no he encontrado nada que explique explícitamente cómo el odds ratio en fisher.test()
se calcula. No es una respuesta completa, pero aporta algo útil a la discusión.
Una cosa está clara, fisher.test()
calcula un odds ratio completamente diferente con un método distinto (y más complicado).
Si escribe fisher.test
en la consola de R y pulsar Enter, la salida será el código completo de la función fisher.test()
. Lo interesante de nuestra duda es:
m <- sum(x[, 1L])
n <- sum(x[, 2L])
k <- sum(x[1L, ])
x <- x[1L, 1L]
lo <- max(0L, k - n)
hi <- min(k, m)
support <- lo:hi #Interval of definition of Hypergeometric Distribution
logdc <- dhyper(support, m, n, k, log = TRUE) #log of Hypergeometric Probability Function
dnhyper <- function(ncp) {
d <- logdc + log(ncp) * support
d <- exp(d - max(d))
d/sum(d)
}
mnhyper <- function(ncp) {
if (ncp == 0)
return(lo)
if (ncp == Inf)
return(hi)
sum(support * dnhyper(ncp))
}
mle <- function(x) {
if (x == lo)
return(0)
if (x == hi)
return(Inf)
mu <- mnhyper(1)
if (mu > x)
uniroot(function(t) mnhyper(t) - x, c(0, 1))$root
else if (mu < x)
1/uniroot(function(t) mnhyper(1/t) - x, c(.Machine$double.eps,
1))$root
else 1
}
Bueno, si usted
- Definir
x = matrix(c(3, 6, 5, 6), nrow=2)
- Ejecuta cada línea del código extraído de
fisher.test
en orden
- Ejecutar
mle(x)
Usted obtiene 0.6155891
. Así es como la proporción de probabilidades en fisher.test
se calcula. Sin embargo, no entiendo el algoritmo. No he encontrado ningún artículo que lo explique, y no parece posible traducirlo a una fórmula matemática "sencilla".