簡體   English   中英

使用權重的 GAM (mgcv) 二項式 model

[英]Binomial model with GAM (mgcv) using weights

在嘗試將二項式 GAM 擬合到數據時,我一直遇到問題。 可以通過兩種方式對這些模型進行編碼,(i) 提供一個比例作為響應變量,並將試驗次數作為權重; (ii) 提供兩欄,分別列出成功和失敗。 我有理由想要對我的數據點進行加權(與樣本數量無關)。 但是,我注意到如果我使用方法 (ii) 並添加權重(使用weights參數),我確實會得到非常奇怪的結果。 此外,如果我提供相同的相對權重(但絕對幅度不同),我會得到非常不同的 output。當使用等效的 GLM model(或者,實際上,當使用gam包時),這不會發生。 如何為數據點提供一組權重?

這是一個 MRE:

library('mgcv')

# Random data.
x = 1:100
y_binom = cbind(rpois(100, 5 + x/2), rpois(100, 100))
w = sample(seq_len(100), 100, replace = TRUE)

# GAM models.
m1 = gam(y_binom ~ s(x), family = 'binomial')
m2 = gam(y_binom ~ s(x), weights = w / mean(w), family = 'binomial')
m3 = gam(y_binom ~ s(x), weights = w / sum(w), family = 'binomial')
m4 = gam(y_binom ~ s(x), weights = w * 100, family = 'binomial')

ms = list(m1, m2, m3, m4)

# Different RMSEs.
lapply(X = ms, FUN = function(x) return(sqrt(mean(x$residuals^2))))

# Different predictions, e.g.
plot(predict(m2), predict(m3))


# This does not happen with GLMs.
m1 = glm(y_binom ~ x, family = 'binomial')
m2 = glm(y_binom ~ x, weights = w / mean(w), family = 'binomial')
m3 = glm(y_binom ~ x, weights = w / sum(w), family = 'binomial')
m4 = glm(y_binom ~ x, weights = w * 100, family = 'binomial')

ms = list(m1, m2, m3, m4)

# Same RMSEs (for m2-m4).
lapply(X = ms, FUN = function(x) return(sqrt(mean(x$residuals^2))))

# Same predictions, e.g.
plot(predict(m2), predict(m3))

我認為您看到的差異是因為 model 的 GLM 部分存在平滑困難而不是任何固有問題的問題; 您選擇的權重正在改變對數似然的大小,這會導致返回的模型略有不同。

我很快就會回到那個。 首先,如果你只是用gam()安裝一個普通的或花園的 GLM,“問題”就會消失:

library('mgcv')

# Random data
set.seed(1)
x <- 1:100
y_binom <- cbind(rpois(100, 5 + x/2), rpois(100, 100))
w <- sample(seq_len(100), 100, replace = TRUE)

gam_m <- gam(y_binom ~ x, weights = w / mean(w), family = 'binomial')
glm_m <- glm(y_binom ~ x, weights = w / mean(w), family = 'binomial')

一模一樣的model就裝好了

> logLik(gam_m)
'log Lik.' -295.6122 (df=2)
> logLik(glm_m)
'log Lik.' -295.6122 (df=2)
> coef(gam_m)
(Intercept)           x 
 -2.1698127   0.0174864 
> coef(glm_m)
(Intercept)           x 
 -2.1698127   0.0174864

即使您通過使用不同的權重歸一化來更改對數似然的大小,即使對數+似然不同,您也會得到相同的擬合 model:

gam_other <- gam(y_binom ~ x, weights = w / sum(w), family = 'binomial')
> logLik(gam_other)
'log Lik.' -2.956122 (df=2)
> coef(gam_other)
(Intercept)           x 
 -2.1698127   0.0174864 

glm()的行為在這方面是相同的:

> logLik(glm(y_binom ~ x, weights = w / sum(w), family = 'binomial'))
'log Lik.' -2.956122 (df=2)

# compare with logLik(gam_other)

在優化更邊緣的情況下,這可能會崩潰,這就是gam()正在發生的事情。 使用我的gratia package 我們可以輕松比較上面安裝的兩個 GAM:

# using your GAM m2 and m3 as examples
library(gratia)
comp <- compare_smooths(m2, m3)
draw(comp)

產生

在此處輸入圖像描述

請注意,默認情況下,這些圖中的平滑包括與平滑估計為線性時引入的偏差相關的校正。

如您所見,這兩種配合是不同的; 一種優化懲罰平滑一直回到線性 function,另一種優化到目前為止沒有受到懲罰。 有了更多的數據,在 GLM 上擬合這個 model 所涉及的額外復雜性(在 GAM 中我們必須使用 select 平滑度參數)將被克服,我希望對數似然的變化不會有如此顯着的變化影響。

在這種情況下,關於 GAM 的一些理論開始變得有點松散,人們正在努力糾正或解決這些問題,但通常很難區分線性或輕微非線性的東西在鏈接 function 的規模上。這里真實的 function 在鏈接 function 的規模上略微非線性,但m3無法識別這一點,我認為部分原因是權重主導了似然計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM