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
选项的文档
我使用 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
选项的文档