R语言SIR模型模拟时数据框无法添加行及出现NA值问题
问题原因
- 模拟次数循环语法错误:两个版本的代码里内层循环都写的是
for(sim in n_sim),你定义的n_sim = 100是单个数值,所以这个循环只会执行1次,sim的值固定为100,因此调整后的版本只会给第100行赋值,其余99行保留初始的NA值;初始版本也是因为这个循环只跑1次,所以最终只有1行结果。 - 变量名重复覆盖(初始版本特有):初始版本里外层循环的遍历对象是你定义的R0序列
R0 <- seq(0.5,2.5, 1),但进入内层后你又写了R0 <- values,直接把外层的R0序列覆盖成了单个数值,导致外层循环也只会执行1次,进一步加剧了结果行数不足的问题。 - 模型逻辑错误(两个版本共有):代码里先生成了随机恢复人数
Rh = rbinom(1,Iold,(1-exp(-nu))),下一行立刻写了Rh = nu*Iold,覆盖了随机生成的结果,直接把随机模型变成了确定性模型,失去了随机模拟的意义。
优化建议
- 修正循环写法:把内层循环改成
for(sim in 1:n_sim),遍历1到100的整数,才能完成100次重复模拟。 - 规范变量命名:把外层的R0序列改名为
R0_seq或其他不与参数名冲突的名称,避免变量被意外覆盖。 - 修正模型逻辑:删除多余的
Rh = nu*Iold行,保留rbinom生成的随机恢复人数,确保模拟是随机SIR过程。 - 适配多参数批量模拟:如果需要跑多个R0值的模拟,删除
if(values == 0.5)的判断条件,同时给结果数据框新增一列存储当前使用的R0值,方便后续汇总分析。 - 效率优化:你调整后版本预分配数据框的写法
Df1 <- data.frame("final_size" = rep(NA, n_sim), "peak_size" = rep(NA, n_sim))比初始版本循环里动态rbind的效率更高,模拟次数较多时优先选择预分配的写法。
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

