mgcv: как указать взаимодействие между гладкой и факторной?Часть II - PullRequest
0 голосов
/ 15 сентября 2018

Есть вопрос с таким же названием, однако, я надеюсь, что этот вопрос также интересен [и лично я хотел бы знать ответ].

Сначала я укажу набор данных с одним непрерывным и одним коэффициентом ковариации:

set.seed(1)
n <- 50
u1 <- sample(c(1,2), n, replace = TRUE) 
u1 <- factor(u1)
u2 <- runif(n)
data <- data.frame(u1, u2)

Я не хочу запускать модель gam, но только для создания матрицы проекта,Я рассмотрел 2 способа.

Первый,

a<-mgcv::s(u2,k=5,bs="ps",by=u1)
b<- mgcv::smoothCon(a,data=data,absorb.cons=TRUE) 

Однако

b[[1]]$X[u1==2,]

состоит только из 0.

Второй,

a<- mgcv::s(u1,u2,k=5,bs="ad")
b<- mgcv::smoothCon(a,data=data,absorb.cons=TRUE) 

Тем не менее, это дает мне сообщение об ошибке.Error in Summary.factor(c(1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, : ‘min’ not meaningful for factors

Как решить эту проблему?Я хотел бы иметь матрицу дизайна, которая моделирует гладкий термин отдельно для каждого уровня фактора u1 [двоичный, как здесь, или иначе].

1 Ответ

0 голосов
/ 15 сентября 2018

Я не хочу запускать модель 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))
...