Skip to content

Instantly share code, notes, and snippets.

@AndreyAkinshin
Created January 23, 2020 16:21
Show Gist options
  • Save AndreyAkinshin/a7450a9d234da67fee8e67ab6f4364f8 to your computer and use it in GitHub Desktop.
Save AndreyAkinshin/a7450a9d234da67fee8e67ab6f4364f8 to your computer and use it in GitHub Desktop.
Drosophila Model
library(ggplot2)
library(deSolve)
library(ggpubr)
'%=%' <- function(x, y) {
x <- as.character(substitute(x)[-1])
if (length(y) < length(x))
y <- rep(y, ceiling(length(x) / length(y)))
if (length(y) > length(x))
y <- y[1:length(x)]
mapply(assign, x, y, MoreArgs = list(envir = parent.frame()))
invisible()
}
h <- function(v) v > 0
dt_x <- 0
dt_y <- 0
dt_z <- 0
dt_u <- 0
dt_w <- 0
dt_p <- 0
Gro <- 1
EMC <- 1
D <- 2.05
L <- 1
UB <- 1.17
SINA <- 5.6
C <- 1
n1 <- 2
n3 <- 2
n5 <- 2
m1 <- 1.77
m2 <- 1
m3 <- 1
m4 <- 1
m5 <- 1
m6 <- 1
m7 <- 1
kx <- 1
ky <- 1
kz <- 1
ku <- 1
kw <- 1
kp <- 1
a3 <- 3.61
b3 <- 4.96
c3 <- 1.35
a4 <- 4.43
b4 <- 6.09
c4 <- 1.66
a5 <- 8.09
b5 <- 11.13
c5 <- 3.03
a6 <- 2.67
b6 <- 3.67
c6 <- 1
d1 <- 7.46
d3 <- 2.77
d5 <- 1.24
x0 <- 0.56
y0 <- 1.59
z0 <- 0.15
u0 <- 0
w0 <- 0
p0 <- 0
sigma1 <- function (v) {
h(v) * d1 * v ^ n1 / (1 + v ^ n1)
}
sigma3 <- function (v) {
h(v) * d3 * v ^ n3 / (1 + v ^ n3)
}
sigma5 <- function (v) {
h(v) * d5 * v ^ n5 / (1 + v ^ n5)
}
s3 <- function (v) {
h(v) * a3 * exp((v - b3) / c3) / (1 + exp((v - b3) / c3))
}
s4 <- function (v) {
h(v) * a4 * exp((v - b4) / c4) / (1 + exp((v - b4) / c4))
}
s5 <- function (v) {
h(v) * a5 * exp((v - b5) / c5) / (1 + exp((v - b5) / c5))
}
s6 <- function (v) {
h(v) * a6 * exp((v - b6) / c6) / (1 + exp((v - b6) / c6))
}
# Helper for x'
x_helper <- function(t, lagPoint, currentPoint = lagPoint) {
c(x, y, z, u, w, p) %=% lagPoint
c(x_curr, y_curr, z_curr, u_curr, w_curr, p_curr) %=% currentPoint
kx * (sigma1(D * x) + sigma3(z) + sigma5(w)) / ((1 + Gro * y) * (1 + EMC * x)) - m1 * x * (1 + p_curr * UB * SINA)
}
# Modelling for x'
x_model <- function(t, dt, startValue, point, args, ...) {
if (t < 0) { startValue }
else if (t < dt || dt < 0.01) {
lagPoint <- x_helper(t, point)
} else {
lagPoint <- lagvalue(t - dt)
x_helper(t, lagPoint, point)
}
}
# Helper for y'
y_helper <- function(t, lagPoint, currentPoint = lagPoint) {
c(x, y, z, u, w, p) %=% lagPoint
c(x_curr, y_curr, z_curr, u_curr, w_curr, p_curr) %=% currentPoint
ky * C / (1 + u ^ m7) - m2 * y_curr
}
# Modelling for y'
y_model <- function(t, dt, startValue, point, args, ...) {
if (t < 0) { startValue }
else if (t < dt || dt < 0.01) {
lagPoint <- y_helper(t, point)
} else {
lagPoint <- lagvalue(t - dt)
y_helper(t, lagPoint, point)
}
}
# Helper for z'
z_helper <- function(t, lagPoint, currentPoint = lagPoint) {
c(x, y, z, u, w, p) %=% lagPoint
c(x_curr, y_curr, z_curr, u_curr, w_curr, p_curr) %=% currentPoint
kz * s3(D * x) - m3 * z_curr
}
# Modelling for z'
z_model <- function(t, dt, startValue, point, args, ...) {
if (t < 0) { startValue }
else if (t < dt || dt < 0.01) {
lagPoint <- z_helper(t, point)
} else {
lagPoint <- lagvalue(t - dt)
z_helper(t, lagPoint, point)
}
}
# Helper for u'
u_helper <- function(t, lagPoint, currentPoint = lagPoint) {
c(x, y, z, u, w, p) %=% lagPoint
c(x_curr, y_curr, z_curr, u_curr, w_curr, p_curr) %=% currentPoint
ku * s4(D * x) - m4 * u_curr
}
# Modelling for u'
u_model <- function(t, dt, startValue, point, args, ...) {
if (t < 0) { startValue }
else if (t < dt || dt < 0.01) {
lagPoint <- u_helper(t, point)
} else {
lagPoint <- lagvalue(t - dt)
u_helper(t, lagPoint, point)
}
}
# Helper for w'
w_helper <- function(t, lagPoint, currentPoint = lagPoint) {
c(x, y, z, u, w, p) %=% lagPoint
c(x_curr, y_curr, z_curr, u_curr, w_curr, p_curr) %=% currentPoint
kw * s5(D * x) - m5 * w_curr
}
# Modelling for w'
w_model <- function(t, dt, startValue, point, args, ...) {
if (t < 0) { startValue }
else if (t < dt || dt < 0.01) {
lagPoint <- w_helper(t, point)
} else {
lagPoint <- lagvalue(t - dt)
w_helper(t, lagPoint, point)
}
}
# Helper for p'
p_helper <- function(t, lagPoint, currentPoint = lagPoint) {
c(x, y, z, u, w, p) %=% lagPoint
c(x_curr, y_curr, z_curr, u_curr, w_curr, p_curr) %=% currentPoint
h(t - 12) * (kp * s6(D * x) * (t - 12) ^ 2 / (L + (t - 12) ^ 2) - m6 * p_curr)
}
# Modelling for p'
p_model <- function(t, dt, startValue, point, args, ...) {
if (t < 0) { startValue }
else if (t < dt || dt < 0.01) {
lagPoint <- p_helper(t, point)
} else {
lagPoint <- lagvalue(t - dt)
p_helper(t, lagPoint, point)
}
}
# Modelling stuff
simulate <- function() {
model <- function(t, p, parms, ...) {
list(c(x_model(t, dt_x, x0, p), y_model(t, dt_y, y0, p), z_model(t, dt_z, z0, p), u_model(t, dt_u, u0, p), w_model(t, dt_w, w0, p), p_model(t, dt_p, p0, p)))
}
t <- seq(0, 16, by = 0.1)
start <- c(x0 * kx, y0 * ky, z0 * kz, u0 * ku, w0 * kw, p0 * kp)
traj <- as.data.frame(dede(start, t, func = model))
plot_x <- traj[, 2]
plot_y <- traj[, 3]
plot_z <- traj[, 4]
plot_u <- traj[, 5]
plot_w <- traj[, 6]
plot_p <- traj[, 7]
linetypes <- c("solid", "dashed", "dotted")
df <- rbind(
data.frame(t, value = plot_x, side = 1, f = "AS-C: x(t)"),
data.frame(t, value = plot_y, side = 1, f = "Hairy: y(t)"),
data.frame(t, value = plot_z, side = 1, f = "Senseless: z(t)"),
data.frame(t, value = plot_u, side = 2, f = "Scratch: u(t)"),
data.frame(t, value = plot_w, side = 2, f = "Charlatan: w(t)"),
data.frame(t, value = plot_p, side = 2, f = "Phyllopod: p(t)")
)
return(df)
}
draw_plot_small <- function(df, side) {
ggplot(df[df$side == side, ], aes(x = t, y = value, color = f, group = f)) +
geom_line(aes(linetype = f)) +
ylim(0, max(df$value)) +
ylab("") +
scale_linetype_manual(values = c("solid", "longdash", "dotdash")) +
theme_bw()+
theme(legend.position = "none")
}
draw_plot_big <- function(df, filename) {
p1 <- draw_plot_small(df, 1)
p2 <- draw_plot_small(df, 2)
p <- ggarrange(p1, p2)
ggsave(paste0(filename, ".png"), p, dpi = 1200, width = 6, height = 4)
show(p)
}
simulate_and_draw <- function(filename, kx.value) {
kx <<- kx.value
df <- simulate()
draw_plot_big(df, filename)
}
simulate_and_draw("figure2", 1)
simulate_and_draw("figure3", 0.8)
simulate_and_draw("figure4", 0.66)
simulate_and_draw("figure5", 0.65)
simulate_and_draw("figure6", 0.6)
@AndreyAkinshin
Copy link
Author

figure2
figure3
figure4
figure5
figure6

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment