Поскольку я работал над тем, как 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... в построении основы в вызове Epi::Ns выше с detrend=T, вызывается рабочий ns.ld() (функция, почти идентичная кишкам 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() соответственно) объяснят, почему две матрицы с самого начала не то же самое, но при этом одинаковые.