es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Evite valores negativos al resolver una EDO.

Estoy tratando de modelar el comportamiento de una red ficticia de 5 genes, pero tengo el problema de que obtengo valores negativos, lo cual no tiene sentido biológico.

¿Hay alguna manera de limitar los valores a cero?

Logré hacerlo cuando represento el gráfico, pero no sé cómo usar el “ifelse” en la ecuación principal.

Muchas gracias.


# preliminares library(deSolve) library(ggplot2) library(reshape2) # Valores iniciales values <- c(A = 1, B = 1, D = 1, E = 20, R = 1) # Conjunto de constantes constants <- c(a = 1.2, b = 0.5, c = 1.2, d = 1.5, e = 0.3, f = 0.5, g = 1.5, h = 0.9, i = 1.3, j = 1.3, m = 0.8, n = 0.6, q = 1, t = 0.0075, u = 0.0009, Pa = 100, Pb = 0.05, Pd = 0.1, Pe = 10) # Ecuaciones diferenciales Dynamic_Model <- function(t, values, constants) { with(as.list(c(values, constants)),{ dA <- Pa + a*D - j*A - R dB <- Pb + b*A + e*E - m*B dD <- Pd + d*B + f*E - g*A - n*D dE <- Pe - h*B + i*E - q*E dR <- t*A*B - u*D*E list(c(dA, dB, dD, dE, dR)) }) } # Tiempo times <- seq(0, 200, by = 0.01) # Impresión / Plot out <- ode(y = values, times = times, func = Dynamic_Model, parms = constants) out2 <- ifelse(out<0, 0, out) out.df = as.data.frame(out2) out.m = melt(out.df, id.vars='time') p <- ggplot(out.m, aes(time, value, color = variable)) + geom_point(size=0.5) + ggtitle("Modelo Dinámico")
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de limitar los valores a cero. Puede utilizar la declaración ifelse dentro de la función Dynamic_Model para establecer cualquier valor negativo a 0. Aquí tienes un ejemplo de cómo modificar la función para lograr esto:

    Dynamic_Model <- function(t, values, constants) {
      with(as.list(c(values, constants)), {
    
        dA <- Pa + a*D - j*A - R
        dB <- Pb + b*A + e*E - m*B 
        dD <- Pd + d*B + f*E - g*A - n*D
        dE <- Pe - h*B + i*E - q*E
        dR <- t*A*B - u*D*E
    
        # establecer valores negativos a 0
        dA <- ifelse(dA < 0, 0, dA)
        dB <- ifelse(dB < 0, 0, dB)
        dD <- ifelse(dD < 0, 0, dD)
        dE <- ifelse(dE < 0, 0, dE)
        dR <- ifelse(dR < 0, 0, dR)
    
        list(c(dA, dB, dD, dE, dR))
      })   
    }
    

    Esta modificación verifica si cada una de las derivadas calculadas (dA, dB, dD, dE y dR) es negativa y la establece en 0 en caso afirmativo. De esta manera, cuando el solucionador de EDO integra las ecuaciones, no generará valores negativos.

    Ten en cuenta que esta modificación se aplica dentro de la función, no al trazar los resultados. La declaración ifelse que utilizaste en el código de trazado (out2 <- ifelse(out<0, 0 , out)) no afectará los resultados del modelo en sí, solo el trazado.

Comments are closed.