R: ailesi ile glm fonksiyonu = “binom” ve “ağırlık” özellikleri


14

Ben ağırlığın aile = "binom" ile glm nasıl çalıştığı ile çok karışık. Anladığım kadarıyla glm'nin family = "binomial" ile olasılığı şu şekilde belirtilir: select {ny}} p ^ {ny} (1-p) ^ {n (1-y )} = \ exp \ left (n \ sol [y \ log \ frac {p} {1-p} - \ left (- \ log (1-p) \ right) \ right] + \ log {n \ seçin ny} \ right)

f(y)=(nny)pny(1p)n(1y)=exp(n[ylogp1p(log(1p))]+log(nny))
burada y "gözlemlenen başarının oranı" ve n bilinen sayıda deneme sayısıdır.

Benim anlayış, başarı olasılığı p bazı lineer katsayıları ile parametrelenmişse β olarak p=p(β) ve aile = "binom" ile glm fonksiyonu için arama:

argmaxβilogf(yi).
Daha sonra bu optimizasyon problemi basitleştirilebilir:

argmaxβilogf(yi)=argmaxβini[yilogp(β)1p(β)(log(1p(β)))]+log(niniyi)=argmaxβini[yilogp(β)1p(β)(log(1p(β)))]

Bu nedenle , tüm i = 1, ..., N için bazı sabit c için n_i ^ * = n_ic'ye izin verirsek , şu şekilde de doğru olmalıdır: \ textrm {arg} \ max _ {\ beta} \ sum_i \ log f (y_i) = \ textrm {arg} \ max _ {\ beta} \ sum_i n ^ * _ i \ sol [y_i \ log \ frac {p (\ beta)} {1-p (\ beta)} - \ left (- \ log (1-p (\ beta)) \ right) \ right] \\ Bundan, n_i deneme sayısının ölçeklendirilmesini düşündümni=nici=1,...,Nc
argmaxβilogf(yi)=argmaxβini[yilogp(β)1p(β)(log(1p(β)))]
nibir sabit ile y_i başarı oranı göz önüne alındığında \ beta maksimum olasılık tahminlerini ETKİLEMEZβyi .

Glm yardım dosyası şöyle diyor:

 "For a binomial GLM prior weights are used to give the number of trials 
  when the response is the proportion of successes" 

Bu nedenle , yanıtın başarı oranı göz önüne alındığında, ağırlığın ölçeklendirilmesinin tahmini \ beta'yı etkilememesini bekledim β. Ancak, aşağıdaki iki kod farklı katsayı değerleri döndürür:

 Y <- c(1,0,0,0) ## proportion of observed success
 w <- 1:length(Y) ## weight= the number of trials
 glm(Y~1,weights=w,family=binomial)

Bu şu sonuçları verir:

 Call:  glm(formula = Y ~ 1, family = "binomial", weights = w)

 Coefficients:
 (Intercept)  
      -2.197     

tüm ağırlıkları 1000 ile çarparsam, tahmin edilen katsayılar farklıdır:

 glm(Y~1,weights=w*1000,family=binomial)

 Call:  glm(formula = Y ~ 1, family = binomial, weights = w * 1000)

 Coefficients:
 (Intercept)  
    -3.153e+15  

Ağırlıklardaki bazı orta ölçekli ölçeklemelerde bile bunun gibi birçok örnek gördüm. Burada neler oluyor?


3
Değeri ne olursa olsun , weightsargüman glm.fitfonksiyonun içinde iki yerde ( glm.R'de ) sona erer , bu da R fonksiyonu: R: 1'deki sapma kalıntılarında, C fonksiyonu aracılığıyla binomial_dev_resids( family.c ). ve 2) IWLS'de adım adım Cdqrls( lm.c cinsinden ). Mantık izlemede daha fazla yardım için yeterli C bilmiyorum
shadowtalker

3
Yanıtları buradan kontrol edin .
Stat

@ ssdecontrol Bana verdiğin linkte glm.fit ile okuyorum ama glm.fit içinde "binomial_dev_resids" işlevinin nerede çağrıldığını bulamıyorum. İşaret ederseniz sorun olur mu?
FairyOnIce

@ssdecontrol Oh, üzgünüm anladığımı düşünüyorum. Her "aile" bir listedir ve öğelerden biri "dev.resids" tir. R konsolunda binom yazdığımda binom nesnesinin tanımını görüyorum ve bir satırı var: dev.resids <- function (y, mu, wt) .Call (C_binomial_dev_resids, y, mu, wt)
FairyOnIce

Yanıtlar:


4

Örneğin yalnızca R'de yuvarlama hatasına neden oluyor. Büyük ağırlıklar iyi performans göstermiyor glm. w100 gibi neredeyse daha küçük bir sayı ile ölçeklendirmenin ölçeklendirilmemişle aynı tahminlere yol açtığı doğrudur w.

Ağırlıklar bağımsız değişkenleriyle daha güvenilir davranışlar istiyorsanız svyglm, surveypaketten işlevi kullanmayı deneyin .

Buraya bakın:

    > svyglm(Y~1, design=svydesign(ids=~1, weights=~w, data=data.frame(w=w*1000, Y=Y)), family=binomial)
Independent Sampling design (with replacement)
svydesign(ids = ~1, weights = ~w, data = data.frame(w = w * 1000, 
    Y = Y))

Call:  svyglm(formula = Y ~ 1, design = svydesign(ids = ~1, weights = ~w2, 
    data = data.frame(w2 = w * 1000, Y = Y)), family = binomial)

Coefficients:
(Intercept)  
     -2.197  

Degrees of Freedom: 3 Total (i.e. Null);  3 Residual
Null Deviance:      2.601 
Residual Deviance: 2.601    AIC: 2.843

