You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

L-BFGS-B需有限'fn'值错误:VARFIMA.est代码运行失败求助

问题诊断与解决办法

从你提供的代码和报错信息来看,VARFIMA.est()运行时出现的L-BFGS-B needs finite values of 'fn'错误,本质是优化函数optim()在计算VARFIMA模型的对数似然函数时得到了非有限值(比如NA、Inf或NaN),同时伴随的收敛警告也说明优化过程没有顺利完成。下面我会一步步帮你排查问题并给出解决思路:

可能的原因分析

  • 数据质量问题:你的矩阵rt里可能存在缺失值、极端异常值,或者序列本身不满足VARFIMA模型的平稳性要求(VARFIMA通常要求序列是平稳的,或经过分数阶差分后平稳)。
  • 初始参数不合理:VARFIMA.est()默认的初始参数可能和你的数据不匹配,导致似然函数计算出现非有限值。
  • 模型设定与数据规模不匹配:你的数据只有204个观测值,但默认的VARFIMA(1,d,1)模型参数较多,可能导致优化过程难以收敛;另外approx=100这个谱密度近似点数也可能设置得不合适。

分步解决办法

第一步:检查并清洗数据

先确认数据有没有异常值或缺失值,运行以下代码:

# 检查缺失值与非有限值
any(is.na(rt))
any(is.infinite(rt))
any(is.nan(rt))

# 检查序列平稳性(对每个变量做ADF检验)
library(tseries)
adf.test(rt[,1])
adf.test(rt[,2])
  • 如果发现缺失值,可以用na.omit(rt)删除含缺失值的行,或者用插值法填充(比如zoo::na.approx())。
  • 如果ADF检验显示序列不平稳,你可以先尝试对序列做差分,或者在VARFIMA.est()中限制d的取值范围(比如lower=c(0,0, rep(-2,8)), upper=c(1,1, rep(2,8)),具体维度根据模型阶数调整)。

第二步:手动指定合理的初始参数

默认的初始参数可能不够贴合你的数据,你可以先对每个单变量序列估计ARFIMA模型,再用这些结果构造VARFIMA的初始参数:

library(fracdiff)
# 分别估计两个变量的单变量ARFIMA模型
fit_tf <- fracdiff(rt[,1])
fit_usd <- fracdiff(rt[,2])

# 构造VARFIMA(1,d,1)的初始参数:d1, d2, AR矩阵(2x2), MA矩阵(2x2)
start_params <- c(
  fit_tf$d, fit_usd$d,          # 分数差分参数d
  fit_tf$ar, 0,                 # AR矩阵:[phi11, phi12; phi21, phi22],先填单变量AR系数,交叉项设为0
  0, fit_usd$ar,
  fit_tf$ma, 0,                 # MA矩阵:[theta11, theta12; theta21, theta22]
  0, fit_usd$ma
)

# 使用自定义初始参数运行模型
VARFIMA.est(rt, approx=100, rep=FALSE, start=start_params)

第三步:调整优化算法与模型复杂度

  • 尝试更换优化方法:默认的L-BFGS-B对参数边界敏感,你可以换成更稳健的Nelder-Mead方法:
VARFIMA.est(rt, approx=100, rep=FALSE, control=list(method="Nelder-Mead"))
  • 简化模型阶数:先从简单的模型开始测试,比如先拟合VARFIMA(0,d,0),确认能运行后再逐步增加阶数:
# 先拟合无AR/MA项的模型
VARFIMA.est(rt, p=0, q=0, approx=100, rep=FALSE)
  • 调整近似点数:尝试修改approx参数,比如换成50或200,看是否能解决似然函数非有限的问题:
VARFIMA.est(rt, approx=50, rep=FALSE)

第四步:手动调试似然函数

如果以上方法都不行,你可以直接调用似然函数ll.VARFIMA(),检查默认初始参数下的计算结果:

# 获取默认初始参数
default_start <- VARFIMA.est(rt, approx=100, rep=FALSE, only.start=TRUE)
# 计算似然值
ll.VARFIMA(default_start, data=rt, approx=100)

如果这个结果是NA或Inf,说明初始参数确实有问题,你需要进一步调整初始值的范围。

内容的提问来源于stack exchange,提问作者Aysu Yasar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 12:47:38