mgcv:我可以通过'降低因子水平。变量?

时间:2017-03-20 21:48:11

标签: r regression smoothing gam mgcv

故事:

我在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)

relative price

正如您在图中所看到的,没有为产品付款的客户的产品相对价格为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)

smooth effects

我的问题是:

一个。为什么你仍然可以通过s(x,b = 1)看到0%的地毯,如果mgcv只考虑那些必须付钱的话,那会更有意义吗?这个问题与结有关吗?

湾正如你在摘要中看到的那样,虚拟效果估计为NA,这可能与b的信息完全用作s(x)中的副变量这一事实有关,因此虚拟b本身不再有给出的信息?我怎样才能克服这个问题,换句话说:是否可以选择只为数据子集建立平滑项,并使mgcv实际上只使用这个子集来拟合?

1 个答案:

答案 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了解更多'变量