在gam fit上使用过多的杠杆来删除数据点

时间:2017-05-04 11:36:59

标签: r matrix regression gam mgcv

我和一位统计学家交谈过,问我如何识别和删除那些对gam(广义附加模型)具有过多影响力的点。

他告诉我,我可以根据影响/投影/帽子矩阵来做到这一点。我也看到@Gavin Simpson有same idea

不幸的是,我不知道如何在r中练习这个。我可以通过influence.gam函数提取gam的影响矩阵,但后来我不知道如何在影响矩阵和原始数据之间建立连接以了解应该删除哪些原始数据。

是否有人知道如何根据影响矩阵删除过多的杠杆数据? 是否有适用于gamm4安装的gams的功能?

示例代码:

library(mgcv)
set.seed(11)
x1 = c(100, rnorm(100,5,1))
x2 = c(runif(100,0,100),300)
y  = x1 * x2 * rnorm(101, 50,5)
d1 = data.frame(y,x1,x2)

mod = gam(y ~ x1*x2, data = d1)

inf = influence.gam(mod)
hist(inf)

修改 谢谢你的回答李哲源Zheyuan Li。我意识到我完全忘了包括光滑。我仍然不明白影响实际上会带来什么影响?那些厨师的距离或杠杆是不是两者都没有?删除.5以上的所有值是否合适?使用gamm对象执行相同的过程是否合适(influence.gam(gamm_model $ gam))?

mod1 = gam(y ~ s(x1) + s(x2), data = d1)

inf1 = influence.gam(mod1)
hist(inf1)
any(inf1<0) # At least in this example all values are in between 0-1

mod2 = gam(y ~ s(x1, k = 8, fx = TRUE) + s(x2, k = 3, fx = TRUE), data = d1)
summary(mod2)

inf2 = influence.gam(mod2)
hist(inf2)  
d1$inf2 = inf2

d2 = subset(d1, inf2 < 0.5)

mod3 = gam(y ~ s(x1)+s(x2), data = d2)
summary(mod3)
plot(mod3)

1 个答案:

答案 0 :(得分:2)

您是否在Cross Validated https://stats.stackexchange.com/q/65912/117783上阅读了此主题?除了这两个答案之外,还要根据这个问题阅读gung的评论。对于线性回归,很好地解释了杠杆,烹饪的距离和异常值。 GLM也是如此。一旦你对这些标准理论有了大致的了解,就让我们看看GAM。

主要的困难是GAM的帽子矩阵具有不同的属性,所以(至少)我不相信杠杆和烹饪的距离对于GAM中的异常值检测是有意义的。

为什么呢?与线性模型和GLM不同,GAM的杠杆作用或惩罚的GLM不一定在[0,1]之间。这可能是消极的。即使模型中存在截距,帽子矩阵的每个行/列也不会总和为1。解释这种杠杆很困难。传统上,我们希望库克的距离能够获得异常值。然而,如果负杠杆,你会得到库克的负面距离。这意味着什么?

我会说没有真正的&#34;异常值&#34;用于非参数回归。随着平滑参数变为0,您可以越来越接近观察。换句话说,关于异常值的结论取决于平滑参数!

但是,如果您将GAM的所有平滑参数固定为0,则该模型将变为线性模型或GLM。基于这种拟合的离群检测是合理的。

如果我是你,我可以做以下事情。

  • 使用mgcv估算的所有平滑参数拟合GAM。
  • 检查结果模型中每个平滑的有效自由度(edf)。将它们四舍五入到最接近的整数。例如,假设您有一个平滑的术语s(x),edf为13.2,那么我们将其四舍五入为14.
  • 通过在所有fx = TRUEs()中设置te()来适应新的GAM而不会受到惩罚。但是,我们现在要设置k,基本维度为最后一步的整数加一!以上面的例子为例,我们需要s(x, k = 15, fx = TRUE)
  • 上述模型可以检测异常值。