R中出现‘invalid time series parameters specified’错误的排查求助
解决YieldCurve包Nelson-Siegel模型结合ustyc数据的报错问题
你尝试用ustyc包获取国债收益率曲线数据,修改YieldCurve包的Nelson/Siegel示例代码时遇到了报错,先还原一下你的操作:
原示例代码
library(YieldCurve) ### Nelson.Siegel function and Fed data-set ### data(FedYieldCurve) rate.Fed = first(FedYieldCurve,'5 month') maturity.Fed <- c(3/12, 0.5, 1,2,3,5,7,10) NSParameters <- Nelson.Siegel( rate= rate.Fed, maturity=maturity.Fed ) y <- NSrates(NSParameters[5,], maturity.Fed)
你的修改代码
library(ustyc) library(YieldCurve) xlist = getYieldCurve() # 2.5 mins yields <- xlist$df maturities <- c(1/12, 3/12, 6/12, 1, 2, 3, 5, 7, 10, 20, 30) curve <- yields["2018-05-21",1:11] NSParameters <- Nelson.Siegel(curve,maturities) y <- NSrates(NSParameters[1,],maturities)
遇到的错误
Error in attr(x, "tsp") <- c(1, NROW(x), 1) : invalid time series parameters specified
问题原因
这个报错的核心原因是:Nelson.Siegel()函数要求输入的收益率数据必须是时间序列对象(比如xts、ts类型),但你提取的curve是数据框的一行,默认会变成普通的数值向量或data.frame行对象,丢失了时间序列属性,导致函数在尝试设置时间序列参数(tsp)时失败。
原示例中的rate.Fed是xts格式的多期时间序列,完全符合函数的输入要求,而你的单日期数据没有保持时间序列结构,所以触发了错误。
解决方案
只需要把提取的curve转换成时间序列格式即可,这里提供两种可行的修改方式:
方式1:转换成ts对象
library(ustyc) library(YieldCurve) xlist = getYieldCurve() yields <- xlist$df maturities <- c(1/12, 3/12, 6/12, 1, 2, 3, 5, 7, 10, 20, 30) # 提取目标日期的收益率,并转换为ts对象 curve <- yields["2018-05-21",1:11] curve_ts <- as.ts(curve) # 运行Nelson-Siegel模型 NSParameters <- Nelson.Siegel(curve_ts, maturities) y <- NSrates(NSParameters[1,], maturities)
方式2:保持xts格式(更贴合原示例的逻辑)
如果yields本身不是xts对象,你可以手动转换,确保提取的行保留时间序列属性:
library(ustyc) library(YieldCurve) library(xts) # 确保加载xts包 xlist = getYieldCurve() # 将数据框转换为xts对象,指定日期为索引 yields <- as.xts(xlist$df, order.by = as.Date(rownames(xlist$df))) maturities <- c(1/12, 3/12, 6/12, 1, 2, 3, 5, 7, 10, 20, 30) # 提取目标日期的xts对象行 curve <- yields["2018-05-21",1:11] NSParameters <- Nelson.Siegel(curve, maturities) y <- NSrates(NSParameters[1,], maturities)
额外验证小技巧
你可以在运行Nelson.Siegel()前,用class(curve)查看数据类型,如果输出是numeric或data.frame,就说明格式不对;如果是ts或xts,就符合函数要求了。
内容的提问来源于stack exchange,提问作者finite_seed
相关产品推荐
相关产品推荐

