2017-05-04 21 views
0

我跟一位統計學家問他,我如何識別和刪除對gam(廣義加法模型)有太大影響的點。用過多的槓桿作用去除數據點gam fit

他告訴我,我可以根據影響/投影/帽子矩陣做到這一點。我也看到@Gavin Simpson有same idea

不幸的是,我不知道如何在r實踐中做到這一點。我可以通過​​函數提取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) 

編輯: 謝謝您的回答李哲源李宋哲元。我意識到我完全忘了包括光滑。我仍然不是很瞭解影響力的實際回報是什麼?這些廚師的距離或利用率或兩者都不是?刪除上面的所有值是否合適?用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) 
+0

謝謝你的回答,對不起,我保持沉默了這麼久。我仍然不知道如何在影響矩陣和原始數據之間建立聯繫,但是如果我理解正確,我不需要理解這一點,因爲無論如何,在繪製gamm,對嗎? –

+0

感謝您的鏈接。 –

回答

1

你看過這個話題了交叉驗證https://stats.stackexchange.com/q/65912/117783?除了這兩個答案之外,請閱讀gung在這個問題下的評論。槓桿作用,廚師的距離和離羣值都很好地解釋了線性迴歸。 GLM也是如此。一旦你對這些標準理論有了一個粗略的理解,讓我們看看GAM。

主要困難在於GAM的帽子矩陣具有不同的屬性,所以(至少)我不相信槓桿和廚師的距離對GAM中的異常點檢測有意義。

爲什麼?與線性模型和GLM不同,使用GAM或懲罰性GLM不一定在[0,1]之間。它可能是負面的。即使模型中存在截距,帽子矩陣的每一行/列也不會加1。解釋這種槓桿是困難的。通常我們希望庫克的距離能夠提取異常值。然而,如果利用負面槓桿,你會得到一個負庫克距離。這意味着什麼?

我想說,非參數迴歸沒有真正的「異常值」。當平滑參數變爲0時,您可以越來越接近觀察值。換句話說,關於異常值取決於平滑參數的結論!但是,如果您適合所有平滑參數固定爲0的GAM,則該模型將成爲線性模型或GLM。基於這種擬合的異常值檢測是合理的。

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

  • 適合與由mgcv估計所有平滑參數一個GAM。
  • 檢查結果模型中每次平滑的有效自由度(edf)。將它們四捨五入到最接近的整數。例如,假設你有一個平滑的長期s(x)與EDF爲13.2,然後我們把它四捨五入到14
  • 適應新的GAM沒有懲罰,在所有s()te()設置fx = TRUE。但是,我們現在想要設置k,基礎維度是最後一步中的整數,再加上一個!以上面的例子,我們想要s(x, k = 15, fx = TRUE)
  • 上述模型適用於檢測異常值。