使用B-spline基函数计算粗糙度惩罚矩阵时getbasispenalty报错
解决fda包getbasispenalty计算粗糙度惩罚矩阵时的逻辑判断错误
错误原因
你遇到的错误根源是B-spline断点包含重复值:代码里用bp <- c(sort(x1))把所有汽车速度值(含重复)作为断点,导致内部节点存在重复项。getbasispenalty函数处理重复节点时,生成的knotmult是长度大于1的向量,但函数内部的逻辑判断knotmult > rng[1] && knotmult < rng[2]要求单个布尔值,因此触发类型不匹配的报错。
修正方案
方案1:使用唯一值作为断点
去除速度数据里的重复值,确保断点严格递增无重复:
bp <- unique(sort(x1)) # 提取唯一的速度值作为断点 bf <- fda::create.bspline.basis( rangeval = rg, norder = m1, breaks = bp)
方案2:自动生成等距断点
如果不需要绑定数据点作为断点,可直接指定基函数数量,让create.bspline.basis自动生成无重复的等距节点:
nbasis <- 15 # 根据建模需求自定义基函数数量 bf <- fda::create.bspline.basis( rangeval = rg, norder = m1, nbasis = nbasis)
方案3:手动指定无重复断点范围
根据数据范围手动设置无重复的断点,比如在3到26之间生成若干等距节点:
bp <- seq(3, 26, length.out = 10) # 生成10个无重复的等距断点 bf <- fda::create.bspline.basis( rangeval = rg, norder = m1, breaks = bp)
验证修正
修改断点配置后,重新运行getbasispenalty(bf, L1)即可正常生成粗糙度惩罚矩阵,后续的image.plot也能正常执行。
内容的提问来源于stack exchange,提问作者Saidin
相关产品推荐
相关产品推荐

