Necesito optimizar el cálculo de las frecuencias de gametos en poblaciones.Optimizar el cálculo de frecuencias de gametos en poblaciones
Tengo np
poblaciones y Ne
personas en cada población. Cada individuo está formado por dos gametos (masculino y femenino). Cada gameto contiene tres genes. Cada gen puede ser 0
o 1
. Entonces cada individuo es una matriz de 2x3. Cada fila de la matriz es un gameto dado por uno de los padres. El conjunto de individuos en cada población puede ser arbitrario (pero siempre de Ne
de longitud). Por simplicidad poblaciones iniciales con individuos pueden ser dados como:
Ne = 300; np = 3^7;
(*This table may be arbitrary with the same shape*)
ind = Table[{{0, 0, 0}, {1, 1, 1}}, {np}, {Ne}]
conjunto completo de todos los gametos posibles:
allGam = Tuples[{0, 1}, 3]
cada individuo puede generar un gameto por 8 posibles formas con la misma probabilidad. Estos gametos son: [email protected]@ind[[iPop, iInd]]
(donde iPop
y iInd
- índices de población y de individuos en esa población). Necesito calcular las frecuencias de gametos generadas por individuos para cada población.
En este momento mi solución es la siguiente.
Al principio, me convierto cada individuo en gametos se puede producir:
gamsInPop = Map[Sequence @@ [email protected]@# &, ind, {2}]
Pero más eficiente manera de hacer esto es:
gamsInPop =
Table[Join @@ Table[[email protected]@ind[[i, j]], {j, 1, Ne}], {i, 1, np}]
En segundo lugar, puedo calcular las frecuencias de gametos producidos incluyendo frecuencias cero para los gametos que son posibles pero ausentes en la población:
gamFrq = Table[Count[pop, gam]/(8 Ne), {pop, gamInPop}, {gam, allGam}]
Versión más eficiente de este código:
gamFrq = Total[
Developer`ToPackedArray[
gamInPop /. Table[
allGam[[i]] -> Insert[{0, 0, 0, 0, 0, 0, 0}, 1, i], {i, 1,
8}]], {2}]/(8 Ne)
Desafortunadamente, el código es aún demasiado lento. ¿Alguien puede ayudarme a acelerarlo?
I añadido la etiqueta combinatoria; Creo que eso ayudará. No tengo tiempo para este en este momento. –