-
Notifications
You must be signed in to change notification settings - Fork 3
/
Rscript.R
174 lines (143 loc) · 6.41 KB
/
Rscript.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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
################################################################################################
# #
# Modelling distributions of Aedes aegypti and Aedes albopictus using climate, host density #
# and interspecies competition #
# #
# Yang B. et al. 2019 #
# #
# Zero-inflated negative binomial regression #
# #
################################################################################################
library(glmmTMB)
#
# load data
#
# df <- read.table("~/fl_aeg_alb.txt",
# sep = "\t",
# stringsAsFactors = FALSE)
files <- c("fl_aeg_alb_part_1.txt",
"fl_aeg_alb_part_2.txt")
df <- lapply(files, read.table, sep = "\t",
stringsAsFactors = FALSE)
df <- do.call('rbind', df)
#
# fit ZINB model - main analysis
#
fit <- function(data, # dataset used to fit ZINB model
species # 1 - Ae. aegypti; 2 - Ae. albopictus
){
#
# This is the function to fit ZINB model using glmmTMB
#
# Input:
# data, data used to fit model
# species ==1, Ae. aegypti;
# species ==2, Ae. albopictus
#
# Output:
# a glmmTMB object
#
# formular for logistic component
zi.formular <- ~ occurrence_aeg_1 + occurrence_aeg_2 + occurrence_aeg_3 + # prior occurrence of Aedes aegypti
occurrence_alb_1 + occurrence_alb_2 + occurrence_alb_3 + # prior occurrence of Aedes albopictus
hum_pop_dens + # human population density
wind + tmin + delta_tmax + rh + # climatic variables
light_trap + other_traps + # trap types
(1|site) + (1|county) # random effects for site and county
if(species == 1){
m <- glmmTMB(num_aeg ~ log(abundance_aeg_1+1e-5) + log(abundance_aeg_2+1e-5) + log(abundance_aeg_3+1e-5) +
log(abundance_alb_1+1e-5) + log(abundance_alb_2+1e-5) + log(abundance_alb_3+1e-5) +
hum_pop_dens + # human population density
wind + tmin + delta_tmax + rh + # climatic variables
light_trap + other_traps + # trap types
offset(trap_day) +
(1|site) + (1|county), # random effects for site and county
ziformula=zi.formular, # formular for logistic component
data=data,
family=nbinom2,
verbose=TRUE,
se=TRUE,
control=glmmTMBControl(profile=quote(length(parameters$beta)>=5)))
}
if(species == 2){
m <- glmmTMB(num_alb ~ log(abundance_aeg_1+1e-5) + log(abundance_aeg_2+1e-5) + log(abundance_aeg_3+1e-5) +
log(abundance_alb_1+1e-5) + log(abundance_alb_2+1e-5) + log(abundance_alb_3+1e-5) +
hum_pop_dens + # human population density
wind + tmin + delta_tmax + rh + # climatic variables
light_trap + other_traps + # trap types
offset(trap_day) +
(1|site) + (1|county), # random effects for site and county
ziformula=zi.formular, # formular for logistic component
data=data,
family=nbinom2,
verbose=TRUE,
se=TRUE,
control=glmmTMBControl(profile=quote(length(parameters$beta)>=5)))
}
return(m)
}
data <- df[df$longitudinal_data==1, ] # subset longitudinal training dataset
model <- fit(data, species) # change value of species accordingly
pred.main <- predict(model,
newdata = data,
type = "response",
allow.new.levels = TRUE) # retuen value of mu*(1-p); see predict.glmmTMB for more details
#
# predict no abundance validation dataset
#
fitNoAbundance <- function(data, # dataset used to fit ZINB model
species # 1 - Ae. aegypti; 2 - Ae. albopictus
){
#
# This is the function to fit no abundance model using glmmTMB
#
# Input:
# data, data used to fit model
# species ==1, Ae. aegypti;
# species ==2, Ae. albopictus
#
# Output:
# a glmmTMB object
#
# formular for logistic component
zi.formular <- ~ hum_pop_dens + # human population density
wind + tmin + delta_tmax + rh + # climatic variables
light_trap + other_traps + # trap types
(1|site) + (1|county) # random effects for site and county
if(species == 1){
m <- glmmTMB(num_aeg ~ hum_pop_dens + # human population density
wind + tmin + delta_tmax + rh + # climatic variables
light_trap + other_traps + # trap types
offset(trap_day) +
(1|site) + (1|county), # random effects for site and county
ziformula=zi.formular, # formular for logistic component
data=data,
family=nbinom2,
verbose=TRUE,
se=TRUE,
control=glmmTMBControl(profile=quote(length(parameters$beta)>=5)))
}
if(species == 2){
m <- glmmTMB(num_alb ~ hum_pop_dens + # human population density
wind + tmin + delta_tmax + rh + # climatic variables
light_trap + other_traps + # trap types
offset(trap_day) +
(1|site) + (1|county), # random effects for site and county
ziformula=zi.formular, # formular for logistic component
data=data,
family=nbinom2,
verbose=TRUE,
se=TRUE,
control=glmmTMBControl(profile=quote(length(parameters$beta)>=5)))
}
return(m)
}
ext <- df[df$external_data == 1, ] # subset no abundance validation dataset
no_abund_model <- fitNoAbundance(data, species)
pred.ext <- predict(no_abund_model,
newdata = ext,
type = "response",
allow.new.levels = TRUE) # retuen value of mu*(1-p); see predict.glmmTMB for more details
#
# The end
#