R Epi 包中 Ns() 提供的基础

Basis provided by Ns() in R Epi package

当我研究 Epi 如何生成其样条函数的基础时(通过函数 Ns),我对它如何处理 detrend 参数感到有点困惑.

detrend=T时,我预计Epi::Ns(...)会或多或少地将splines::ns(...)给出的基投影到[=的space列的正交补集上18=]最后提取线性无关列的集合(这样我们就有了基础)

然而,这似乎并不是完全的情况;我试过了

library(Epi)
x=seq(-0.75, 0.75, length.out=5)
Ns(x, knots=c(-0.5,0,0.5), Boundary.knots=c(-1,1), detrend=T)

library(splines)
detrend(ns(x, knots=c(-0.5,0,0.5), Boundary.knots=c(-1,1)), x)

上述代码生成的矩阵不相同,但是,它们确实具有相同的列 space(在此示例中)表明如果插入线性模型,则拟合系数将为不同,但适合度(本身)是相同的。

我的第一个问题是;一般来说是这样吗?

第二个问题,为什么两者不同?

关于第二个问题 - 当指定 detrend 时,Epi::Ns 给出警告,fixsl 被忽略。

深入Epi github NS.r ...在构建基础时,在上面用detrend=T调用Epi::Ns时,工人ns.ld() 被调用(一个几乎与 splines::ns() 的内部相同的函数),它将 c(NA,NA) 传递给 splines::spline.des 作为确定矩阵 constderivs 参数];

const <- splines::spline.des( Aknots, Boundary.knots, 4, c(2-fixsl[1],2-fixsl[2]))$design

这是 Ns(detrend=T) 和调用 ns() 之间的区别,后者将 c(2,2) 作为 derivs 参数传递给 splineDesign。

所以这解释了它们的不同之处,但不是为什么?有没有人解释为什么在 Epi::Ns() 中使用 fixsl=c(NA,NA) 而不是 fixsl=c(F,F)

有人 proof/or 第一个问题的答案吗? 我认为 const 的列 space 的正交补码被使用,因此二阶(或期望的)导数在边界处为零(通过一般样条基的投影) - 但是 我不确定这一步,因为我没有深入研究数学,我只是按照我的 'feel' 来做 。也许如果我更好地理解这一点,那么 const 的结果与调用 splineDesign/spline.des 的差异的原因(分别在 ns()Ns() ) 将解释为什么从一开始的两个矩阵不相同,但产生相同的拟合。

fixsl=c(NA,NA) 是一个已修复一段时间的错误。查看 CRAN Github 镜像上的提交。

我还是发了邮件给维护者,询问是否可以把修复做的更符合条件一点,但原则上可以关闭。