我使用gam
包中的mgcv
来拟合广义添加模型。我有一个数据表,其中包含我的因变量Y
,一个独立变量X
,其他独立变量Oth
和一个两级因子Fac
。我想适合以下模型
Y ~ s(X) + Oth
但是附加约束条件是s(X)
项仅适用于因子的两个级别之一,例如Fac==1
。其他术语Oth
应该与整个数据相符。
我尝试了s(X,by=Fac)
,但这会偏向Oth
。换句话说,我想表示X
仅在Y
时与Fac==1
相关,否则对X
进行建模无效。
答案 0 :(得分:5)
廉价技巧:如果Fac == 1则使用X为辅助变量,其他地方为0。
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)
答案 1 :(得分:1)
如果我理解正确,你会想到一些具有这种互动的模型:
Y ~ 0th + (Fac==1)*s(X)
如果您想“表示X
只有在Y
”不将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)
请参阅文档by
?s
选项文档