R: hàm glm với gia đình = Đặc điểm kỹ thuật của bin bin


13

Tôi rất bối rối với cách cân nặng hoạt động trong glm với gia đình = "nhị thức". Theo hiểu biết của tôi, khả năng của glm với gia đình = "nhị thức" được chỉ định như sau: trong đó y là "tỷ lệ thành công quan sát được" và n là số lượng thử nghiệm đã biết.yn

f(y)= =(nny)pny(1-p)n(1-y)= =điểm kinh nghiệm(n[yđăng nhậpp1-p-(-đăng nhập(1-p))]+đăng nhập(nny))
yn

Theo hiểu biết của tôi, xác suất thành công p được tham số hóa với một số hệ số tuyến tính βp= =p(β) và hàm glm với gia đình = "nhị thức" tìm kiếm:

tranh luậntối đaβΣTôiđăng nhậpf(yTôi).
Sau đó, vấn đề tối ưu hóa này có thể được đơn giản hóa như:

tranh luậntối đaβΣTôiđăng nhậpf(yTôi)= =tranh luậntối đaβΣTôinTôi[yTôiđăng nhậpp(β)1-p(β)-(-đăng nhập(1-p(β)))]+đăng nhập(nTôinTôiyTôi)= =tranh luậntối đaβΣTôinTôi[yTôiđăng nhậpp(β)1-p(β)-(-đăng nhập(1-p(β)))]

Vì vậy, nếu chúng ta để nTôi*= =nTôic cho tất cả Tôi= =1,...,N cho một số hằng số c , thì nó cũng phải đúng:
argmaxβilogf(yi)=argmaxβini[yilogp(β)1p(β)(log(1p(β)))]
Từ đây, tôi nghĩ rằng Thu nhỏ số lượng thử nghiệm nivới hằng số KHÔNG ảnh hưởng đến ước tính khả năng tối đa của β với tỷ lệ thành công yi .

Các tập tin trợ giúp của glm nói:

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

Do đó, tôi cho rằng việc tăng tỷ lệ trọng lượng sẽ không ảnh hưởng đến ước tính β với tỷ lệ thành công là phản hồi. Tuy nhiên, hai mã sau đây trả về các giá trị hệ số khác nhau:

 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)

Sản lượng này:

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

 Coefficients:
 (Intercept)  
      -2.197     

trong khi nếu tôi nhân tất cả các trọng số với 1000, thì các hệ số ước tính sẽ khác nhau:

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

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

 Coefficients:
 (Intercept)  
    -3.153e+15  

Tôi đã thấy nhiều ví dụ khác như thế này ngay cả với một tỷ lệ vừa phải về trọng lượng. Chuyện gì đang xảy ra ở đây?


3
Đối với giá trị của nó, weightsđối số kết thúc ở hai vị trí bên trong glm.fithàm (trong glm.R ), đó là những gì hoạt động trong R: 1) trong phần dư lệch, bằng hàm C binomial_dev_resids(trong gia đình.c ) và 2) trong IWLS từng bước Cdqrls(tính bằng lm.c ). Tôi không biết đủ C để giúp đỡ nhiều hơn trong việc truy tìm logic
Shadowtalker

3
Kiểm tra các câu trả lời ở đây .
Stat

@ssdecontrol Tôi đang đọc qua glm.fit trong liên kết mà bạn đã cho tôi nhưng tôi không thể tìm thấy hàm C "binomial_dev_resids" được gọi trong glm.fit. Bạn có phiền nếu bạn chỉ ra nó?
FairyOnIce 19/03/2015

@ssdecontrol ơi, xin lỗi tôi nghĩ tôi hiểu. Mỗi "gia đình" là một danh sách và một trong các yếu tố là "dev.resids". Khi tôi nhập nhị thức trong bảng điều khiển R, tôi thấy định nghĩa của đối tượng nhị thức và nó có một dòng: dev.resids <- function (y, mu, wt) .Call (C_binomial_dev_resids, y, mu, wt)
FairyOnIce

Câu trả lời:


3

Ví dụ của bạn chỉ gây ra lỗi làm tròn trong R. Trọng lượng lớn không hoạt động tốt glm. Đúng là tỷ lệ wtheo hầu như bất kỳ số nhỏ hơn nào, như 100, dẫn đến các ước tính tương tự như tỷ lệ không được tính w.

Nếu bạn muốn hành vi đáng tin cậy hơn với các đối số trọng số, hãy thử sử dụng svyglmhàm từ surveygói.

Xem tại đây:

    > 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

Tôi nghĩ rằng nó đi xuống các giá trị ban đầu được sử dụng glm.fittừ family$initializeđó làm cho phương thức phân kỳ. Theo tôi biết, glm.fitgiải quyết vấn đề bằng cách hình thành phân tách QR của trong đó là ma trận thiết kế và là một đường chéo có căn bậc hai của các mục như được mô tả ở đây . Đó là, sử dụng phương pháp Newton-Raphson.WXXW

$intializeMã liên quan là:

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!")
}

Đây là một phiên bản đơn giản hóa glm.fitcho thấy quan điểm của tôi

> #####
> # 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"

Chúng ta có thể lặp lại phần cuối hai lần nữa để thấy rằng phương pháp Newton-Raphson phân kỳ:

> #####
> # 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

Điều này không xảy ra nếu bạn bắt đầu với weights <- 1:nrow(y)hoặc nói weights <- 1:nrow(y) * 100.

Lưu ý rằng bạn có thể tránh phân kỳ bằng cách đặt mustartđối số. Ví dụ làm

> 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

Tôi nghĩ rằng trọng số ảnh hưởng nhiều hơn các đối số để khởi tạo. Với hồi quy logistic, Newton Raphson ước tính khả năng tối đa tồn tại và là duy nhất khi dữ liệu không bị tách rời. Việc cung cấp các giá trị bắt đầu khác nhau cho trình tối ưu hóa sẽ không đến các giá trị khác nhau, nhưng có lẽ sẽ mất nhiều thời gian hơn để đạt được điều đó.
AdamO

"Cung cấp các giá trị bắt đầu khác nhau cho trình tối ưu hóa sẽ không đến các giá trị khác nhau ..." . Chà, phương thức Newton không phân kỳ và tìm cực đại duy nhất trong ví dụ cuối cùng nơi tôi đặt các giá trị ban đầu (xem ví dụ nơi tôi cung cấp mustart đối số). Có vẻ như một vấn đề liên quan đến ước tính ban đầu của người nghèo .
Benjamin Christoffersen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.