6 votos

Números demasiado grandes para R. ¿Cómo aproximar la función de masa de probabilidad?

Es frecuente encontrar datos de redes sociales en forma binaria: personas frente a eventos a los que asisten, personas frente a clases a las que asisten, países frente a tratados que firman, etc. Una estrategia para analizar estos datos consiste en proyectar la matriz rectangular binaria $X$ en una matriz de un modo $P = (X * X')$ . A continuación, cada celda de la nueva matriz $A_{ij}$ tendría el número de veces que la persona $i$ asistió a un acto con otra persona $j$ . Pero, ¿es el número de veces que asisten conjuntamente a actos superior al que cabría esperar por azar?

Encontré un interesante documento sobre el tema y aborda directamente la cuestión. El autor propone este PMF, en el que la probabilidad de que la persona $i$ y persona $j$ asistir exactamente $C$ eventos:

$$\Pr(P_{ij}=C)=\frac{{E \choose C}{E-C \choose P_{ii}-C}{E-P_{ii}\choose P_{jj}-C}}{{E \choose P_{ii}}{E \choose P_{jj}} }$$

PMF graphically

En una red razonablemente pequeña, no hay dificultad para calcularlo. Pero tengo una red con miles de nodos. Las cifras del numerador y el denominador son enormes. Tan grandes que R sólo devuelve Inf y obtengo un resultado sin sentido.

Lo que creo que debo hacer es encontrar una manera de aproximar este PMF de alguna manera. También estaba considerando simplemente escribir algún código que se aproxima a la distribución a través de la simulación. ¿Hay alguna forma mejor de aproximar esta distribución? ¿Existe alguna distribución conocida que se aproxime mucho (léase, lo suficiente) a la distribución teórica presentada?

1 votos

¿Podrías utilizar la aproximación de Stirling y trabajar en espacio logarítmico?

11voto

AdamSane Puntos 1825

Prácticamente cualquier paquete estadístico decente proporcionará una función log-gamma o log-factorial.

Mencionas R; lo ha hecho:

  • lgamma que es el logaritmo de la función gamma

  • lfactorial que es el logaritmo de la función factorial

  • lchoose que es el logaritmo del coeficiente binomial.

utilizando cualquiera de ellos, puedes calcular el logaritmo de la probabilidad deseada. Si no va a causar underflow hacerlo, siempre se puede exponenciar al final.

Véase ?gamma

Una alternativa si no tienes una función de este tipo es mantener todos los términos de cada coeficiente binomial en casillas (es decir, si hay un "11" de la expansión de un coeficiente binomial en un numerador, añade '1' a una casilla "11", y si hay un "11" en un denominador, resta '1'. Después de haber recorrido todos los coeficientes, puedes multiplicar y dividir en un orden tal que el resultado no se aleje demasiado de 1 (al menos hasta que te quedes sin términos en el numerador). Una ventaja de este enfoque es que puedes mantener los resultados como fracciones exactas si lo deseas. (Puede hacerlo más sofisticado cancelando entonces los factores comunes antes de empezar la multiplicación y la división... pero es probable que eso no merezca la pena si sólo quiere una respuesta numérica).

Una tercera alternativa es generar respuestas aproximadas mediante la aproximación de Stirling, pero esto no debería ser necesario (si lo estuviera resolviendo mentalmente, lo haría de esta manera).

1 votos

+1. Para ver un ejemplo en el que se utilizan registros, consulte el código de la pregunta math.stackexchange.com/questions/465318/ que calcula $\displaystyle\sum_{i=0}^n (-2)^i {n \choose i}\frac{(2n-i)!}{(2n)!}$ para $n= 10^6$

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X