R:适合数据子集的 GAM

R: GAM with fit on subset of data

我使用 mgcv 包中的 gam 拟合广义加性模型。我有一个数据 table,其中包含我的因变量 Y、一个自变量 X、其他自变量 Oth 和一个两级因子 Fac。我想适合以下型号

Y ~ s(X) + Oth

但是有额外的限制,即 s(X) 项仅适用于因子的两个水平之一,比如 Fac==1。其他项 Oth 应该适合整个数据。

我尝试探索 s(X,by=Fac),但这会使 Oth 的拟合出现偏差。换句话说,我想表达的是 X 只有在 Fac==1 时才与 Y 相关的信念,否则对 X.[=26= 建模没有意义]

廉价技巧:如果 Fac == 1 且其他地方为 0,则使用辅助变量 X。

library("mgcv")
library("ggplot2")


# simulate data

N <- 1e3

dat <- data.frame(covariate = runif(N),
                  predictor = runif(N),
                  group = factor(sample(0:1, N, TRUE)))

dat$outcome <- rnorm(N,
                     1 * dat$covariate +
                     ifelse(dat$group == 1,
                            .5 * dat$predictor +
                            1.5 * sin(dat$predictor * pi),
                            0), .1)

# some plots

ggplot(dat, aes(x = predictor, y = outcome,
                col = group, group = group)) +
    geom_point()

ggplot(dat, aes(x = covariate, y = outcome,
                col = group, group = group)) +
    geom_point()

# create auxiliary variable

dat$aux <- ifelse(dat$group == 1,
                  dat$predictor,
                  0)

# fit the data

fit1 <- gam(outcome ~ covariate + s(predictor, by = group),
            data = dat)

fit2 <- gam(outcome ~ covariate + s(aux, by = group),
            data = dat)

# compare fits

summary(fit1)

summary(fit2)

如果我没理解错的话,您正在考虑具有如下交互的模型:

Y ~ 0th + (Fac==1)*s(X)  

如果您想 "express the belief that X relates to Y only if Fac==1" 不要将 Fac 视为 factor,而应将其视为 numeric 变量。在这种情况下,您将获得 numeric 交互,并且只有一组 coefficients(当它是 factor 时,那里有两个)。这种类型的模型是 varying coefficient model.

# some data
data <- data.frame(th = runif(100),
              X = runif(100),
              Y = runif(100),
              Fac = sample(0:1, 100, TRUE))
data$Fac<-as.numeric(as.character(data$Fac)) #change to numeric
# then run model
gam(Y~s(X, by=Fac)+th,data=data)

请参阅文档 ?s

中有关 by 选项的文档