Perbedaan kesalahan standar residual antara optim dan glm

16

Saya mencoba mereproduksi dengan optimhasil dari regresi linier sederhana yang dilengkapi dengan glmatau bahkan nlsfungsi R.
Perkiraan parameter adalah sama tetapi estimasi varians residual dan kesalahan standar dari parameter lain tidak sama terutama ketika ukuran sampel rendah. Saya kira ini disebabkan oleh perbedaan dalam cara kesalahan standar residual dihitung antara Maximum Likelihood dan Least square mendekati (membaginya dengan n atau dengan n-k + 1 lihat di bawah dalam contoh).
Saya mengerti dari bacaan saya di web bahwa pengoptimalan bukanlah tugas yang sederhana tetapi saya bertanya-tanya apakah mungkin untuk mereproduksi dengan cara sederhana perkiraan kesalahan standar dari glmsaat menggunakan optim.

Mensimulasikan set data kecil

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) 

Perkirakan dengan optimal

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

Perbandingan dengan glm dan 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

Saya dapat mereproduksi perkiraan kesalahan standar residual yang berbeda seperti ini:

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

Jawaban:

9

Masalahnya adalah bahwa kesalahan standar berasal

σ^2(XX)1

σ^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/(n3+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

Untuk menguraikan lebih lanjut seperti permintaan usεr11852 , log-likelihoodnya adalah

l(β,σ)=n2log(2π)nlogσ12σ2(yXβ)(yXβ)

Xn

ββl(β,σ)=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 

Kita dapat melakukan hal yang sama dengan dekomposisi QR seperti lmhalnya

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

Jadi untuk menjawab

Saya mengerti dari bacaan saya di web bahwa pengoptimalan bukanlah tugas yang sederhana tetapi saya bertanya-tanya apakah mungkin untuk mereproduksi dengan cara sederhana perkiraan kesalahan standar dari glmsaat menggunakan optim.

maka Anda perlu meningkatkan kesalahan standar dalam contoh Gaussian yang Anda gunakan.

Benjamin Christoffersen
sumber
1
+1. Saya tidak 100% bahwa Anda mendapatkannya sepenuhnya benar tetapi ini jelas dalam arah yang benar. Bisakah Anda menjelaskan mengapa Anda mengharapkan faktor itu?
usεr11852 mengatakan Reinstate Monic
Apakah sekarang lebih jelas?
Benjamin Christoffersen
1
Iya. Jawaban yang bagus! (Saya sudah memutarnya)
usεr11852 mengatakan Reinstate Monic
1

optimnnk+1nnk+1sqrt(4.717216^2*4/2) = 6.671151

papgeo
sumber
1
Terima kasih untuk balasan Anda. Saya menyadari bahwa pertanyaan saya tidak cukup jelas (sekarang saya telah mengeditnya). Saya tidak hanya ingin mereproduksi perhitungan kesalahan standar residual tetapi juga kesalahan standar parameter ...
Gilles
@Gilles Saya tidak tahu cara mereproduksi kesalahan standar. Perbedaannya adalah karena: 1. glm menggunakan matriks informasi Fisher, sementara mengoptimalkan hessian, dan 2. glm menganggap ini sebagai masalah 2 parameter (menemukan b0 dan b1), sementara mengoptimalkan masalah 3 parameter (b0, b1 dan sigma2) . Saya tidak yakin apakah perbedaan-perbedaan ini dapat dijembatani.
papgeo