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

时间:2017-06-05 23:49:23

标签: r spline

当我在研究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()中的差异的原因)可以解释为什么从一开始两个矩阵不一样,但产生相同的拟合。

1 个答案:

答案 0 :(得分:1)

fixsl=c(NA,NA)是一个已经修复了一段时间的错误。请参阅CRAN Github镜像上的提交。

我仍然向维护者发送了一封电子邮件,询问修复是否可以与条件更加一致,但原则上可以关闭。