代码之家  ›  专栏  ›  技术社区  ›  papgeo

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

  •  2
  • papgeo  · 技术社区  · 6 年前

    有一个标题相同的问题,不过,我希望这个问题也很有趣[我个人很想知道答案]。

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

    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

    1 回复  |  直到 6 年前
        1
  •  3
  •   Community T.Woody    4 年前

    我不想经营一家公司 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) 对于这个因素“由”平滑。为创建虚拟矩阵 (本例中有两列),每列乘以 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 u1型 mgcv

    s(u2, k = 5, bs = 'ps', by = u1) + u1
    

    这一点在问答中也有提到;A您引用的: mgcv: how to specify interaction between smooth and factor? . 在你的申请表里 mgcv公司 你也需要意识到这一点。所以一个完整的模型矩阵应该是

    cbind(b[[1]]$X, b[[2]]$X, model.matrix(~ u1))
    
    推荐文章
    S.K.  ·  gamm的R粘贴公式
    7 年前