【发布时间】:2021-03-19 11:55:54
【问题描述】:
我正在关注这个关于 R https://www.youtube.com/watch?v=uAeSykgXnhg 中基于代理的建模的 YouTube 教程。
我使用自己的变量名复制了代码(这有助于我更好地理解导师的代码)。目的是跟踪人们在接触他人时如何感染covid-19。并非每次接触都会导致感染。在连续的模型运行中,感染人数=人口规模,未感染人数应为0。这是我复制的代码:
# define first agent
agents <- data.frame(agent_no = 1,
state = "e",
mixing = runif(1,0,1))
# specify agent population
pop_size <- 100
# fill agent data
for(i in 2:pop_size){
agent <- data.frame(agent_no = i,
state = "s",
mixing = runif(1,0,1))
agents <- rbind(agents, agent)
}
# specify number of model runs
n_times <- 10
# initialise output matrix
out <- matrix(0, ncol = 2, nrow = n_times)
# run simple agent-based model
for(k in 1:n_times){
for(i in 1:pop_size){
# likelihood to meet others
likelihood <- agents$mixing[i]
# how many agents will they meet (integer). Add 1 to make sure everybody meets somebody
connect_with <- round(likelihood * 3, 0) + 1
# which agents will they probably meet (list of agents)
which_others <- sample(1:pop_size,
connect_with,
replace = T,
prob = agents$mixing)
for(j in 1:length(which_others)){
contacts <- agents[which_others[j],]
# if exposed, change state
if(contacts$state == "e"){
urand <- runif(1,0,1)
# control probability of state change
if(urand < 0.5){
agents$state[i] <- "e"
}
}
}
}
out[k,] <- table(agents$state)
}
查看输出时,一旦每个人都被感染(第一列),未感染人数(第二列)应该是 0,但我得到 100,我怀疑这是由于回收。
[,1] [,2]
[1,] 12 88
[2,] 33 67
[3,] 69 31
[4,] 86 14
[5,] 92 8
[6,] 95 5
[7,] 97 3
[8,] 98 2
[9,] 99 1
[10,] 100 100
我运行了一些诊断程序来查看发生了什么:
table(agents$state)
e
100
agents[agents$state == "s",]
[1] agent_no state mixing
<0 rows> (or 0-length row.names)
我认为 0-length row.names 是我的问题。结果应该是这样的:
[,1] [,2]
[1,] 12 88
[2,] 33 67
[3,] 69 31
[4,] 86 14
[5,] 92 8
[6,] 95 5
[7,] 97 3
[8,] 98 2
[9,] 99 1
[10,] 100 0
有人可以解释我做错了什么吗?非常感谢。
【问题讨论】:
-
为了使这个可重现,顶部需要一个 set.seed 语句。当我尝试使用 set.seed(123) 时,out[10, 2] 的值为 1。