Chênh lệch sai số chuẩn giữa tối ưu và glm


16

Tôi cố gắng tái tạo với optimcác kết quả từ hồi quy tuyến tính đơn giản được trang bị glmhoặc thậm chí các nlshàm R.
Các ước tính tham số là như nhau nhưng ước tính phương sai dư và sai số chuẩn của các tham số khác không giống nhau đặc biệt khi kích thước mẫu thấp. Tôi cho rằng đây là sự khác biệt do cách tính sai số chuẩn còn lại giữa các phương pháp bình phương tối đa và tối thiểu (chia cho n hoặc cho n - k + 1 xem dưới đây trong ví dụ).
Tôi hiểu từ các bài đọc của tôi trên web rằng tối ưu hóa không phải là một nhiệm vụ đơn giản nhưng tôi đã tự hỏi liệu có thể tái tạo một cách đơn giản các ước tính lỗi tiêu chuẩn glmtrong khi sử dụng optim.

Mô phỏng một tập dữ liệu nhỏ

set.seed(1)
n = 4 # very small sample size !
b0 <- 5
b1 <- 2
sigma <- 5
x <- runif(n, 1, 100)
y =  b0 + b1*x + rnorm(n, 0, sigma) 

Ước tính với tối ưu

negLL <- function(beta, y, x) {
    b0 <- beta[1]
    b1 <- beta[2]
    sigma <- beta[3]
    yhat <- b0 + b1*x
    likelihood <- dnorm(y, yhat, sigma)
    return(-sum(log(likelihood)))
}

res <- optim(starting.values, negLL, y = y, x = x, hessian=TRUE)
estimates <- res$par     # Parameters estimates
se <- sqrt(diag(solve(res$hessian))) # Standard errors of the estimates
cbind(estimates,se)


    > cbind(estimates,se)
      estimates         se
b0     9.016513 5.70999880
b1     1.931119 0.09731153
sigma  4.717216 1.66753138

So sánh với glm và nls

> m <- glm(y ~ x)
> summary(m)$coefficients
            Estimate Std. Error   t value    Pr(>|t|)
(Intercept) 9.016113  8.0759837  1.116411 0.380380963
x           1.931130  0.1376334 14.030973 0.005041162
> sqrt(summary(m)$dispersion) # residuals standard error
[1] 6.671833
> 
> summary(nls( y ~ b0 + b1*x, start=list(b0 = 5, b1= 2)))

Formula: y ~ b0 + b1 * x

Parameters:
   Estimate Std. Error t value Pr(>|t|)   
b0   9.0161     8.0760   1.116  0.38038   
b1   1.9311     0.1376  14.031  0.00504 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 6.672 on 2 degrees of freedom

Tôi có thể sao chép các ước tính lỗi tiêu chuẩn còn lại khác nhau như thế này:

> # optim / Maximum Likelihood estimate
> sqrt(sum(resid(m)^2)/n)
[1] 4.717698
> 
> # Least squares estimate (glm and nls estimates)
> k <- 3 # number of parameters
> sqrt(sum(resid(m)^2)/(n-k+1))
[1] 6.671833

Câu trả lời:


9

Vấn đề là các lỗi tiêu chuẩn đến từ

σ^2(XX)-1

trong đó là công cụ ước tính không thiên vị và không phải là MLE. Xemσ^2summary.lm

summary.lm
#R function (object, correlation = FALSE, symbolic.cor = FALSE, 
#R     ...) 
#R {
#R    z <- object
#R    p <- z$rank
#R    rdf <- z$df.residual
#R    ...
#R    Qr <- qr.lm(object) 
#R    ... 
#R    r <- z$residuals
#R    f <- z$fitted.values
#R    w <- z$weights
#R    if (is.null(w)) {
#R         mss <- if (attr(z$terms, "intercept")) 
#R             sum((f - mean(f))^2)
#R         else sum(f^2)
#R         rss <- sum(r^2)
#R    }
#R    ...
#R    resvar <- rss/rdf
#R    ...
#R    R <- chol2inv(Qr$qr[p1, p1, drop = FALSE])
#R    se <- sqrt(diag(R) * resvar)
#R    ...

