-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdeterm_functions.R
115 lines (84 loc) · 2.59 KB
/
determ_functions.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#########################################
## Calculating deterministic evolution ##
## of epidemic i.e. solving ODE's ##
#########################################
# For SI-type epidemics
determ_func_SI <- function(initial_values,
timepoints,
parameter_list) {
si_model <- function(current_timepoint,
state_values,
parameters) {
S <- state_values[1]
I <- state_values[2]
with(as.list(parameters), {
dS <- -beta * S * I / N
dI <- beta * S * I / N
results <- c(dS, dI)
list(results)
}
)
}
output <- lsoda(initial_values,
timepoints,
si_model,
parameter_list)
output <- as.data.frame(output) %>%
select(t = time, S_det = S, I_det = I)
return(output)
}
# For SIS-type
# Source: http://rpubs.com/docblount/111138
determ_func_SIS <- function(initial_values,
timepoints,
parameter_list) {
sis_model <- function(current_timepoint,
state_values,
parameters) {
# Define states
S <- state_values[1] # susceptible
I <- state_values[2] # infectious
with(as.list(parameters), {
# Get derivatives
dS <- -beta * S * I / N + gamma * I
dI <- beta * S * I / N - gamma * I
results <- c(dS, dI)
list(results)
})
}
# Format output
output <- lsoda(initial_values,
timepoints,
sis_model,
parameter_list)
output <- as.data.frame(output) %>%
select(t = time, S_det = S, I_det = I)
}
# For SIR-type
determ_func_SIR <- function(initial_values,
timepoints,
parameter_list) {
sir_model <- function(current_timepoint,
state_values,
parameters) {
S <- state_values[1]
I <- state_values[2]
with(as.list(parameters), {
# compute derivatives
dS <- -beta * S * I / N
dI <- beta * S * I / N - gamma * I
dR <- gamma * I
# combine results
results <- c(dS, dI, dR)
list(results)
}
)
}
output <- lsoda(initial_values,
timepoints,
sir_model,
parameter_list)
output <- as.data.frame(output) %>%
select(t = time, S_det = S, I_det = I, R_det = R)
return(output)
}