mgcv:如何指定平滑和因子之间的相互作用?第二部分

mgcv: how to specify interaction between smooth and factor? part II

有一个同标题的问题,但是,我希望这个问题也很有趣[并且我个人想知道答案]。

首先,我将指定一个具有一个连续变量和一个因子协变量的数据集:

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 模型,而只想创建设计矩阵。我考虑了两种方法。

首先,

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 [二进制,如此处或其他] 建模平滑项。

I don't want to run a gam model, but only to create the design matrix.

I'd like to have the design matrix that models a smooth term separately for each level of factor 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 之外的应用程序中,您也需要注意这一点。所以一个完整的模型矩阵应该是

cbind(b[[1]]$X, b[[2]]$X, model.matrix(~ u1))