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
相关产品推荐
相关产品推荐

