R语言种群模型代码报错求助:替换项长度不匹配问题
种群建模R代码错误解决建议
原代码及错误信息
原代码:
N<-array(0,dim=c(16,50)) N[1,1] <- 37 for(x in 2:50){ for(y in 1:16){ N[x,1]<-N[x, 1]+N[psiage,x]*0.765[psiage] } for(x in 2:16){ N[y,x] <- N[psiage,i]*survivalrate[psiage] } }
错误信息:
number of items to replace is not a multiple of replacement length
错误核心原因
- 循环变量混乱:同一个变量
x被同时用于时间步(2:50)和年龄组(2:16)的循环,索引逻辑完全混乱;未定义变量i被直接使用。 - 索引长度不匹配:
N[psiage,x]返回长度16的向量,0.765[psiage]写法错误(若表示繁殖率应为向量形式),但左侧N[x,1]是单个值,向量赋值给单个值必然触发长度不匹配错误。 - 数组维度逻辑错误:你定义的
N是16行(年龄)×50列(时间),但代码错误用N[x,1]指代时间步x的年龄1个体,正确索引应为N[1,x]。
修正后的代码示例
假设模型逻辑为:
- 新出生个体(年龄1)= 上一年各年龄组个体数 × 对应繁殖率 的总和
- 年龄2~16的个体 = 上一年年龄1~15的个体数 × 对应存活率
# 替换为你自己的16个存活率数值 survivalrate <- c(0.8, 0.75, 0.7, 0.65, 0.6, 0.55, 0.5, 0.45, 0.4, 0.35, 0.3, 0.25, 0.2, 0.15, 0.1, 0) # 若0.765是各年龄组繁殖率,替换为你的实际繁殖率向量 fecundity <- rep(0.765, 16) # 初始化数组:行=年龄(1-16),列=时间(1-50) N <- array(0, dim = c(16, 50)) N[1, 1] <- 37 # 初始时间步,年龄1的个体数 # 时间步循环(从第2到第50步) for (t in 2:50) { # 计算新出生个体:上一年所有年龄组的繁殖贡献总和 N[1, t] <- sum(N[, t-1] * fecundity) # 计算各年龄组的存活个体 for (age in 2:16) { # 年龄age的个体来自上一年age-1的个体存活 N[age, t] <- N[age - 1, t-1] * survivalrate[age - 1] } }
关键修正点
- 用
t指代时间步、age指代年龄组,避免变量名冲突 - 繁殖过程用
sum()计算总和,确保左侧单个值和右侧计算结果长度匹配 - 存活过程严格对应“上一年小一岁的个体存活到当前年龄”的逻辑,索引清晰
- 去掉无意义的
psiage固定引用,直接用循环变量关联年龄索引
内容的提问来源于stack exchange,提问作者notthistimethanks
相关产品推荐
相关产品推荐

