扩展到期限的Dynamic Nelson Siegel模型运行报错求助
解决statespacer包Dynamic Nelson Siegel模型扩展到期期限的
tcrossprod错误 错误核心原因
Error in tcrossprod(y_temp, A_star) : non compatible arguments本质是矩阵维度不匹配:
tcrossprod(X,Y)要求X的列数等于Y的列数(实际执行X %*% t(Y))- Dynamic Nelson Siegel框架中,加载矩阵
A_star应为「到期期限数 × 3」(3对应level、slope、curvature三个因子),收益率矩阵y_temp应为「时间点数量 × 到期期限数」
扩展到期期限后,若A_star未同步更新或参数顺序错误,就会触发该报错。
修复步骤
确认收益率矩阵维度
把xts格式数据转成矩阵后,检查维度是否为「时间数 × 到期期限数」:y_temp <- coredata(your_xts_yield_data) dim(y_temp) # 输出格式应为 [观测时间数, 到期期限数]重新生成匹配的加载矩阵
A_star
给新增的到期期限正确计算加载项(τ取常用值10,可根据数据调整):# 假设你的到期期限向量是maturities,比如c(0.5,1,2,...,30)(单位:年) τ <- 10 A_star <- cbind( rep(1, length(maturities)), # level因子加载 (1 - exp(-maturities/τ)) / (maturities/τ), # slope因子加载 (1 - exp(-maturities/τ)) / (maturities/τ) - exp(-maturities/τ) # curvature因子加载 ) dim(A_star) # 输出必须是 [到期期限数, 3]修正
tcrossprod参数顺序或替换为正确矩阵乘法
原代码中tcrossprod(y_temp, A_star)大概率是参数顺序错误,Dynamic Nelson Siegel的拟合值计算应为y_temp %*% A_star(得到「时间数 × 3」的因子矩阵),替换报错行:# 替换原错误代码 fitted_factors <- y_temp %*% A_star如果是模型内部的交叉乘积计算,确认维度匹配后调整为
tcrossprod(A_star, y_temp)(当需要A_star %*% t(y_temp)时)。检查statespacer模型配置
调用statespacer()时,确保measurement的loadings参数传入正确的A_star:model <- statespacer( y = y_temp, measurement = list( loadings = A_star, # 必须是N×3矩阵,N=到期期限数 state_names = c("level", "slope", "curvature") ), # 其他参数(如state_specification)按需求配置 )
前置验证
运行代码前先手动确认维度匹配,避免重复报错:
stopifnot(ncol(y_temp) == nrow(A_star)) # 收益率列数=到期期限数=A_star行数 stopifnot(ncol(A_star) == 3) # 加载矩阵固定3列对应三个因子
内容的提问来源于stack exchange,提问作者JF96
相关产品推荐
相关产品推荐

