如何修复chronopl函数运行时的NA/NaN梯度与函数评估错误?
解决chronopl函数在子集数据集上的NA/NaN梯度/函数评估错误
问题场景
树结构可正常绘图,但chronopl()函数在同一数据集的子集上运行报错,原大数据集无此问题。
运行代码
etal <- chronopl(Larkie, 0, age.min = 1, age.max = NULL, node = "root", S = 1, tol = 1e-8, CV = FALSE, eval.max = 500, iter.max = 500)
报错信息(翻译后)
错误:
Error in nlminb(c(ini.rate, ini.time[unknown.ages]), function(p) minusploglik(p[EDGES], :
NA/NaN梯度评估
附加警告信息:
In nlminb(c(ini.rate, ini.time[unknown.ages]), function(p) minusploglik(p[EDGES], :
NA/NaN函数评估
可行解决方向
- 排查子集树拓扑:子集操作可能生成异常树结构(如单分支节点、根节点定义矛盾),用
plot(Larkie)可视化检查,或用is.ultrametric(Larkie)验证是否为超度量树——chronopl对树的拓扑完整性有硬性要求。 - 调整根节点年龄约束:
age.min = 1在子集树中可能过于严苛,尝试缩小约束范围(比如设age.min = 0.5),或替换为根节点的实际年龄估计值,而非固定值1。 - 手动指定初始参数:从大数据集的
chronopl结果中提取速率和节点时间,作为子集树的初始值传入,避免默认初始化引发的数值不稳定。 - 检查子集序列质量:子集可能存在序列过短、变异位点不足的情况,导致似然函数计算溢出产生NA/NaN。统计子集序列的变异位点数量,确保数据量足够支撑分子钟推断。
- 优化迭代参数:增大
eval.max和iter.max(比如设为1000),给优化器更多迭代空间;或调高tol值(比如改为1e-6),降低收敛精度要求。
内容的提问来源于stack exchange,提问作者Ditiro Moloto
相关产品推荐
相关产品推荐

