Optim ve glm arasında artık standart hata farkı


16

Birlikte yeniden oluşturmaya çalışın optimtakılmış basit doğrusal regresyon sonuçlarının glmhatta nlsR fonksiyonları.
Parametre tahminleri aynıdır, ancak artık varyans tahmini ve diğer parametrelerin standart hataları, özellikle numune boyutu düşük olduğunda aynı değildir. Bunun, maksimum standart olabilirlik ve en küçük kare yaklaşımları arasında kalan standart hatanın hesaplanma biçimindeki farklılıklardan kaynaklandığını düşünüyorum (n'ye veya n-k + 1'e bölünme, bkz. Örnekteki aşağıdaki).
Web'deki okumalarımdan optimizasyonun basit bir görev olmadığını anlıyorum, ancak standart hatanın glmkullanırken tahmin ettiği basit bir şekilde çoğalmanın mümkün olup olmadığını merak ediyordum optim.

Küçük bir veri kümesini simüle et

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) 

Optim ile tahmin edin

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

Glm ve nls ile karşılaştırma

> 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

Farklı kalıntı standart hata tahminlerini şöyle çoğaltabilirim:

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

Yanıtlar:


9

Sorunlar standart hataların

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

Us85r11852 istekleri olarak daha fazla ayrıntıya girmek için, günlük olasılığı

l(β,σ)=-n2günlük(2π)-ngünlükσ-12σ2(y-Xβ)(y-Xβ)

Xn

-ββl(β,σ)=1σ2XX

Şimdi MLE'yi veya dengesiz tahmincisini ekleyebilirizσ

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 

Aynı şeyi bir QR ayrışması ile lmde yapabiliriz

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

Yani cevaplamak için

Web'deki okumalarımdan optimizasyonun basit bir görev olmadığını anlıyorum, ancak standart hatanın glmkullanırken tahmin ettiği basit bir şekilde çoğalmanın mümkün olup olmadığını merak ediyordum optim.

kullandığınız Gauss örneğindeki standart hataları ölçeklendirmeniz gerekir.


1
+1. Tamamen doğru yaptığınızı% 100 değilim ama bu kesinlikle doğru yönde. Neden bu faktörü beklediğinizi açıklayabilir misiniz?
usεr11852 diyor Reinstate Monic

Şimdi daha açık mı?
Benjamin Christoffersen

1
Evet. İyi cevap! (Bunu zaten iptal ettim)
usεr11852 diyor ki Reinstate Monic

1

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


1
Cevabın için teşekkürler. Sorumun yeterince açık olmadığının farkındayım (şimdi düzenledim). Sadece artık standart hata hesaplamasını değil, aynı zamanda standart hata parametrelerini de üretmek istemiyorum ...
Gilles

@Gilles Standart hataların nasıl çoğaltılacağını bilmiyorum. Farklar şunlardır: 1. glm, Fisher bilgi matrisini kullanır, kendir ve optim'i kullanır ve 2. glm bunu 2 parametreli bir sorun olarak görür (b0 ve b1'i bul) . Bu farklılıkların köprülenip birleştirilemeyeceğinden emin değilim.
papgeo
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.