【发布时间】:2018-02-01 06:45:45
【问题描述】:
当我研究Epi 如何为其样条函数生成基础时(通过函数Ns),我对它如何处理detrend 参数感到有些困惑。
当detrend=T 时,我预计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 ... 在基础的构建中,在上面用detrend=T 调用Epi::Ns 时,调用了worker ns.ld()(一个函数几乎与@ 的胆量相同) 987654337@),它将c(NA,NA) 作为derivs 参数传递给splines::spline.des,以确定矩阵const;
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)?
有人对第一个问题有证据/或答案吗?
我认为使用了const 的列空间的正交补码,以便在边界处的二阶(或所需)导数为零(通过一般样条基础的投影) - 但我不确定这一步因为我还没有深入研究数学,所以我只是根据我的“感觉”来研究它。也许如果我能更好地理解这一点,const 的结果与对splineDesign/spline.des 的调用(分别在ns() 和Ns() 中)的差异可以解释为什么这两个矩阵从一开始不一样,但产生相同的拟合。
【问题讨论】:
-
我怀疑最能回答这个问题的人将是包维护者。您可以使用
maintainer('Epi')找到它们。 -
可悲的是;即使是“博士”头衔,也很难得到学术界的回应,除非你愿意为他们写一篇论文:|
-
尚不清楚您是否真诚地努力遵循 dww 的建议。我并不总是同意 Bendix Carstensen 的观点,但他似乎一直支持与他的包裹搏斗的用户。如果您确实付出了一些努力,那么您的沟通方式可能需要一些调整?
-
我将在此备份 dww 和 42。我已经写信给许多包维护者/作者,结果非常积极。如果你还没有,并且仍然想知道这个答案,你应该知道!