(β0,β1)σ^2(β0,β1,σ)σn/(n-3+1)

set.seed(1)
n = 4 # very small sample size !
b0 <- 5
b1 <- 2
sigma <- 5
x <- runif(n, 1, 100)
y =  b0 + b1*x + rnorm(n, 0, sigma) 

negLL <- function(beta, y, x) {
  b0 <- beta[1]
  b1 <- beta[2]
  sigma <- beta[3]
  yhat <- b0 + b1*x
  return(-sum(dnorm(y, yhat, sigma, log = TRUE)))
}

res <- optim(c(0, 0, 1), negLL, y = y, x = x, hessian=TRUE)
estimates <- res$par     # Parameters estimates
(se <- sqrt(diag(solve(res$hessian))))
#R [1] 5.690 0.097 1.653
k <- 3
se * sqrt(n / (n-k+1))
#R [1] 8.047 0.137 2.338

Để giải thích chi tiết hơn các yêu cầu usr11852 , khả năng đăng nhập là

tôi(β,σ)= =-n2đăng nhập(2π)-nđăng nhậpσ-12σ2(y-Xβ)(y-Xβ)

Xn

-ββtôi(β,σ)= =1σ2XX

σ

m <- lm(y ~ x)
X <- cbind(1, x)
sqrt(sum(resid(m)^2)/n       * diag(solve(crossprod(X))))
#R                     x 
#R 5.71058285 0.09732149
k <- 3
sqrt(sum(resid(m)^2)/(n-k+1) * diag(solve(crossprod(X))))
#R                   x 
#R 8.0759837 0.1376334 

Chúng ta có thể làm tương tự với một phân hủy QR như lmkhông

obj <- qr(X)
sqrt(sum(resid(m)^2)/(n-k+1) * diag(chol2inv(obj$qr)))
#R [1] 8.0759837 0.1376334

Vì vậy, để trả lời

Tôi hiểu từ các bài đọc của tôi trên web rằng tối ưu hóa không phải là một nhiệm vụ đơn giản nhưng tôi đã tự hỏi liệu có thể tái tạo một cách đơn giản các ước tính lỗi tiêu chuẩn glmtrong khi sử dụng optim.

sau đó bạn cần mở rộng các lỗi tiêu chuẩn trong ví dụ Gaussian bạn sử dụng.


1
+1. Tôi không phải là 100% rằng bạn đã hoàn toàn chính xác nhưng điều này chắc chắn là đúng hướng. Bạn có thể giải thích tại sao bạn mong đợi yếu tố đó?
usεr11852 nói Phục hồi Monic

Bây giờ thì rõ hơn chưa?
Benjamin Christoffersen

1
Đúng. Câu trả lời tốt! (Tôi đã nâng cấp nó rồi)
usεr11852 nói Phục hồi Monic

1

optimnn-k+1nn-k+1sqrt(4.717216^2*4/2) = 6.671151


1
Cảm ơn vì đã trả lời. Tôi nhận ra rằng câu hỏi của tôi không đủ rõ ràng (hiện tôi đã chỉnh sửa nó). Tôi không chỉ muốn tạo lại tính toán lỗi tiêu chuẩn còn lại mà cả các lỗi tiêu chuẩn tham số ...
Gilles

@Gilles Tôi không biết cách tái tạo các lỗi tiêu chuẩn. Sự khác biệt là do: 1. glm sử dụng ma trận thông tin Fisher, trong khi tối ưu hóa hessian và 2. glm coi đây là vấn đề 2 tham số (tìm b0 và b1), trong khi tối ưu hóa vấn đề 3 tham số (b0, b1 và sigma2) . Tôi không chắc chắn nếu những khác biệt này có thể được bắc cầu.
papgeo
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.