1

Ben kullanılan başlangıç değerlerine aşağı gelir düşünüyorum glm.fitgelen family$initializeyöntem divergere yapar. Bildiğim kadarıyla glm.fit, sorunu bir QR ayrışması oluşturarak çözün, burada , tasarım matrisidir ve , burada açıklanan girişlerin kare köklerine sahip bir köşegendir . Yani, Newton-Raphson yöntemini kullanır.WXXW

İlgili $intializekod:

if (NCOL(y) == 1) {
    if (is.factor(y)) 
        y <- y != levels(y)[1L]
    n <- rep.int(1, nobs)
    y[weights == 0] <- 0
    if (any(y < 0 | y > 1)) 
        stop("y values must be 0 <= y <= 1")
    mustart <- (weights * y + 0.5)/(weights + 1)
    m <- weights * y
    if (any(abs(m - round(m)) > 0.001)) 
        warning("non-integer #successes in a binomial glm!")
}

İşte glm.fitbenim açımdan basitleştirilmiş bir versiyonu

> #####
> # setup
> y <- matrix(c(1,0,0,0), ncol = 1)
> weights <- 1:nrow(y) * 1000
> nobs <- length(y)
> family <- binomial()
> X <- matrix(rep(1, nobs), ncol = 1) # design matrix used later
> 
> # set mu start as with family$initialize
> if (NCOL(y) == 1) {
+   n <- rep.int(1, nobs)
+   y[weights == 0] <- 0
+   mustart <- (weights * y + 0.5)/(weights + 1)
+   m <- weights * y
+   if (any(abs(m - round(m)) > 0.001)) 
+     warning("non-integer #successes in a binomial glm!")
+ }
> 
> mustart # starting value
             [,1]
[1,] 0.9995004995
[2,] 0.0002498751
[3,] 0.0001666111
[4,] 0.0001249688
> (eta <- family$linkfun(mustart))
          [,1]
[1,]  7.601402
[2,] -8.294300
[3,] -8.699681
[4,] -8.987322
> 
> #####
> # Start loop to fit
> mu <- family$linkinv(eta)
> mu_eta <- family$mu.eta(eta)
> z <- drop(eta + (y - mu) / mu_eta)
> w <- drop(sqrt(weights * mu_eta^2 / family$variance(mu = mu)))
> 
> # code is simpler here as (X^T W X) is a scalar
> X_w <- X * w
> (.coef <- drop(crossprod(X_w)^-1 * ((w * z) %*% X_w)))
[1] -5.098297
> (eta <- .coef * X)
          [,1]
[1,] -5.098297
[2,] -5.098297
[3,] -5.098297
[4,] -5.098297
> 
> # repeat a few times from "start loop to fit"

Newton-Raphson yönteminin ayrıştığını görmek için son kısmı iki kez daha tekrarlayabiliriz:

> #####
> # Start loop to fit
> mu <- family$linkinv(eta)
> mu_eta <- family$mu.eta(eta)
> z <- drop(eta + (y - mu) / mu_eta)
> w <- drop(sqrt(weights * mu_eta^2 / family$variance(mu = mu)))
> 
> # code is simpler here as (X^T W X) is a scalar
> X_w <- X * w
> (.coef <- drop(crossprod(X_w)^-1 * ((w * z) %*% X_w)))
[1] 10.47049
> (eta <- .coef * X)
         [,1]
[1,] 10.47049
[2,] 10.47049
[3,] 10.47049
[4,] 10.47049
> 
> 
> #####
> # Start loop to fit
> mu <- family$linkinv(eta)
> mu_eta <- family$mu.eta(eta)
> z <- drop(eta + (y - mu) / mu_eta)
> w <- drop(sqrt(weights * mu_eta^2 / family$variance(mu = mu)))
> 
> # code is simpler here as (X^T W X) is a scalar
> X_w <- X * w
> (.coef <- drop(crossprod(X_w)^-1 * ((w * z) %*% X_w)))
[1] -31723.76
> (eta <- .coef * X)
          [,1]
[1,] -31723.76
[2,] -31723.76
[3,] -31723.76
[4,] -31723.76

Eğer başlarsanız weights <- 1:nrow(y)ya da söylerseniz bu olmaz weights <- 1:nrow(y) * 100.

mustartArgümanı ayarlayarak sapmalardan kaçınabileceğinize dikkat edin . Örneğin,

> glm(Y ~ 1,weights = w * 1000, family = binomial, mustart = rep(0.5, 4))

Call:  glm(formula = Y ~ 1, family = binomial, weights = w * 1000, mustart = rep(0.5, 
    4))

Coefficients:
(Intercept)  
     -2.197  

Degrees of Freedom: 3 Total (i.e. Null);  3 Residual
Null Deviance:      6502 
Residual Deviance: 6502     AIC: 6504

Bence ağırlıklar, başlatılacak argümanlardan daha fazlasını etkiler. Lojistik regresyon ile Newton Raphson, veri ayrılmadığında var olan ve benzersiz olan maksimum olasılığı tahmin eder. Optimize ediciye farklı başlangıç ​​değerleri sağlamak farklı değerlere ulaşmaz, ancak oraya ulaşması belki daha uzun sürer.
AdamO

Msgstr "Optimizer'a farklı başlangıç ​​değerleri sağlamak farklı değerlere ulaşmayacak ..." . Newton yöntemi ayrışmaz ve ilk değerleri ayarladığım son örnekte benzersiz maksimum değeri bulur ( mustart bağımsız değişkeni sağladığım örneğe bakın ). Kötü başlangıç ​​tahmini ile ilgili bir konu gibi görünüyor .
Benjamin Christoffersen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.