我在gam中面临一个问题,即只考虑2个输入变量:
x =根据俱乐部的入场价格,客户为产品支付的相对价格(%)
b =二进制,如果客户必须支付产品(VIP免费获得)
输出变量是
y =如果客户拿走了产品
这会模拟数据:
require(mgcv)
require(data.table)
set.seed(2017)
y <- sample(c(0, 1), 100, replace=T)
x <- rgamma(100, 3, 3)
b <- as.factor(ifelse(x<.5, 0, 1))
dat <- as.data.table(list(y=y, x=x, b=b))
dat[b=="0",x:=0]
plot(dat$x, dat$y, col=dat$b)
正如您在图中所看到的,没有为产品付款的客户的产品相对价格为0%,其他客户的相对价格介于.5%和3.5%之间
我想为b建模一个虚拟效果,为x设置平滑效果(当然只对那些需要付费的人),所以我也使用b作为x中的副变量:
mod <- bam(y~b+s(x, by=b), data=dat, family=binomial(link="logit"))
summary(mod)
par(mfrow=c(1,2))
plot(mod)
一个。为什么你仍然可以通过s(x,b = 1)看到0%的地毯,如果mgcv只考虑那些必须付钱的话,那会更有意义吗?这个问题与结有关吗?
湾正如你在摘要中看到的那样,虚拟效果估计为NA,这可能与b的信息完全用作s(x)中的副变量这一事实有关,因此虚拟b本身不再有给出的信息?我怎样才能克服这个问题,换句话说:是否可以选择只为数据子集建立平滑项,并使mgcv实际上只使用这个子集来拟合?
答案 0 :(得分:1)
您的问题在概念上与How can I force dropping intercept or equivalent in this linear model?相同。您希望对比b
,而不是使用其所有级别。
在GAM设置中,您需要:
dat$B <- as.numeric(dat$b) - 1
y ~ b + s(x, by = B)
对于因子by
平滑,如果此因素无序,则mgcv
不会将对比度应用于by
。这通常很吸引人,因为我们通常希望每个因素水平都平滑。因此,您有责任使用一些技巧来获得您想要的东西。我在上面做的是将这个两级因子b
强制转换为数字B
,你想要省略的数字为0,然后使用数字'by'B
。这个想法不能扩展到更多层次的因素。
如果您的因素by
超过2个级别并且您仍想强制执行对比,则需要使用有序因子。例如,你可以做
dat$B <- ordered(dat$b)
y ~ b + s(x, by = B)
从?gam.models
了解更多'变量。