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))
有一个同标题的问题,但是,我希望这个问题也很有趣[并且我个人想知道答案]。
首先,我将指定一个具有一个连续变量和一个因子协变量的数据集:
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))