Я не хочу запускать модель gam
, но только для создания матрицы дизайна.
Я бы хотел иметь матрицу дизайна, которая моделирует гладкое выражение отдельно для каждого уровня фактора u1
.
library(mgcv)
set.seed(1)
n <- 50
u1 <- sample(c(1,2), n, replace = TRUE)
u1 <- factor(u1)
u2 <- runif(n)
data <- data.frame(u1, u2)
a <- s(u2, k = 5, bs = "ps", by = u1)
b <- smoothCon(a, data = data, absorb.cons = TRUE)
smoothCon
создает список длины nlevels(u1)
для этого коэффициента «по» сглаживанию. Матрица-пустышка создается для u1
(с двумя столбцами в этом примере), и каждый столбец умножается на расчетную матрицу s(u2, l = 5, bs = "ps")
. Итак, b[[1]]$X
- это матрица дизайна для первого уровня, а b[[2]]$X
- это матрица для второго уровня. Вы не должны удивляться, что b[[1]]$X[u1 == 2]
дает все нули, так как это матрица дизайна для u1 == 1
. Вы хотите cbind
эти отдельные матрицы вместе:
cbind(b[[1]]$X, b[[2]]$X)
Обратите внимание, что, поскольку вы установили absorb.cons = TRUE
, функция сплайна центрируется. Т.е. среднее значение каждого уровня ограничено (не обязательно в 0, но фиксировано в некотором значении). Практический эффект заключается в том, что вам нужно ввести u1
в модель, иначе вы не сможете смоделировать среднее значение для группы. В mgcv
необходимо указать
s(u2, k = 5, bs = 'ps', by = u1) + u1
Это также упоминается в вопросах и ответах, на которые вы ссылались: mgcv: как задать взаимодействие между сглаживанием и фактором? . В вашей заявке за пределами mgcv
вам также необходимо знать об этом. Таким образом, полная матрица модели должна быть
cbind(b[[1]]$X, b[[2]]$X, model.matrix(~ u1))