当我在研究Epi如何为其样条函数生成基础时(通过函数Ns
),我对它如何处理detrend
参数感到有些困惑。 / p>
detrend=T
{I}我希望Epi::Ns(...)
或多或少会将splines::ns(...)
给出的基础投影到[1 t]
的列空间的正交补码上并最终提取一组线性独立的列(这样我们就有了基础)。
然而,这似乎不是完全的情况;我试过了
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)
上面代码生成的矩阵不一样,但是,它们确实具有相同的列空间(在本例中),表明如果插入线性模型,拟合系数将不同但拟合(本身) )将是相同的。
我遇到的第一个问题是;一般来说这是真的吗?
第二个问题是为什么两者不同?
关于第二个问题 - 指定detrend
时,Epi::Ns
会发出警告fixsl
被忽略。
潜入Epi github NS.r ...在构建基础时,在Epi::Ns
上面detrend=T
的调用中,调用工作人员ns.ld()
(a函数几乎与splines::ns()
)的内容完全相同,在确定矩阵c(NA,NA)
时将splines::spline.des
传递给derivs
作为const
参数;
const <- splines::spline.des( Aknots, Boundary.knots, 4, c(2-fixsl[1],2-fixsl[2]))$design
这是Ns(detrend=T)
中发生的事件与上面ns()
的调用之间的区别,它将c(2,2)
传递给splineDesign作为derivs
参数。
这样可以解释它们是如何不同的,但不是为什么?有没有人解释为什么fixsl=c(NA,NA)
代替fixsl=c(F,F)
中的Epi::Ns()
?
有没有人对第一个问题有证据/答案?
我认为使用const
列空间的正交补集使得第二个(或期望的)导数在边界处为零(通过一般样条基的投影) - 但我不确定这一步,因为我没有挖掘数学,我只是为了它的“感觉”。也许如果我更好地理解这一点,那么const
的结果与调用splineDesign
/ spline.des
(分别在ns()
和Ns()
中的差异的原因)可以解释为什么从一开始两个矩阵不一样,但产生相同的拟合。
答案 0 :(得分:1)
fixsl=c(NA,NA)
是一个已经修复了一段时间的错误。请参阅CRAN Github镜像上的提交。
我仍然向维护者发送了一封电子邮件,询问修复是否可以与条件更加一致,但原则上可以关闭。