En la teoría de la probabilidad , el algoritmo de Gillespie (u ocasionalmente el algoritmo de Doob-Gillespie ) genera una trayectoria estadísticamente correcta (posible solución) de un sistema de ecuaciones estocásticas para las que se conocen las velocidades de reacción . Fue creado por Joseph L. Doob y otros (alrededor de 1945), presentado por Dan Gillespie en 1976, y popularizado en 1977 en un artículo donde lo usa para simular sistemas de reacciones químicos o bioquímicos de manera eficiente y precisa utilizando un poder computacional limitado (ver simulación estocástica ) [ cita requerida ]. A medida que las computadoras se han vuelto más rápidas, el algoritmo se ha utilizado para simular sistemas cada vez más complejos. El algoritmo es particularmente útil para simular reacciones dentro de las células, donde el número de reactivos es bajo y el seguimiento de la posición y el comportamiento de las moléculas individuales es computacionalmente factible. Matemáticamente, es una variante de un método dinámico de Monte Carlo y similar a los métodos cinéticos de Monte Carlo . Se utiliza mucho en biología de sistemas computacionales . [ cita requerida ]
Historia
El proceso que condujo al algoritmo reconoce varios pasos importantes. En 1931, Andrei Kolmogorov introdujo las ecuaciones diferenciales correspondientes a la evolución temporal de los procesos estocásticos que proceden por saltos, hoy conocidas como ecuaciones de Kolmogorov (proceso de salto de Markov) (una versión simplificada se conoce como ecuación maestra en las ciencias naturales). Fue William Feller , en 1940, quien encontró las condiciones bajo las cuales las ecuaciones de Kolmogorov admitían probabilidades (adecuadas) como soluciones. En su Teorema I (trabajo de 1940) establece que el tiempo hasta el siguiente salto se distribuyó exponencialmente y la probabilidad del próximo evento es proporcional a la tasa. Como tal, estableció la relación de las ecuaciones de Kolmogorov con los procesos estocásticos . Más tarde, Doob (1942, 1945) extendió las soluciones de Feller más allá del caso de los procesos de salto puro. El método fue implementado en computadoras por David George Kendall (1950) usando la computadora Manchester Mark 1 y luego usado por Maurice S. Bartlett (1953) en sus estudios de brotes epidémicos. Gillespie (1977) obtiene el algoritmo de una manera diferente haciendo uso de un argumento físico.
Idea detrás del algoritmo
Las ecuaciones de velocidad bioquímicas continuas y deterministas tradicionales no predicen con precisión las reacciones celulares, ya que se basan en reacciones masivas que requieren las interacciones de millones de moléculas. Por lo general, se modelan como un conjunto de ecuaciones diferenciales ordinarias acopladas. Por el contrario, el algoritmo de Gillespie permite una simulación discreta y estocástica de un sistema con pocos reactivos porque cada reacción se simula explícitamente. Una trayectoria correspondiente a una sola simulación de Gillespie representa una muestra exacta de la función de masa de probabilidad que es la solución de la ecuación maestra .
La base física del algoritmo es la colisión de moléculas dentro de un recipiente de reacción. Se supone que las colisiones son frecuentes, pero las colisiones con la orientación y la energía adecuadas son poco frecuentes. Por lo tanto, todas las reacciones dentro del marco de Gillespie deben involucrar como máximo dos moléculas. Se supone que las reacciones que involucran a tres moléculas son extremadamente raras y se modelan como una secuencia de reacciones binarias. También se supone que el entorno de reacción está bien mezclado.
Algoritmo
Una revisión reciente (Gillespie, 2007) describe tres formulaciones diferentes, pero equivalentes; los métodos directo, de primera reacción y de primera familia, en los que los dos primeros son casos especiales del segundo. La formulación de los métodos directo y de primera reacción se centra en realizar los pasos habituales de inversión de Monte-Carlo sobre la llamada "premisa fundamental de la cinética química estocástica", que matemáticamente es la función
- ,
donde cada uno de los términos son funciones de propensión de una reacción elemental, cuyo argumento es , el vector de recuentos de especies. La parámetro es el tiempo hasta la siguiente reacción (o tiempo de estancia), y es, por supuesto, la hora actual. Parafraseando a Gillespie, esta expresión se lee como "la probabilidad, dada, que la siguiente reacción del sistema ocurrirá en el intervalo de tiempo infinitesimal , y será de estequiometría correspondiente a la la reacción ". Esta formulación proporciona una ventana a los métodos directos y de primera reacción al implicar es una variable aleatoria distribuida exponencialmente, y es "una variable aleatoria entera estadísticamente independiente con probabilidades puntuales ".
Por lo tanto, el método de generación de Monte-Carlo es simplemente dibujar dos números pseudoaleatorios, y en y calcular
- ,
y
- el entero más pequeño que satisface .
Utilizando este método de generación para el tiempo de estancia y la siguiente reacción, Gillespie establece el algoritmo del método directo como
1. Inicialice la hora y el estado del sistema 2. Con el sistema en estado en el momento , evaluar todos los y su suma 3. Efectúe la siguiente reacción reemplazando y 4. Grabar como se desee. Vuelva al paso 1 o finalice la simulación.
Esta familia de algoritmos es computacionalmente costosa y, por lo tanto, existen muchas modificaciones y adaptaciones, incluido el siguiente método de reacción (Gibson & Bruck), el salto tau , así como técnicas híbridas donde se modelan abundantes reactivos con comportamiento determinista. Las técnicas adaptadas generalmente comprometen la exactitud de la teoría detrás del algoritmo ya que se conecta a la ecuación maestra, pero ofrecen realizaciones razonables para escalas de tiempo muy mejoradas. El costo computacional de las versiones exactas del algoritmo está determinado por la clase de acoplamiento de la red de reacción. En redes débilmente acopladas, el número de reacciones que está influenciado por cualquier otra reacción está limitado por una pequeña constante. En redes fuertemente acopladas, la activación de una sola reacción puede afectar, en principio, a todas las demás reacciones. Se ha desarrollado una versión exacta del algoritmo con escalado de tiempo constante para redes débilmente acopladas, lo que permite una simulación eficiente de sistemas con un gran número de canales de reacción (Slepoy Thompson Plimpton 2008). El algoritmo de Gillespie generalizado que explica las propiedades no markovianas de eventos bioquímicos aleatorios con retraso ha sido desarrollado por Bratsun et al. 2005 e independientemente Barrio et al. 2006, así como (Cai 2007). Consulte los artículos citados a continuación para obtener más detalles.
Las formulaciones de propensión parcial, desarrolladas independientemente por Ramaswamy et al. (2009, 2010) e Indurkhya y Beal (2010), están disponibles para construir una familia de versiones exactas del algoritmo cuyo costo computacional es proporcional al número de especies químicas en la red, en lugar del (mayor) número de reacciones. Estas formulaciones pueden reducir el costo computacional al escalado en tiempo constante para redes débilmente acopladas y escalar como máximo linealmente con el número de especies para redes fuertemente acopladas. También se ha propuesto una variante de propensión parcial del algoritmo de Gillespie generalizado para reacciones con retrasos (Ramaswamy Sbalzarini 2011). El uso de métodos de propensión parcial se limita a reacciones químicas elementales, es decir, reacciones con como máximo dos reactivos diferentes. Cada reacción química no elemental se puede descomponer de manera equivalente en un conjunto de reacciones elementales, a expensas de un aumento lineal (en el orden de la reacción) en el tamaño de la red.
Considere la siguiente implementación orientada a objetos de los métodos de primera reacción y directa, que están contenidos en una clase de Python 3:
desde el registro de importación matemática desde la importación aleatoria aleatoria clase SSA : "" "Contenedor para SSA " "" def __init__ ( self , model ): "" "Inicializar contenedor con modelo y generador de números pseudoaleatorios" "" self . modelo = modelo de sí mismo . aleatorio = aleatorio def direct ( self ): "" "Generador indefinido de trayectorias de método directo" "" while True : while not self . modelo . salir (): # Evaluar los pesos y de partición pesos = [ ( rxn , sto , pro ( auto . Modelo )) para ( rxn , sto , pro ) en sí mismo . modelo . reacciones ] partición = suma ( w [ - 1 ] para w en pesos ) # evaluar el tiempo de estancia (MC paso 1) estancia = log ( 1.0 / self . random ()) / partición propia . modelo [ "tiempo" ] . append ( auto . modelo [ "tiempo" ] [ - 1 ] + estancia ) # evaluar la reacción (MC paso 2) partición = partición * self . aleatorio () mientras que la partición > = 0.0 : rxn , sto , pro = pesos . partición pop ( 0 ) - = pro para especies , delta en sto . elementos (): self . modelo [ especie ] . append ( auto . modelo [ especies ] [ - 1 ] + delta ) yo . modelo . curate () rendimiento propio . modelo de sí mismo . modelo . reiniciar () def first_reaction ( self ): "" "Generador indefinido de trayectorias de 1ª reacción" "" while True : while not self . modelo . salir (): # Evaluar próximos tiempos de reacción veces = [ ( log ( 1,0 / auto . Aleatorio () ) / pro ( auto . Modelo ), sto ) para ( rxn , sto , pro ) en sí mismo . modelo . reacciones ] tiempos . ordenar () # evaluar el tiempo de reacción de uno mismo . modelo [ "tiempo" ] . append ( auto . modelo [ "tiempo" ] [ - 1 ] + tiempos [ 0 ] [ 0 ] ) # evaluar la reacción para especies , delta en tiempos [ 0 ] [ 1 ] . elementos (): self . modelo [ especie ] . append ( auto . modelo [ especies ] [ - 1 ] + delta ) yo . modelo . curate () rendimiento propio . modelo de sí mismo . modelo . reiniciar ()
Los miembros direct
y first_reaction
son generadores indefinidos, lo que significa que producirán trayectorias continuamente, siendo cada trayectoria una simulación completa del sistema, en un bucle hasta que una señal rompa ese bucle. Una advertencia importante para cualquier implementación de este algoritmo es que no proporciona lógica para distinguir entre eventos elementales posibles e imposibles. Por lo tanto, para utilizar realmente cualquiera de las versiones del algoritmo en un bucle y producir cierto número de trayectorias para el análisis, esta clase requiere que se le pase un modelo en la instanciación. Además de las especies de vivienda poblaciones y funciones de propensión, un modelo dispone de tres métodos que el algoritmo de Gillespie realiza llamadas a: curate
, exit
, y reset
. El propósito de estos métodos se especifica a continuación y, esencialmente, gobiernan cuándo sale el algoritmo. El razonamiento detrás de la introducción de la clase modelo es principalmente para evitar mezclar las propiedades cinéticas del proceso específico que se está simulando con la lógica interna del algoritmo de Gillespie.
El siguiente modelo es una subclase diccionario con miembros del público curate
, exit
y reset
que respectivamente
- determinar qué reacciones son y no son válidas al final de cada iteración de una trayectoria dada;
- volver
True
si no hay más reacciones posibles; - devolver los hash del modelo a sus valores originales (es decir, sus condiciones iniciales) al final de una trayectoria determinada.
clase SSAModel ( dict ): "" "Contenedor para el modelo SSA" "" def __init__ ( self , initial_conditions , propensities , estequiometry ): "" "Inicializar modelo" "" super () . __init__ ( ** condiciones_iniciales ) self . reacciones = list () self . excluded_reactions = lista () para la reacción , propensión en propensiones . items (): si propensión ( self ) == 0.0 : self . reacciones_excluidas . añadir ( ( reacción , estequiometría [ reacción ], propensión ) ) else : self . reacciones . añadir ( ( reacción , estequiometría [ reacción ], propensión ) ) def exit ( self ): "" "Devuelve True para salir de la trayectoria" "" # return True si no hay más reacciones if len ( self . Reactions ) == 0 : return True # return False si hay más reacciones else : return False def curate ( self ): "" "Validar e invalidar las reacciones del modelo" "" # evaluar posibles reacciones reacciones = [] while len ( auto . reacciones ) > 0 : reacción = auto . reacciones . pop () si reacción [ 2 ] ( self ) == 0 : self . reacciones_excluidas . añadir ( reacción ) else : reacciones . añadir ( reacción ) yo . reacciones = reacciones # Evaluar reacciones imposibles excluded_reactions = [] mientras len ( auto . Excluded_reactions ) > 0 : reacción = auto . reacciones_excluidas . pop () si reacción [ 2 ] ( self ) > 0 : self . reacciones . append ( reacción ) else : excluded_reactions . añadir ( reacción ) yo . reacciones_excluidas = reacciones_excluidas def reset ( self ): "" "Borrar la trayectoria" "" # restablecer las especies a las condiciones iniciales para clave en self : del self [ clave ] [ 1 :] # Reacciones de reposición por las condiciones iniciales auto . curar ()
Ejemplos de
Unión reversible de A y B para formar dímeros AB
Un ejemplo simple puede ayudar a explicar cómo funciona el algoritmo de Gillespie. Considere un sistema de moléculas de dos tipos, A y B . En este sistema, A y B de forma reversible unen entre sí para formar AB dímeros de tal manera que dos reacciones son posibles: o bien A y B reaccionan de manera reversible para formar una AB dímero, o un AB disocia dímero en A y B . La constante de velocidad de reacción para una molécula A dada que reacciona con una molécula B única dada es, y la velocidad de reacción para la ruptura de un dímero AB es.
Si en el tiempo t hay una molécula de cada tipo, entonces la tasa de formación de dímeros es, mientras que si hay moléculas de tipo A ymoléculas de tipo B , la tasa de formación de dímeros es. Si hay dímeros, entonces la tasa de disociación del dímero es .
La velocidad de reacción total, , en el tiempo t está dado por
Entonces, ahora hemos descrito un modelo simple con dos reacciones. Esta definición es independiente del algoritmo de Gillespie. Ahora describiremos cómo aplicar el algoritmo de Gillespie a este sistema.
En el algoritmo, avanzamos en el tiempo en dos pasos: calculando el tiempo hasta la siguiente reacción y determinando cuál de las posibles reacciones es la siguiente reacción. Se supone que las reacciones son completamente aleatorias, por lo que si la velocidad de reacción en un tiempo t es, entonces el tiempo, δ t , hasta que ocurre la siguiente reacción es un número aleatorio extraído de la función de distribución exponencial con media. Por lo tanto, avanzamos el tiempo de t a t + δ t .
La probabilidad de que esta reacción sea una molécula A que se une a una molécula B es simplemente la fracción de la velocidad total debida a este tipo de reacción, es decir,
la probabilidad de que la reacción sea
La probabilidad de que la siguiente reacción sea un dímero AB que se disocie es solo 1 menos eso. Entonces, con estas dos probabilidades, formamos un dímero reduciendo y en uno, y aumentar por uno, o disociamos un dímero y aumentamos y por uno y disminuir por uno.
Ahora ambos hemos avanzado el tiempo hasta t + δ t y hemos realizado una sola reacción. El algoritmo de Gillespie simplemente repite estos dos pasos tantas veces como sea necesario para simular el sistema durante el tiempo que queramos (es decir, para tantas reacciones). El resultado de una simulación de Gillespie que comienza con y en t = 0, y donde y , se muestra a la derecha. Para estos valores de parámetro, en promedio hay 8dímeros y 2 de A y B, pero debido al pequeño número de moléculas, las fluctuaciones alrededor de estos valores son grandes. El algoritmo de Gillespie se utiliza a menudo para estudiar sistemas donde estas fluctuaciones son importantes.
Ese fue solo un ejemplo simple, con dos reacciones. Los sistemas más complejos con más reacciones se manejan de la misma manera. Todas las velocidades de reacción deben calcularse en cada paso de tiempo, y debe elegirse una con una probabilidad igual a su contribución fraccionaria a la velocidad. Luego se avanza el tiempo como en este ejemplo.
La epidemia de SIR sin dinámica vital
El modelo SIR es una descripción biológica clásica de cómo ciertas enfermedades penetran a través de una población de tamaño fijo. En su forma más simple haymiembros de la población, por lo que cada miembro puede estar en uno de los tres estados (susceptible, infectado o recuperado) en cualquier momento, y cada miembro pasa irreversiblemente a través de estos estados de acuerdo con el gráfico que se indica a continuación. Podemos denotar el número de miembros susceptibles como, el número de miembros infectados como , y el número de miembros recuperados como . Por lo tanto para cualquier momento.
Además, un miembro susceptible dado pasará al estado infectado al entrar en contacto con cualquiera de los miembros infectados, por lo que la infección se produce con la tasa . Un miembro dado del estado infectado se recupera sin depender de ninguno de los tres estados, que se especifica mediante la tasa β . Dado este esquema básico, es posible construir el siguiente sistema no lineal.
- ,
- ,
- .
Este sistema no tiene solución analítica. Un enfoque podría ser usar el algoritmo de Gillespie, simular el sistema muchas veces y usar una técnica de regresión como mínimos cuadrados para ajustar un polinomio sobre todas las trayectorias. A medida que aumenta el número de trayectorias, tal regresión polinomial se comportará asintóticamente como la solución numérica (líneas negras). Además de estimar la solución de un problema insoluble como la epidemia de SIR, la naturaleza estocástica de cada trayectoria permite calcular estadísticas distintas de. Al ejecutar el siguiente script, a veces se obtienen realizaciones de la epidemia de SIR que difieren drásticamente de la solución numérica. Por ejemplo, cuando todas las personas se curan (por casualidad) muy temprano o muy tarde.
Las trayectorias presentadas en la figura anterior se obtuvieron con la siguiente implementación Python del método directo, junto con una clase modelo cuyos miembros interactúan con la maquinaria del método directo para realizar simulaciones generales con las teorías subyacentes al algoritmo de Gillespie. Estos se presentan arriba. Además, se invoca un solucionador de ODE de SciPy para obtener la solución numérica del sistema de ecuaciones diferenciales, es decir, una representación de.
desde matplotlib importar pyplot desde numpy importar linspace desde scipy.integrate importar odeint# recuentos iniciales de especies y tiempos de estancia initital_conditions = { "s" : [ 480 ], "i" : [ 20 ], "r" : [ 0 ], "tiempo" : [ 0.0 ], }# funciones propensiones propensiones = { 0 : lambda d : 2.0 * d [ "s" ] [ - 1 ] * d [ "i" ] [ - 1 ] / 500 , 1 : lambda d : 1.0 * d [ "i" ] [ - 1 ], }# cambio de especie para cada estequiometría de propensión = { 0 : { "s" : - 1 , "i" : 1 , "r" : 0 }, 1 : { "s" : 0 , "i" : - 1 , " r " : 1 }, }# instanciar la epidemia modelo SSA contenedor epidemia = SSAModel ( initital_conditions , propensities , estequiometría )# instanciar el contenedor SSA con el modelo epidemic_generator = SSA ( epidemia )# Haz una gráfica de tamaño grande y bonita . figura ( tamaño de la figura = ( 10 , 10 ), dpi = 500 )# hacer una subparcela para los individuos susceptibles, infectados y recuperados axes_s = pyplot . subtrama ( 311 ) ejes_s . set_ylabel ( "individuos susceptibles" )axes_i = pyplot . subtrama ( 312 ) axes_i . set_ylabel ( "individuos infectados" )axes_r = pyplot . subtrama ( 313 ) axes_r . set_ylabel ( "individuos recuperados" ) axes_r . set_xlabel ( "tiempo (unidades arbitrarias)" )# simular y graficar 30 trayectorias trayectorias = 0 para trayectoria en epidemic_generator . directo (): ejes_s . plot ( trayectoria [ "tiempo" ], trayectoria [ "s" ], color = "naranja" ) axes_i . plot ( trayectoria [ "tiempo" ], trayectoria [ "i" ], color = "naranja" ) axes_r . plot ( trayectoria [ "tiempo" ], trayectoria [ "r" ], color = "naranja" ) trayectorias + = 1 si trayectorias == 30 : romper# solución numérica usando un solucionador de ecuaciones diferenciales ordinario r t = linspace ( 0 , 14 , num = 200 ) y0 = ( 480 , 20 , 0 ) alpha = 2.0 beta = 1.0def diferencial_SIR ( n_SIR , t , alpha , beta ): dS_dt = - alpha * n_SIR [ 0 ] * n_SIR [ 1 ] / 500 dI_dt = (( alpha * n_SIR [ 0 ] / 500 ) - beta ) * n_SIR [ 1 ] dR_dt = beta * n_SIR [ 1 ] return dS_dt , dI_dt , dR_dtsolución = odeint ( diferencial_SIR , y0 , t , args = ( alfa , beta )) solución = [[ fila [ i ] para fila en solución ] para i en rango ( 3 )]# trazar la solución numérica axes_s . plot ( t , solución [ 0 ], color = "negro" ) axes_i . plot ( t , solución [ 1 ], color = "negro" ) axes_r . plot ( t , solución [ 2 ], color = "negro" )pyplot . mostrar ()
Otras lecturas
- Gillespie, Daniel T. (1977). "Simulación estocástica exacta de las reacciones químicas acopladas". La Revista de Química Física . 81 (25): 2340–2361. CiteSeerX 10.1.1.704.7634 . doi : 10.1021 / j100540a008 .
- Gillespie, Daniel T. (1976). "Un método general para simular numéricamente la evolución del tiempo estocástico de reacciones químicas acopladas". Revista de Física Computacional . 22 (4): 403–434. Código bibliográfico : 1976JCoPh..22..403G . doi : 10.1016 / 0021-9991 (76) 90041-3 .
- Gibson, Michael A .; Bruck, Jehoshua (2000). "Simulación estocástica exacta eficiente de sistemas químicos con muchas especies y muchos canales" (PDF) . Journal of Physical Chemistry A . 104 (9): 1876–1889. Código Bibliográfico : 2000JPCA..104.1876G . doi : 10.1021 / jp993732q .
- Doob, Jacob L. (1942). "Temas de la teoría de las cadenas de marcado" . Transacciones de la American Mathematical Society . 52 (1): 37–64. doi : 10.1090 / S0002-9947-1942-0006633-7 . JSTOR 1990152 .
- Doob, Jacob L. (1945). "Cadenas de Markoff - Caso numerable". Transacciones de la American Mathematical Society . 58 (3): 455–473. doi : 10.2307 / 1990339 . JSTOR 1990339 .
- Prensa, William H .; Teukolsky, Saul A .; Vetterling, William T .; Flannery, Brian P. (2007). "Sección 17.7. Simulación estocástica de redes de reacción química" . Recetas numéricas: el arte de la informática científica (3ª ed.). Nueva York, NY: Cambridge University Press. ISBN 978-0-521-88068-8.
- Kolmogorov, Andrey N. (1931). "Über die analytischen Methoden in der Wahrscheinlichkeitsrechnung" [Sobre métodos analíticos en la teoría de la probabilidad]. Mathematische Annalen . 104 : 415–458. doi : 10.1007 / BF01457949 . S2CID 119439925 .
- Feller, Willy (1940). "Sobre las ecuaciones integro-diferenciales de procesos de marcación puramente discontinuos" . Transacciones de la American Mathematical Society . 48 (3): 4885-15. doi : 10.2307 / 1990095 . JSTOR 1970064 .
- Kendall, David G. (1950). "Una realización artificial de un proceso simple de" nacimiento y muerte "". Revista de la Sociedad Real de Estadística, Serie B . 12 (1): 116-119. JSTOR 2983837 .
- Bartlett, Maurice S. (1953). "Procesos estocásticos o estadísticas de cambio". Revista de la Sociedad Real de Estadística, Serie C . 2 (1): 44–64. JSTOR 2985327 .
- Rathinam, Muruhan; Petzold, Linda R .; Cao, Yang; Gillespie, Daniel T. (2003). "Rigidez en sistemas estocásticos que reaccionan químicamente: el método implícito de salto tau". Revista de Física Química . 119 (24): 12784–12794. Código bibliográfico : 2003JChPh.11912784R . doi : 10.1063 / 1.1627296 .
- Sinitsyn, Nikolai A .; Hengartner, Nicolas; Nemenman, Ilya (2009). "Grano grueso adiabático y simulaciones de redes bioquímicas estocásticas" (PDF) . Actas de la Academia Nacional de Ciencias de los Estados Unidos de América . 106 (20): 10546-10551. Código bibliográfico : 2009PNAS..10610546S . doi : 10.1073 / pnas.0809340106 . PMC 2705573 . PMID 19525397 . Archivado desde el original (PDF) el 14 de julio de 2011.
- Salis, Howard; Kaznessis, Yiannis N. (2005). "Simulación estocástica híbrida precisa de un sistema de reacciones químicas o bioquímicas acopladas". Revista de Física Química . 122 (5): 054103. Código bibliográfico : 2005JChPh.122e4103S . doi : 10.1063 / 1.1835951 . PMID 15740306 .
- (Slepoy Thompson Plimpton 2008): Slepoy, Alexander; Thompson, Aidan P .; Plimpton, Steven J. (2008). "Un algoritmo de Monte Carlo cinético en tiempo constante para la simulación de grandes redes de reacciones bioquímicas". Revista de Física Química . 128 (20): 205101. Código Bibliográfico : 2008JChPh.128t5101S . doi : 10.1063 / 1.2919546 . PMID 18513044 .
- (Bratsun et al. 2005): Bratsun, Dmitri; Volfson, Dmitri; Rápido, Jeff; Tsimring, Lev S. (2005). "Oscilaciones estocásticas inducidas por retraso en la regulación de genes" . Actas de la Academia Nacional de Ciencias de los Estados Unidos de América . 102 (41): 14593–8. Código Bibliográfico : 2005PNAS..10214593B . doi : 10.1073 / pnas.0503858102 . PMC 1253555 . PMID 16199522 .
- (Barrio et al. 2006): Barrio, Manuel; Burrage, Kevin; Leier, André; Tian, Tianhai (2006). "Regulación oscilatoria de hes1 : modelado y simulación de retardo estocástico discreto" . PLOS Biología Computacional . 2 (9): 1017. Código bibliográfico : 2006PLSCB ... 2..117B . doi : 10.1371 / journal.pcbi.0020117 . PMC 1560403 . PMID 16965175 .
- (Cai 2007): Cai, Xiaodong (2007). "Simulación estocástica exacta de reacciones químicas acopladas con retardos". Revista de Física Química . 126 (12): 124108. Código Bibliográfico : 2007JChPh.126l4108C . doi : 10.1063 / 1.2710253 . PMID 17411109 .
- (Barnes Chu 2010): Barnes, David J .; Chu, Dominique (2010). Introducción al modelado para biociencias . Springer Verlag.
- (Ramaswamy González-Segredo Sbalzarini 2009): Ramaswamy, Rajesh; González-Segredo, Nélido; Sbalzarini, Ivo F. (2009). "Una nueva clase de algoritmos de simulación estocástica exacta altamente eficientes para redes de reacción química". Revista de Física Química . 130 (24): 244104. arXiv : 0906.1992 . Código Bibliográfico : 2009JChPh.130x4104R . doi : 10.1063 / 1.3154624 . PMID 19566139 . S2CID 4952205 .
- (Ramaswamy Sbalzarini 2010): Ramaswamy, Rajesh; Sbalzarini, Ivo F. (2010). "Una variante de propensión parcial del algoritmo de simulación estocástica de rechazo de composición para redes de reacción química" (PDF) . Revista de Física Química . 132 (4): 044102. Código Bibliográfico : 2010JChPh.132d4102R . doi : 10.1063 / 1.3297948 . PMID 20113014 .
- (Indurkhya Beal 2010): Indurkhya, Sagar; Beal, Jacob S. (2005). Isalan, Mark (ed.). "Reacción factorización y gráficos de actualización bipartita aceleran el algoritmo de Gillespie para sistemas bioquímicos a gran escala" . PLOS ONE . 5 (1): e8125. Código bibliográfico : 2010PLoSO ... 5.8125I . doi : 10.1371 / journal.pone.0008125 . PMC 2798956 . PMID 20066048 .
- (Ramaswamy Sbalzarini 2011): Ramaswamy, Rajesh; Sbalzarini, Ivo F. (2011). "Una formulación de propensión parcial del algoritmo de simulación estocástica para redes de reacción química con retrasos" (PDF) . Revista de Física Química . 134 (1): 014106. Código Bibliográfico : 2011JChPh.134a4106R . doi : 10.1063 / 1.3521496 . PMID 21218996 .
- (Yates Klingbeil 2013): Yates, Christian A .; Klingbeil, Guido (2013). "Reciclaje de números aleatorios en el algoritmo de simulación estocástica" . Revisión anual de química física . 58 (9): 094103. Código Bibliográfico : 2013JChPh.138i4103Y . doi : 10.1063 / 1.4792207 . PMID 23485273 .
- Gillespie, Daniel T. (2007). "Simulación estocástica de cinética química". La Revista de Química Física . 58 : 35–55. doi : 10.1146 / annurev.physchem.58.032806.104637 . PMID 17037977 .
enlaces externos
- Un repositorio que contiene todo el código fuente utilizado en este artículo.