vax_fun函数输出为零而非365维向量,请求排查异常原因
问题解决:vax_fun输出全零及结果收集问题
核心问题拆解
- 循环未累积结果:当前for循环里每次把
vax_fun的计算结果直接覆盖x,最终x仅保留最后一次(timepoint=365)的取值——而365大于参数里的T3=235,触发else分支返回0,这是你看到输出全零的直接原因。 - 函数计算逻辑存在错误:
- 第三个分支的
v_t = exp(tetha)*timepoint不符合常规趋势(通常是平台期而非持续增长),明显是笔误,应该是固定值exp(tetha)而非乘以timepoint。 - 第二、第四个分支的公式冗余,容易引发计算错误,可简化优化。
- 第三个分支的
修正后的代码
第一步:修复函数逻辑
修正错误计算分支,简化线性增长/下降的公式:
vax_fun = function(timepoint, parms1){ with(as.list(parms1), { if (timepoint < T0) { v_t = 0 } else if (timepoint <= T1) { # 简化线性增长:从C0到exp(tetha)的区间线性插值 v_t = C_0 + (timepoint - T0) * (exp(tetha) - C_0)/(T1 - T0) } else if (timepoint <= T2) { # 修正为平台期固定值,而非持续增长 v_t = exp(tetha) } else if (timepoint <= T3) { # 简化线性下降:从exp(tetha)到C1的区间线性插值 v_t = C_1 - (timepoint - T2) * (exp(tetha) - C_1)/(T3 - T2) } else { v_t = 0 } return(v_t) }) }
第二步:正确收集循环结果
预先初始化向量存储每次计算值,避免覆盖:
parms1 = c( T0=55, T1=115, T2=175, T3=235, threshold = 275, tetha = 5, C_0 = 100, C_1 = 100 ) # 初始化长度为365的空向量 x = numeric(365) for (i in 1:365) { x[i] = vax_fun(i, parms1) } # 查看最终结果 x
更高效的向量化写法(替代循环)
R中优先用向量化操作,代码更简洁效率更高:
x = sapply(1:365, vax_fun, parms1 = parms1)
结果验证
修正后x会是长度365的向量,符合预期逻辑:
- 1-54:取值为0
- 55-115:从100线性增长至
exp(5)≈148.41 - 116-175:保持≈148.41的平台期
- 176-235:从≈148.41线性下降至100
- 236-365:取值为0
内容的提问来源于stack exchange,提问作者F W
相关产品推荐
相关产品推荐

